s3: Move the global variable Protocol to struct smbd_server_connection
authorVolker Lendecke <vl@samba.org>
Sat, 21 Nov 2009 18:57:41 +0000 (19:57 +0100)
committerVolker Lendecke <vl@samba.org>
Sat, 21 Nov 2009 19:49:17 +0000 (20:49 +0100)
19 files changed:
source3/client/client.c
source3/client/clitar.c
source3/include/proto.h
source3/include/smb.h
source3/lib/util.c
source3/modules/vfs_preopen.c
source3/smbd/dir.c
source3/smbd/dosmode.c
source3/smbd/filename.c
source3/smbd/globals.c
source3/smbd/globals.h
source3/smbd/negprot.c
source3/smbd/nttrans.c
source3/smbd/open.c
source3/smbd/process.c
source3/smbd/reply.c
source3/smbd/sesssetup.c
source3/smbd/smb2_negprot.c
source3/smbd/trans2.c

index 7cbaa81d5290811f191422e0b2aeb693f49c0ad0..19efa03d3ae6046f333760342e1c412573446b03 100644 (file)
@@ -473,7 +473,7 @@ static bool do_this_one(file_info *finfo)
 
        if (*client_get_fileselection() &&
            !mask_match(finfo->name, client_get_fileselection(),
-                       get_Protocol(), false)) {
+                       PROTOCOL_NONE, false)) {
                DEBUG(3,("mask_match %s failed\n", finfo->name));
                return false;
        }
