r4570: Replace cli->nt_pipe_fnum with an array of NT file numbers, one for each
authorVolker Lendecke <vlendec@samba.org>
Thu, 6 Jan 2005 15:35:02 +0000 (15:35 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:53:47 +0000 (10:53 -0500)
supported pipe. Netlogon is still special, as we open that twice, one to do
the auth2, the other one with schannel.

The client interface is completely unchanged for those who only use a single
pie. cli->pipe_idx is used as the index for everything except the "real"
client rpc calls, which have been explicitly converted in my last commit. Next
step is to get winbind to just use a single smb connection for multiple pipes.

Volker
(This used to be commit dc294c52e0216424236057ca6cd35e1ebf51d0da)

source3/include/client.h
source3/libsmb/clientgen.c
source3/libsmb/clitrans.c
source3/rpc_client/cli_pipe.c
source3/rpcclient/rpcclient.c
source3/torture/rpctorture.c
source3/utils/net_rpc.c
source3/utils/net_rpc_join.c

index b556538f74373bbd6fa0bd969ad8f8399d36d1f5..c182544362ff6e17b18a6a46eb6015a00d974488 100644 (file)
@@ -123,7 +123,7 @@ struct cli_state {
                                              of the pipe we're talking to, 
                                              if any */
 
-       uint16 nt_pipe_fnum;               /* Pipe handle. */
+       uint16 nt_pipe_fnum[PI_MAX_PIPES]; /* Pipe handle. */
 
        /* Secure pipe parameters */
        int pipe_auth_flags;
index 682e0d8b85a92bd5b1c937dcd0f17c6029445917..39fe91172d45a65bc8878f9517ec41073ba61a75 100644 (file)
@@ -245,6 +245,7 @@ void cli_setup_signing_state(struct cli_state *cli, int signing_state)
 struct cli_state *cli_initialise(struct cli_state *cli)
 {
         BOOL alloced_cli = False;
+       int i;
 
        /* Check the effective uid - make sure we are not setuid */
        if (is_setuid_root()) {
@@ -315,7 +316,9 @@ struct cli_state *cli_initialise(struct cli_state *cli)
        /* initialise signing */
        cli_null_set_signing(cli);
 
-       cli->nt_pipe_fnum = 0;
+       for (i=0; i<PI_MAX_PIPES; i++)
+               cli->nt_pipe_fnum[i] = 0;
+
        cli->saved_netlogon_pipe_fnum = 0;
 
        cli->initialised = 1;
@@ -344,14 +347,17 @@ close the session
 
 void cli_nt_session_close(struct cli_state *cli)
 {
+       int i;
+
        if (cli->ntlmssp_pipe_state) {
                ntlmssp_end(&cli->ntlmssp_pipe_state);
        }
 
-       if (cli->nt_pipe_fnum != 0)
-               cli_close(cli, cli->nt_pipe_fnum);
-
-       cli->nt_pipe_fnum = 0;
+       for (i=0; i<PI_MAX_PIPES; i++) {
+               if (cli->nt_pipe_fnum[i] != 0)
+                       cli_close(cli, cli->nt_pipe_fnum[i]);
+               cli->nt_pipe_fnum[i] = 0;
+       }
        cli->pipe_idx = -1;
 }
 
index 761741a91bc91442e38c1b740628af7191e9826a..3f1afa75d69e01f4cb63ce66ccd597259306d908 100644 (file)
@@ -504,7 +504,7 @@ BOOL cli_receive_nt_trans(struct cli_state *cli,
         */
        if (cli_is_dos_error(cli)) {
                 cli_dos_error(cli, &eclass, &ecode);
-               if (cli->nt_pipe_fnum == 0 || !(eclass == ERRDOS && ecode == ERRmoredata)) {
+               if (cli->nt_pipe_fnum[cli->pipe_idx] == 0 || !(eclass == ERRDOS && ecode == ERRmoredata)) {
                        cli_signing_trans_stop(cli);
                        return(False);
                }
@@ -638,7 +638,7 @@ BOOL cli_receive_nt_trans(struct cli_state *cli,
                }
                if (cli_is_dos_error(cli)) {
                         cli_dos_error(cli, &eclass, &ecode);
-                       if(cli->nt_pipe_fnum == 0 || !(eclass == ERRDOS && ecode == ERRmoredata)) {
+                       if(cli->nt_pipe_fnum[cli->pipe_idx] == 0 || !(eclass == ERRDOS && ecode == ERRmoredata)) {
                                cli_signing_trans_stop(cli);
                                return(False);
                        }
index a36fd801166b6d3578d22ed566f7c6fe1e852742..52cbae6326c78b68177e2d7a445da33a0873cd89 100644 (file)
@@ -95,7 +95,7 @@ static BOOL rpc_read(struct cli_state *cli, int pipe_idx, prs_struct *rdata, uin
                if (size > (size_t)data_to_read)
                        size = (size_t)data_to_read;
 
-               num_read = (int)cli_read(cli, cli->nt_pipe_fnum, pdata, (off_t)stream_offset, size);
+               num_read = (int)cli_read(cli, cli->nt_pipe_fnum[pipe_idx], pdata, (off_t)stream_offset, size);
 
                DEBUG(5,("rpc_read: num_read = %d, read offset: %d, to read: %d\n",
                          num_read, stream_offset, data_to_read));
@@ -416,9 +416,9 @@ static BOOL rpc_api_pipe(struct cli_state *cli, int pipe_idx, prs_struct *data,
        /* Create setup parameters - must be in native byte order. */
 
        setup[0] = TRANSACT_DCERPCCMD; 
-       setup[1] = cli->nt_pipe_fnum; /* Pipe file handle. */
+       setup[1] = cli->nt_pipe_fnum[pipe_idx]; /* Pipe file handle. */
 
-       DEBUG(5,("rpc_api_pipe: fnum:%x\n", (int)cli->nt_pipe_fnum));
+       DEBUG(5,("rpc_api_pipe: fnum:%x\n", (int)cli->nt_pipe_fnum[pipe_idx]));
 
        /* Send the RPC request and receive a response.  For short RPC
           calls (about 1024 bytes or so) the RPC request and response
@@ -442,7 +442,7 @@ static BOOL rpc_api_pipe(struct cli_state *cli, int pipe_idx, prs_struct *data,
 
        if (prdata == NULL) {
                DEBUG(0,("rpc_api_pipe: pipe %x failed to return data.\n",
-                       (int)cli->nt_pipe_fnum));
+                       (int)cli->nt_pipe_fnum[pipe_idx]));
                return False;
        }
 
@@ -470,7 +470,7 @@ static BOOL rpc_api_pipe(struct cli_state *cli, int pipe_idx, prs_struct *data,
        }
 
        if (rhdr.pkt_type == RPC_BINDNACK) {
-               DEBUG(3, ("Bind NACK received on pipe %x!\n", (int)cli->nt_pipe_fnum));
+               DEBUG(3, ("Bind NACK received on pipe %x!\n", (int)cli->nt_pipe_fnum[pipe_idx]));
                prs_mem_free(rdata);
                return False;
        }
@@ -485,7 +485,7 @@ static BOOL rpc_api_pipe(struct cli_state *cli, int pipe_idx, prs_struct *data,
        }
 
        if (rhdr.pkt_type != expected_pkt_type) {
-               DEBUG(3, ("Connection to pipe %x got an unexpected RPC packet type - %d, not %d\n", (int)cli->nt_pipe_fnum, rhdr.pkt_type, expected_pkt_type));
+               DEBUG(3, ("Connection to pipe %x got an unexpected RPC packet type - %d, not %d\n", (int)cli->nt_pipe_fnum[pipe_idx], rhdr.pkt_type, expected_pkt_type));
                prs_mem_free(rdata);
                return False;
        }
@@ -557,7 +557,7 @@ static BOOL rpc_api_pipe(struct cli_state *cli, int pipe_idx, prs_struct *data,
                prs_init(&hps, 0, cli->mem_ctx, UNMARSHALL);
                prs_give_memory(&hps, hdr_data, sizeof(hdr_data), False);
 
-               num_read = cli_read(cli, cli->nt_pipe_fnum, hdr_data, 0, RPC_HEADER_LEN+RPC_HDR_RESP_LEN);
+               num_read = cli_read(cli, cli->nt_pipe_fnum[pipe_idx], hdr_data, 0, RPC_HEADER_LEN+RPC_HDR_RESP_LEN);
                if (cli_is_dos_error(cli)) {
                         cli_dos_error(cli, &eclass, &ecode);
                         if (eclass != ERRDOS && ecode != ERRmoredata) {
@@ -1093,7 +1093,7 @@ BOOL rpc_api_pipe_req(struct cli_state *cli, int pipe_idx, uint8 op_num,
                        ret = rpc_api_pipe(cli, pipe_idx, &outgoing_packet, 
                                           rdata, RPC_RESPONSE);
                else {
-                       cli_write(cli, cli->nt_pipe_fnum, 0x0008,
+                       cli_write(cli, cli->nt_pipe_fnum[pipe_idx], 0x0008,
                                   prs_data_p(&outgoing_packet),
                                   data_sent, data_len);
                }
@@ -1126,14 +1126,14 @@ static BOOL rpc_pipe_set_hnd_state(struct cli_state *cli, int pipe_idx, const ch
                return False;
 
        DEBUG(5,("Set Handle state Pipe[%x]: %s - device state:%x\n",
-       cli->nt_pipe_fnum, pipe_name, device_state));
+       cli->nt_pipe_fnum[pipe_idx], pipe_name, device_state));
 
        /* create parameters: device state */
        SSVAL(param, 0, device_state);
 
        /* create setup parameters. */
        setup[0] = 0x0001; 
-       setup[1] = cli->nt_pipe_fnum; /* pipe file handle.  got this from an SMBOpenX. */
+       setup[1] = cli->nt_pipe_fnum[pipe_idx]; /* pipe file handle.  got this from an SMBOpenX. */
 
        /* send the data on \PIPE\ */
        if (cli_api_pipe(cli, "\\PIPE\\",
@@ -1289,7 +1289,7 @@ static BOOL rpc_send_auth_reply(struct cli_state *cli, int pipe_idx, prs_struct
                return False;
        }
 
-       if ((ret = cli_write(cli, cli->nt_pipe_fnum, 0x8, prs_data_p(&rpc_out), 
+       if ((ret = cli_write(cli, cli->nt_pipe_fnum[pipe_idx], 0x8, prs_data_p(&rpc_out), 
                        0, (size_t)prs_offset(&rpc_out))) != (ssize_t)prs_offset(&rpc_out)) {
                DEBUG(0,("rpc_send_auth_reply: cli_write failed. Return was %d\n", (int)ret));
                prs_mem_free(&rpc_out);
@@ -1316,7 +1316,7 @@ static BOOL rpc_pipe_bind(struct cli_state *cli, int pipe_idx, const char *my_na
        if ( (pipe_idx < 0) || (pipe_idx >= PI_MAX_PIPES) )
                return False;
 
-       DEBUG(5,("Bind RPC Pipe[%x]: %s\n", cli->nt_pipe_fnum, pipe_names[pipe_idx].client_pipe));
+       DEBUG(5,("Bind RPC Pipe[%x]: %s\n", cli->nt_pipe_fnum[pipe_idx], pipe_names[pipe_idx].client_pipe));
 
        if (!valid_pipe_name(pipe_idx, &abstract, &transfer))
                return False;
@@ -1439,7 +1439,7 @@ BOOL cli_nt_session_open(struct cli_state *cli, const int pipe_idx)
        /* At the moment we can't have more than one pipe open over
            a cli connection. )-: */
 
-       SMB_ASSERT(cli->nt_pipe_fnum == 0);
+       SMB_ASSERT(cli->nt_pipe_fnum[pipe_idx] == 0);
        
        /* The pipe index must fall within our array */
 
@@ -1452,7 +1452,7 @@ BOOL cli_nt_session_open(struct cli_state *cli, const int pipe_idx)
                        return False;
                }
 
-               cli->nt_pipe_fnum = (uint16)fnum;
+               cli->nt_pipe_fnum[pipe_idx] = (uint16)fnum;
        } else {
                if ((fnum = cli_open(cli, pipe_names[pipe_idx].client_pipe, O_CREAT|O_RDWR, DENY_NONE)) == -1) {
                        DEBUG(1,("cli_nt_session_open: cli_open failed on pipe %s to machine %s.  Error was %s\n",
@@ -1460,14 +1460,14 @@ BOOL cli_nt_session_open(struct cli_state *cli, const int pipe_idx)
                        return False;
                }
 
-               cli->nt_pipe_fnum = (uint16)fnum;
+               cli->nt_pipe_fnum[pipe_idx] = (uint16)fnum;
 
                /**************** Set Named Pipe State ***************/
                if (!rpc_pipe_set_hnd_state(cli, pipe_idx, pipe_names[pipe_idx].client_pipe, 0x4300)) {
                        DEBUG(0,("cli_nt_session_open: pipe hnd state failed.  Error was %s\n",
                                  cli_errstr(cli)));
-                       cli_close(cli, cli->nt_pipe_fnum);
-                       cli->nt_pipe_fnum = 0;
+                       cli_close(cli, cli->nt_pipe_fnum[pipe_idx]);
+                       cli->nt_pipe_fnum[pipe_idx] = 0;
                        return False;
                }
        }
@@ -1477,8 +1477,8 @@ BOOL cli_nt_session_open(struct cli_state *cli, const int pipe_idx)
        if (!rpc_pipe_bind(cli, pipe_idx, global_myname())) {
                DEBUG(2,("cli_nt_session_open: rpc bind to %s failed\n",
                         get_pipe_name_from_index(pipe_idx)));
-               cli_close(cli, cli->nt_pipe_fnum);
-               cli->nt_pipe_fnum = 0;
+               cli_close(cli, cli->nt_pipe_fnum[pipe_idx]);
+               cli->nt_pipe_fnum[pipe_idx] = 0;
                return False;
        }
 
@@ -1554,7 +1554,7 @@ NTSTATUS cli_nt_establish_netlogon(struct cli_state *cli, int sec_chan,
        memcpy(cli->auth_info.sess_key, cli->sess_key,
               sizeof(cli->auth_info.sess_key));
 
-       cli->saved_netlogon_pipe_fnum = cli->nt_pipe_fnum;
+       cli->saved_netlogon_pipe_fnum = cli->nt_pipe_fnum[PI_NETLOGON];
 
        cli->pipe_auth_flags = AUTH_PIPE_NETSEC;
        cli->pipe_auth_flags |= AUTH_PIPE_SIGN;
@@ -1574,7 +1574,7 @@ NTSTATUS cli_nt_establish_netlogon(struct cli_state *cli, int sec_chan,
                        return NT_STATUS_UNSUCCESSFUL;
                }
                
-               cli->nt_pipe_fnum = (uint16)fnum;
+               cli->nt_pipe_fnum[PI_NETLOGON] = (uint16)fnum;
        } else {
                if ((fnum = cli_open(cli, PIPE_NETLOGON,
                                     O_CREAT|O_RDWR, DENY_NONE)) == -1) {
@@ -1585,20 +1585,20 @@ NTSTATUS cli_nt_establish_netlogon(struct cli_state *cli, int sec_chan,
                        return NT_STATUS_UNSUCCESSFUL;
                }
 
-               cli->nt_pipe_fnum = (uint16)fnum;
+               cli->nt_pipe_fnum[PI_NETLOGON] = (uint16)fnum;
 
                /**************** Set Named Pipe State ***************/
                if (!rpc_pipe_set_hnd_state(cli, PI_NETLOGON, PIPE_NETLOGON, 0x4300)) {
                        DEBUG(0,("Pipe hnd state failed.  Error was %s\n",
                                  cli_errstr(cli)));
-                       cli_close(cli, cli->nt_pipe_fnum);
+                       cli_close(cli, cli->nt_pipe_fnum[PI_NETLOGON]);
                        return NT_STATUS_UNSUCCESSFUL;
                }
        }
        
        if (!rpc_pipe_bind(cli, PI_NETLOGON, global_myname())) {
                DEBUG(2,("rpc bind to %s failed\n", PIPE_NETLOGON));
-               cli_close(cli, cli->nt_pipe_fnum);
+               cli_close(cli, cli->nt_pipe_fnum[PI_NETLOGON]);
                return NT_STATUS_UNSUCCESSFUL;
        }
 
@@ -1645,8 +1645,8 @@ NTSTATUS cli_nt_setup_netsec(struct cli_state *cli, int sec_chan, int auth_flags
        memcpy(cli->auth_info.sess_key, cli->sess_key,
               sizeof(cli->auth_info.sess_key));
 
-       cli->saved_netlogon_pipe_fnum = cli->nt_pipe_fnum;
-       cli->nt_pipe_fnum = 0;
+       cli->saved_netlogon_pipe_fnum = cli->nt_pipe_fnum[PI_NETLOGON];
+       cli->nt_pipe_fnum[PI_NETLOGON] = 0;
 
        /* doing schannel, not per-user auth */
        cli->pipe_auth_flags = auth_flags;
index e003b86e67bc085be2ee0406f7cc99ceb5388d8f..4d35b6d8a95383add06e47b64a2a17c945ad8198 100644 (file)
@@ -24,6 +24,7 @@
 #include "rpcclient.h"
 
 DOM_SID domain_sid;
+static int pipe_idx;
 
 
 /* List to hold groups of commands.
@@ -315,7 +316,7 @@ static NTSTATUS cmd_sign(struct cli_state *cli, TALLOC_CTX *mem_ctx,
                /* still have session, just need to use it again */
                cli->pipe_auth_flags = AUTH_PIPE_NTLMSSP;
                cli->pipe_auth_flags |= AUTH_PIPE_SIGN;
-               if (cli->nt_pipe_fnum != 0)
+               if (cli->nt_pipe_fnum[cli->pipe_idx] != 0)
                        cli_nt_session_close(cli);
        }
 
@@ -332,7 +333,7 @@ static NTSTATUS cmd_seal(struct cli_state *cli, TALLOC_CTX *mem_ctx,
                cli->pipe_auth_flags = AUTH_PIPE_NTLMSSP;
                cli->pipe_auth_flags |= AUTH_PIPE_SIGN;
                cli->pipe_auth_flags |= AUTH_PIPE_SEAL;
-               if (cli->nt_pipe_fnum != 0)
+               if (cli->nt_pipe_fnum[cli->pipe_idx] != 0)
                        cli_nt_session_close(cli);
        }
        return NT_STATUS_OK; 
@@ -346,7 +347,7 @@ static NTSTATUS cmd_none(struct cli_state *cli, TALLOC_CTX *mem_ctx,
        } else {
                /* still have session, just need to use it again */
                cli->pipe_auth_flags = 0;
-               if (cli->nt_pipe_fnum != 0)
+               if (cli->nt_pipe_fnum[cli->pipe_idx] != 0)
                        cli_nt_session_close(cli);
        }
        cli->pipe_auth_flags = 0;
@@ -381,13 +382,13 @@ static NTSTATUS setup_schannel(struct cli_state *cli, int pipe_auth_flags,
                        /* schannel is setup, just need to use it again with new flags */
                        cli->pipe_auth_flags = pipe_auth_flags;
 
-                       if (cli->nt_pipe_fnum != 0)
+                       if (cli->nt_pipe_fnum[cli->pipe_idx] != 0)
                                cli_nt_session_close(cli);
                        return NT_STATUS_OK;
                }
        }
        
-       if (cli->nt_pipe_fnum != 0)
+       if (cli->nt_pipe_fnum[cli->pipe_idx] != 0)
                cli_nt_session_close(cli);
 
        if (!secrets_fetch_trust_account_password(lp_workgroup(),
@@ -523,7 +524,7 @@ static NTSTATUS do_cmd(struct cli_state *cli,
 
        if (cmd_entry->pipe_idx != -1
            && cmd_entry->pipe_idx != cli->pipe_idx) {
-               if (cli->nt_pipe_fnum != 0)
+               if (cli->nt_pipe_fnum[cli->pipe_idx] != 0)
                        cli_nt_session_close(cli);
                
                if (!cli_nt_session_open(cli, cmd_entry->pipe_idx)) {
@@ -558,6 +559,7 @@ static NTSTATUS do_cmd(struct cli_state *cli,
 
      /* Run command */
 
+       pipe_idx = cmd_entry->pipe_idx;
      if ( cmd_entry->returntype == RPC_RTYPE_NTSTATUS ) {
           ntresult = cmd_entry->ntfn(cli, mem_ctx, argc, (const char **) argv);
           if (!NT_STATUS_IS_OK(ntresult)) {
index d95c0cee0fe98d41e8a61dd988e19f2bf2e9b392..98e36983b09df4fd0bad60b541cf1893380a218b 100644 (file)
@@ -285,7 +285,11 @@ enum client_action
        ZERO_STRUCT(cli_info.dom.level5_sid);
        pstrcpy(cli_info.dom.level5_dom, "");
 
-       smb_cli->nt_pipe_fnum   = 0xffff;
+       {
+               int i;
+               for (i=0; i<PI_MAX_PIPES; i++)
+                       smb_cli->nt_pipe_fnum[i]   = 0xffff;
+       }
 
        setup_logging(pname, True);
 
index 4c5544aa9731b6ff58a2ff197dda3c33d8db3a44..aa25d6816dc9999a7cea029abc23fd40efa10825 100644 (file)
@@ -145,7 +145,7 @@ static int run_rpc_command(struct cli_state *cli_arg, const int pipe_idx, int co
        }
                
        if (!(conn_flags & NET_FLAGS_NO_PIPE)) {
-               if (cli->nt_pipe_fnum)
+               if (cli->nt_pipe_fnum[cli->pipe_idx])
                        cli_nt_session_close(cli);
        }
 
@@ -4437,7 +4437,7 @@ static int rpc_trustdom_establish(int argc, const char **argv)
                return -1;
        }
 
-       if (cli->nt_pipe_fnum)
+       if (cli->nt_pipe_fnum[cli->pipe_idx])
                cli_nt_session_close(cli);
 
 
@@ -4504,7 +4504,7 @@ static int rpc_trustdom_establish(int argc, const char **argv)
                return -1;
        }
 
-       if (cli->nt_pipe_fnum)
+       if (cli->nt_pipe_fnum[cli->pipe_idx])
                cli_nt_session_close(cli);
         
        talloc_destroy(mem_ctx);
index 79c632f8314d37b78a227ced1b4fc3e8e6ad2007..f1a41c7c99c8c50698d15cf9649e6c19f11f2ea6 100644 (file)
@@ -78,7 +78,7 @@ static int net_rpc_join_ok(const char *domain)
        
 done:
        /* Close down pipe - this will clean up open policy handles */
-       if (cli->nt_pipe_fnum)
+       if (cli->nt_pipe_fnum[cli->pipe_idx])
                cli_nt_session_close(cli);
 
        cli_shutdown(cli);
@@ -347,7 +347,7 @@ int net_rpc_join_newstyle(int argc, const char **argv)
 done:
        /* Close down pipe - this will clean up open policy handles */
 
-       if (cli->nt_pipe_fnum)
+       if (cli->nt_pipe_fnum[cli->pipe_idx])
                cli_nt_session_close(cli);
 
        /* Display success or failure */