index 4cbe69f649245e2cdcc25147be6b0010d7c98592..7a956f9e560ec7ac24eb4fdbeb8e02b7d7066d90 100644 (file)
@@ -829,7 +829,7 @@ static void do_tar(file_info *finfo, const char *dir)
                if ((!tar_re_search && clipfind(cliplist, clipn, exclaim)) ||
                    (tar_re_search
                     && mask_match_list(exclaim, cliplist, clipn,
-                                       get_Protocol(), True))) {
+                                       PROTOCOL_NONE, True))) {
                        DEBUG(3,("Skipping file %s\n", exclaim));
                        TALLOC_FREE(exclaim);
                        return;
@@ -1214,7 +1214,7 @@ static void do_tarput(void)
                skip = clipn && ((!tar_re_search && clipfind(cliplist, clipn, finfo.name) ^ tar_excl) ||
                                 (tar_re_search
                                  && mask_match_list(finfo.name, cliplist,
-                                                    clipn, get_Protocol(),
+                                                    clipn, PROTOCOL_NONE,
                                                     True)));
 
                DEBUG(5, ("Skip = %i, cliplist=%s, file=%s\n", skip, (cliplist?cliplist[0]:NULL), finfo.name));
index b28e5f51e43aaa89afba6fa4b553f0eb6bb075f1..8cf4769d067a020c290db75eff894c4796aa02a8 100644 (file)
@@ -1075,8 +1075,8 @@ struct passwd *Get_Pwnam_alloc(TALLOC_CTX *mem_ctx, const char *user);
 
 /* The following definitions come from lib/util.c  */
 
-enum protocol_types get_Protocol(void);
-void set_Protocol(enum protocol_types  p);
+enum protocol_types get_Protocol(const struct smbd_server_connection *c);
+void set_Protocol(struct smbd_server_connection *c, enum protocol_types p);
 bool all_zero(const uint8_t *ptr, size_t size);
 bool set_global_myname(const char *myname);
 const char *global_myname(void);
index a3acb7c415da2055d1409b63944b92756b39dce2..94d2aa25709f8bb5de85c5198f66271e8f556966 100644 (file)
@@ -652,6 +652,7 @@ struct smb_request {
        size_t unread_bytes;
        bool encrypted;
        connection_struct *conn;
+       struct smbd_server_connection *sconn;
        struct smb_perfcount_data pcd;
 
        /*
index 933b78769776c5da537ff08eb94fe0135e402d82..d194c3ae4b1ca0a57f1c11eaa7308fbfdc852dd2 100644 (file)
@@ -55,18 +55,6 @@ extern unsigned int global_clobber_region_line;
 #endif /* WITH_NISPLUS_HOME */
 #endif /* HAVE_NETGROUP && WITH_AUTOMOUNT */
 
-static enum protocol_types Protocol = PROTOCOL_COREPLUS;
-
-enum protocol_types get_Protocol(void)
-{
-       return Protocol;
-}
-
-void set_Protocol(enum protocol_types  p)
-{
-       Protocol = p;
-}
-
 static enum remote_arch_types ra_type = RA_UNKNOWN;
 
 /***********************************************************************
index d91a03122718ca93843ba944ad0702968ac6e92a..1ecbc3aa8a8a25ce643f92aecb393376750f270f 100644 (file)
@@ -396,7 +396,7 @@ static int preopen_open(vfs_handle_struct *handle,
        }
 
        if (!is_in_path(smb_fname->base_name, state->preopen_names,
-                       get_Protocol(), true)) {
+                       get_Protocol(handle->conn->sconn), true)) {
                DEBUG(10, ("%s does not match the preopen:names list\n",
                           smb_fname_str_dbg(smb_fname)));
                return res;
index 137048d4d45805271718d0c5b66f6b59dac04d71..25ca5e51b4b2e98a7ac69a1f9c830beaa6c9b9d8 100644 (file)
@@ -1215,7 +1215,8 @@ bool is_visible_file(connection_struct *conn, const char *dir_path,
        }
 
        /* If it's a vetoed file, pretend it doesn't even exist */
-       if (use_veto && is_in_path(name, conn->veto_list, get_Protocol(),
+       if (use_veto && is_in_path(name, conn->veto_list,
+                                  get_Protocol(conn->sconn),
                                   conn->case_sensitive)) {
                DEBUG(10,("is_visible_file: file %s is vetoed.\n", name ));
                return False;
index 928d48c3513a89250a552db68592511d6b5138d7..baf235d3fe63685868a1d44a4dfac43657513c93 100644 (file)
@@ -455,12 +455,13 @@ uint32 dos_mode_msdfs(connection_struct *conn,
        /* Optimization : Only call is_hidden_path if it's not already
           hidden. */
        if (!(result & aHIDDEN) &&
-           is_in_path(smb_fname->base_name, conn->hide_list, get_Protocol(),
+           is_in_path(smb_fname->base_name, conn->hide_list,
+                      get_Protocol(conn->sconn),
                       conn->case_sensitive)) {
                result |= aHIDDEN;
        }
 
-       if (get_Protocol() <= PROTOCOL_LANMAN2) {
+       if (get_Protocol(conn->sconn) <= PROTOCOL_LANMAN2) {
                DEBUG(10,("dos_mode_msdfs : filtering result 0x%x\n",
                        (unsigned int)result ));
                result &= 0xff;
@@ -642,12 +643,13 @@ uint32 dos_mode(connection_struct *conn, struct smb_filename *smb_fname)
        /* Optimization : Only call is_hidden_path if it's not already
           hidden. */
        if (!(result & aHIDDEN) &&
-           is_in_path(smb_fname->base_name, conn->hide_list, get_Protocol(),
+           is_in_path(smb_fname->base_name, conn->hide_list,
+                      get_Protocol(conn->sconn),
                       conn->case_sensitive)) {
                result |= aHIDDEN;
        }
 
-       if (get_Protocol() <= PROTOCOL_LANMAN2) {
+       if (get_Protocol(conn->sconn) <= PROTOCOL_LANMAN2) {
                DEBUG(10,("dos_mode : filtering result 0x%x\n",
                        (unsigned int)result ));
                result &= 0xff;
index 719ab6a3955abeba4e1fd7a1127501db92bb6c8e..dd237f1a80f76a581f6534492573f5f9d4c5cbac 100644 (file)
@@ -780,7 +780,7 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx,
 
 NTSTATUS check_name(connection_struct *conn, const char *name)
 {
-       if (is_in_path(name, conn->veto_list, get_Protocol(),
+       if (is_in_path(name, conn->veto_list, get_Protocol(conn->sconn),
                       conn->case_sensitive)) {
                /* Is it not dot or dot dot. */
                if (!((name[0] == '.') && (!name[1] ||
index 68fa795ba2ac7663a321ba01f219c06a8cc701da..f631bebc06c2f61c038dd2bfcb49523189ad979d 100644 (file)
@@ -155,3 +155,13 @@ void smbd_init_globals(void)
                exit_server("failed to create smbd_server_connection");
        }
 }
+
+enum protocol_types get_Protocol(const struct smbd_server_connection *c)
+{
+       return c->smb1.negprot.protocol;
+}
+
+void set_Protocol(struct smbd_server_connection *c, enum protocol_types p)
+{
+       c->smb1.negprot.protocol = p;
+}
index 0db61f87a3d5ad1eedcab6591553f31eabf4d51c..1017ff100689ddff352e33f5e91a8775dbde95f6 100644 (file)
@@ -446,6 +446,7 @@ struct smbd_server_connection {
                         * Can be modified by the max xmit parameter.
                         */
                        int max_recv;
+                       enum protocol_types protocol;
                } negprot;
 
                struct {
index 81d29d90f97f5a106770dec0b84cd752845beccb..8b1355ceac89a89c22492fd087565740ce1b6b3a 100644 (file)
@@ -60,7 +60,7 @@ static void reply_corep(struct smb_request *req, uint16 choice)
        reply_outbuf(req, 1, 0);
        SSVAL(req->outbuf, smb_vwv0, choice);
 
-       set_Protocol(PROTOCOL_CORE);
+       set_Protocol(req->sconn, PROTOCOL_CORE);
 }
 
 /****************************************************************************
@@ -80,7 +80,7 @@ static void reply_coreplus(struct smb_request *req, uint16 choice)
        SCVAL(req->outbuf,smb_flg,FLAG_REPLY|FLAG_SUPPORT_LOCKREAD);
        SSVAL(req->outbuf,smb_vwv1,0x1); /* user level security, don't
                                          * encrypt */
-       set_Protocol(PROTOCOL_COREPLUS);
+       set_Protocol(req->sconn, PROTOCOL_COREPLUS);
 }
 
 /****************************************************************************
@@ -113,7 +113,7 @@ static void reply_lanman1(struct smb_request *req, uint16 choice)
                SSVAL(req->outbuf,smb_vwv11, 8);
        }
 
-       set_Protocol(PROTOCOL_LANMAN1);
+       set_Protocol(req->sconn, PROTOCOL_LANMAN1);
 
        /* Reply, SMBlockread, SMBwritelock supported. */
        SCVAL(req->outbuf,smb_flg,FLAG_REPLY|FLAG_SUPPORT_LOCKREAD);
@@ -162,7 +162,7 @@ static void reply_lanman2(struct smb_request *req, uint16 choice)
                SSVAL(req->outbuf,smb_vwv11, 8);
        }
 
-       set_Protocol(PROTOCOL_LANMAN2);
+       set_Protocol(req->sconn, PROTOCOL_LANMAN2);
 
        /* Reply, SMBlockread, SMBwritelock supported. */
        SCVAL(req->outbuf,smb_flg,FLAG_REPLY|FLAG_SUPPORT_LOCKREAD);
@@ -344,7 +344,7 @@ static void reply_nt1(struct smb_request *req, uint16 choice)
        SSVAL(req->outbuf,smb_vwv0,choice);
        SCVAL(req->outbuf,smb_vwv1,secword);
        
-       set_Protocol(PROTOCOL_NT1);
+       set_Protocol(req->sconn, PROTOCOL_NT1);
        
        SSVAL(req->outbuf,smb_vwv1+1,lp_maxmux()); /* maxmpx */
        SSVAL(req->outbuf,smb_vwv2+1,1); /* num vcs */
@@ -697,7 +697,8 @@ void reply_negprot(struct smb_request *req)
   
        DEBUG( 5, ( "negprot index=%d\n", choice ) );
 
-       if ((lp_server_signing() == Required) && (get_Protocol() < PROTOCOL_NT1)) {
+       if ((lp_server_signing() == Required)
+           && (get_Protocol(req->sconn) < PROTOCOL_NT1)) {
                exit_server_cleanly("SMB signing is required and "
                        "client negotiated a downlevel protocol");
        }
index bacb9cb0b2fdaa620ea3fa9f7cb2bd8bffe1f02f..3adc73ddf8b95ae39109fc9827238e0ed75b4ef7 100644 (file)
@@ -2539,7 +2539,7 @@ static void handle_nttrans(connection_struct *conn,
                           struct trans_state *state,
                           struct smb_request *req)
 {
-       if (get_Protocol() >= PROTOCOL_NT1) {
+       if (get_Protocol(conn->sconn) >= PROTOCOL_NT1) {
                req->flags2 |= 0x40; /* IS_LONG_NAME */
                SSVAL(req->inbuf,smb_flg2,req->flags2);
        }
index 91cfa22a05ebac97e3bb548501b1c1fe761bb690..e9e632a351facb6a7379b87489708bd49403d1ce 100644 (file)
@@ -611,7 +611,7 @@ static NTSTATUS open_file(files_struct *fsp,
        fsp->is_directory = False;
        if (conn->aio_write_behind_list &&
            is_in_path(smb_fname->base_name, conn->aio_write_behind_list,
-                      get_Protocol(), conn->case_sensitive)) {
+                      get_Protocol(conn->sconn), conn->case_sensitive)) {
                fsp->aio_write_behind = True;
        }
        status = fsp_set_smb_fname(fsp, smb_fname);
@@ -1571,7 +1571,7 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
        /* ignore any oplock requests if oplocks are disabled */
        if (!lp_oplocks(SNUM(conn)) || global_client_failed_oplock_break ||
            is_in_path(smb_fname->base_name, conn->veto_oplock_list,
-                      get_Protocol(), conn->case_sensitive)) {
+                      get_Protocol(conn->sconn), conn->case_sensitive)) {
                /* Mask off everything except the private Samba bits. */
                oplock_request &= SAMBA_PRIVATE_OPLOCK_MASK;
        }
index fbaa9dee290491016be52e8f0d6d805da8e09355..730a03da1ec97769840df1a353e08b5cd5dbe28a 100644 (file)
@@ -379,6 +379,7 @@ void init_smb_request(struct smb_request *req,
        req->unread_bytes = unread_bytes;
        req->encrypted = encrypted;
        req->conn = conn_find(sconn,req->tid);
+       req->sconn = smbd_server_conn;
        req->chain_fsp = NULL;
        req->chain_outbuf = NULL;
        req->done = false;
index 0b77d82edd94232efd990b1c3e2ba8e545272138..49d7497ff3f9e472f9ee6138d5aaf15a32ff17d2 100644 (file)
@@ -785,7 +785,7 @@ void reply_tcon_and_X(struct smb_request *req)
        else
                server_devicetype = "A:";
 
-       if (get_Protocol() < PROTOCOL_NT1) {
+       if (get_Protocol(req->sconn) < PROTOCOL_NT1) {
                reply_outbuf(req, 2, 0);
                if (message_push_string(&req->outbuf, server_devicetype,
                                        STR_TERMINATE|STR_ASCII) == -1) {
@@ -1139,7 +1139,7 @@ void reply_getatr(struct smb_request *req)
        }
        SIVAL(req->outbuf,smb_vwv3,(uint32)size);
 
-       if (get_Protocol() >= PROTOCOL_NT1) {
+       if (get_Protocol(req->sconn) >= PROTOCOL_NT1) {
                SSVAL(req->outbuf, smb_flg2,
                      SVAL(req->outbuf, smb_flg2) | FLAGS2_IS_LONG_NAME);
        }
@@ -1264,7 +1264,7 @@ void reply_dskattr(struct smb_request *req)
 
        reply_outbuf(req, 5, 0);
 
-       if (get_Protocol() <= PROTOCOL_LANMAN2) {
+       if (get_Protocol(req->sconn) <= PROTOCOL_LANMAN2) {
                double total_space, free_space;
                /* we need to scale this to a number that DOS6 can handle. We
                   use floating point so we can handle large drives on systems
@@ -2638,7 +2638,8 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req,
                                continue;
                        }
 
-                       if(!mask_match(dname, fname_mask, get_Protocol(),
+                       if(!mask_match(dname, fname_mask,
+                                      get_Protocol(conn->sconn),
                                       conn->case_sensitive)) {
                                TALLOC_FREE(frame);
                                TALLOC_FREE(talloced);
@@ -2925,7 +2926,7 @@ static void send_file_readbraw(connection_struct *conn,
 
        if ( !req_is_in_chain(req) && (nread > 0) && (fsp->base_fsp == NULL) &&
            (fsp->wcp == NULL) &&
-            lp_use_sendfile(SNUM(conn), get_Protocol(),
+            lp_use_sendfile(SNUM(conn), get_Protocol(conn->sconn),
                             smbd_server_conn->smb1.signing_state) ) {
                ssize_t sendfile_read = -1;
                char header[4];
@@ -3453,7 +3454,7 @@ static void send_file_readX(connection_struct *conn, struct smb_request *req,
        if (!req_is_in_chain(req) &&
            !is_encrypted_packet(req->inbuf) && (fsp->base_fsp == NULL) &&
            (fsp->wcp == NULL) &&
-           lp_use_sendfile(SNUM(conn), get_Protocol(),
+           lp_use_sendfile(SNUM(conn), get_Protocol(conn->sconn),
                            smbd_server_conn->smb1.signing_state) ) {
                uint8 headerbuf[smb_size + 12 * 2];
                DATA_BLOB header;
@@ -3775,7 +3776,7 @@ void reply_writebraw(struct smb_request *req)
        /* We have to deal with slightly different formats depending
                on whether we are using the core+ or lanman1.0 protocol */
 
-       if(get_Protocol() <= PROTOCOL_COREPLUS) {
+       if(get_Protocol(req->sconn) <= PROTOCOL_COREPLUS) {
                numtowrite = SVAL(smb_buf(req->inbuf),-2);
                data = smb_buf(req->inbuf);
        } else {
@@ -3831,7 +3832,9 @@ void reply_writebraw(struct smb_request *req)
         * it to send more bytes */
 
        memcpy(buf, req->inbuf, smb_size);
-       srv_set_message(buf,get_Protocol()>PROTOCOL_COREPLUS?1:0,0,True);
+       srv_set_message(
+               buf, get_Protocol(req->sconn) > PROTOCOL_COREPLUS ? 1 : 0, 0,
+               True);
        SCVAL(buf,smb_com,SMBwritebraw);
        SSVALS(buf,smb_vwv0,0xFFFF);
        show_msg(buf);
@@ -5447,7 +5450,8 @@ NTSTATUS rmdir_internals(TALLOC_CTX *ctx,
                                TALLOC_FREE(talloced);
                                continue;
                        }
-                       if(!is_in_path(dname, conn->veto_list, get_Protocol(),
+                       if(!is_in_path(dname, conn->veto_list,
+                                      get_Protocol(conn->sconn),
                                       conn->case_sensitive)) {
                                TALLOC_FREE(dir_hnd);
                                TALLOC_FREE(talloced);
@@ -6340,7 +6344,8 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
                        continue;
                }
 
-               if(!mask_match(dname, fname_src_mask, get_Protocol(),
+               if(!mask_match(dname, fname_src_mask,
+                              get_Protocol(conn->sconn),
                               conn->case_sensitive)) {
                        TALLOC_FREE(talloced);
                        continue;
@@ -6972,7 +6977,8 @@ void reply_copy(struct smb_request *req)
                                continue;
                        }
 
-                       if(!mask_match(dname, fname_src_mask, get_Protocol(),
+                       if(!mask_match(dname, fname_src_mask,
+                                      get_Protocol(conn->sconn),
                                       conn->case_sensitive)) {
                                TALLOC_FREE(talloced);
                                continue;
index addd386fb4fcc1c9288d17dfc5e8f461c60db8b0..afb682c10187d360d3ed2bb3bb19868a1a318138 100644 (file)
@@ -1430,7 +1430,7 @@ void reply_sesssetup_and_X(struct smb_request *req)
 
        smb_bufsize = SVAL(req->vwv+2, 0);
 
-       if (get_Protocol() < PROTOCOL_NT1) {
+       if (get_Protocol(req->sconn) < PROTOCOL_NT1) {
                uint16 passlen1 = SVAL(req->vwv+7, 0);
 
                /* Never do NT status codes with protocols before NT1 as we
@@ -1757,7 +1757,7 @@ void reply_sesssetup_and_X(struct smb_request *req)
 
        /* it's ok - setup a reply */
        reply_outbuf(req, 3, 0);
-       if (get_Protocol() >= PROTOCOL_NT1) {
+       if (get_Protocol(req->sconn) >= PROTOCOL_NT1) {
                push_signature(&req->outbuf);
                /* perhaps grab OS version here?? */
        }
index 5b97c65d79c383b363094d83821dd1485d8f3f95..4d2cdca6248e052e0e03833ad19ef3a04803425a 100644 (file)
@@ -112,7 +112,7 @@ NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)
                return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
        }
 
-       set_Protocol(PROTOCOL_SMB2);
+       set_Protocol(req->sconn, PROTOCOL_SMB2);
 
        if (get_remote_arch() != RA_SAMBA) {
                set_remote_arch(RA_VISTA);
index 8226b6c4280c9fd3b2ef0eb6590dbcef2aef6b6c..5618f0282d6292257ca426b26002cb9916a745ef 100644 (file)
@@ -1368,7 +1368,8 @@ static bool smbd_dirptr_lanman2_match_fn(TALLOC_CTX *ctx,
                                fname, mask);
        state->got_exact_match = got_match;
        if (!got_match) {
-               got_match = mask_match(fname, mask, get_Protocol(),
+               got_match = mask_match(fname, mask,
+                                      get_Protocol(state->conn->sconn),
                                       state->conn->case_sensitive);
        }
 
@@ -1392,9 +1393,10 @@ static bool smbd_dirptr_lanman2_match_fn(TALLOC_CTX *ctx,
                                        mangled_name, mask);
                state->got_exact_match = got_match;
                if (!got_match) {
-                       got_match = mask_match(mangled_name, mask,
-                                              get_Protocol(),
-                                              state->conn->case_sensitive);
+                       got_match = mask_match(
+                               mangled_name, mask,
+                               get_Protocol(state->conn->sconn),
+                               state->conn->case_sensitive);
                }
        }
 
@@ -2465,7 +2467,7 @@ total_data=%u (should be %u)\n", (unsigned int)total_data, (unsigned int)IVAL(pd
 
        if(numentries == 0) {
                dptr_close(sconn, &dptr_num);
-               if (get_Protocol() < PROTOCOL_NT1) {
+               if (get_Protocol(sconn) < PROTOCOL_NT1) {
                        reply_doserror(req, ERRDOS, ERRnofiles);
                        goto out;
                } else {
@@ -8147,7 +8149,7 @@ void reply_findnclose(struct smb_request *req)
 static void handle_trans2(connection_struct *conn, struct smb_request *req,
                          struct trans_state *state)
 {
-       if (get_Protocol() >= PROTOCOL_NT1) {
+       if (get_Protocol(req->sconn) >= PROTOCOL_NT1) {
                req->flags2 |= 0x40; /* IS_LONG_NAME */
                SSVAL(req->inbuf,smb_flg2,req->flags2);
        }