Fixups for compiles with gcc flags -Wall -Wshadow -Wstrict-prototypes -Wpointer-arith...
authorJeremy Allison <jra@samba.org>
Fri, 10 Mar 2000 19:50:03 +0000 (19:50 +0000)
committerJeremy Allison <jra@samba.org>
Fri, 10 Mar 2000 19:50:03 +0000 (19:50 +0000)
Partially implemented rpc daemon redirect (needs more work).
Jeremy.
(This used to be commit a462191698fa589ceac4afd14c652adf699eccad)

source3/include/ntdomain.h
source3/include/proto.h
source3/include/smb.h
source3/lib/util.c
source3/msdfs/msdfs.c
source3/rpc_server/srv_pipe.c
source3/rpc_server/srv_pipe_hnd.c
source3/rpc_server/srv_spoolss_nt.c
source3/smbd/trans2.c

index 46be965d70b039cebd33fbb334d14f31ea99d93c..b754dd8525ff01a5c77c733f60fc771ebacf3358 100644 (file)
@@ -31,6 +31,8 @@
 /* miscellaneous structures / defines */
 #include "rpc_misc.h"
 
+#include "rpc_creds.h"
+
 /*
  * A bunch of stuff that was put into smb.h
  * in the NTDOM branch - it didn't belong there.
@@ -114,6 +116,21 @@ typedef struct _input_data {
     prs_struct data;
 } input_data;
 
+struct msrpc_state
+{
+       fstring pipe_name;
+       struct user_creds usr;
+       struct ntdom_info nt;
+
+       int fd;
+       BOOL redirect;
+       BOOL initialised;
+       char *inbuf;
+       char *outbuf;
+
+       uint32 pid;
+};
+
 typedef struct pipes_struct
 {
        struct pipes_struct *next, *prev;
index 6a09935226b7f036087ae89e72e57fdc4d7e213c..d65c5a5d64af21f24b072ea67840c739ba026a70 100644 (file)
@@ -812,7 +812,7 @@ int setup_dfs_referral(char* pathname, int max_referral_level,
 int dfs_path_error(char* inbuf, char* outbuf);
 int setup_dfs_referral(char* pathname, int max_referral_level, 
                       char** ppdata);
-int unistr_to_dos(char* dst,uint16* src)              ;
+void unistr_to_dos(char* dst,uint16* src)             ;
 
 /*The following definitions come from  msdfs/msdfs_tdb.c  */
 
@@ -2609,11 +2609,10 @@ BOOL api_rpcTNP(pipes_struct *p, char *rpc_name, struct api_struct *api_rpc_cmds
 void set_pipe_handle_offset(int max_open_files);
 void reset_chain_p(void);
 void init_rpc_pipe_hnd(void);
-BOOL pipe_init_outgoing_data(output_data *o_data);
 pipes_struct *open_rpc_pipe_p(char *pipe_name, 
                              connection_struct *conn, uint16 vuid);
 ssize_t write_to_pipe(pipes_struct *p, char *data, size_t n);
-int read_from_pipe(pipes_struct *p, char *data, int n);
+ssize_t read_from_pipe(pipes_struct *p, char *data, size_t n);
 BOOL wait_rpc_pipe_hnd_state(pipes_struct *p, uint16 priority);
 BOOL set_rpc_pipe_hnd_state(pipes_struct *p, uint16 device_state);
 BOOL close_rpc_pipe_hnd(pipes_struct *p, connection_struct *conn);
index 15b491239ca4c805f19457029c8d73731d291374..a179a7808ea072f51393047308cec51d222f0efb 100644 (file)
@@ -171,8 +171,6 @@ implemented */
 #define ERRbaddirectory 267 /* Invalid directory name in a path. */
 #define ERRunknownipc 2142
 
-#define ERROR_ACCESS_DENIED              (5)
-#define ERROR_INVALID_HANDLE             (6)
 #define ERROR_INVALID_PARAMETER                 (87)
 #define ERROR_INSUFFICIENT_BUFFER      (122)
 #define ERROR_INVALID_NAME             (123)
@@ -618,9 +616,6 @@ struct dcinfo
   uchar  md4pw[16];   /* md4(machine password) */
 };
 
-#include "nt_printing.h"
-
-#include "ntdomain.h"
 
 typedef struct
 {
@@ -640,18 +635,8 @@ typedef struct
        /* per-user authentication information on NT RPCs */
        /* lkclXXXX - THIS SHOULD NOT BE HERE! */
        struct dcinfo dc;
-
-       NET_USER_INFO_3 usr;
-
 } user_struct;
 
-typedef struct
-{
-       uint32 pid;
-       uint16 vuid;
-
-} vuser_key;
-
 enum {LPQ_QUEUED,LPQ_PAUSED,LPQ_SPOOLING,LPQ_PRINTING};
 
 typedef struct _print_queue_struct
@@ -1679,8 +1664,6 @@ struct pwd_info
        uchar sess_key[16];
 };
 
-#include "rpc_creds.h"
-
 struct ntdom_info
 {
        unsigned char sess_key[16];        /* Current session key. */
@@ -1694,20 +1677,10 @@ struct ntdom_info
        int max_xmit_frag;
 };
 
-struct msrpc_state
-{
-       fstring pipe_name;
-       struct user_creds usr;
-       struct ntdom_info nt;
-
-       int fd;
-       BOOL redirect;
-       BOOL initialised;
-       char *inbuf;
-       char *outbuf;
+#include "nt_printing.h"
+#include "rpc_creds.h"
+#include "ntdomain.h"
 
-       uint32 pid;
-};
 #include "client.h"
 #include "rpcclient.h"
 
index 772ac2f9efb60b8ea40c9d602cc13384b55aac2a..3c86570af1ff1ee000bf6d5ef1bd82d2f99fa451 100644 (file)
@@ -1028,10 +1028,6 @@ BOOL unix_do_match(char *str, char *regexp, BOOL case_sig)
 {
   char *p;
 
-
-        while(*str && (case_sig ? (*p != *str) : (toupper(*p)!=toupper(*str))))
-          str++;
-
   for( p = regexp; *p && *str; ) {
     switch(*p) {
     case '?':
@@ -1047,6 +1043,10 @@ BOOL unix_do_match(char *str, char *regexp, BOOL case_sig)
       if(!*p)
         return True; /* Automatic match */
       while(*str) {
+
+        while(*str && (case_sig ? (*p != *str) : (toupper(*p)!=toupper(*str))))
+          str++;
+
         /*
          * Patch from weidel@multichart.de. In the case of the regexp
          * '*XX*' we want to ensure there are at least 2 'X' characters
@@ -1130,7 +1130,7 @@ static BOOL unix_mask_match(char *str, char *regexp, BOOL case_sig)
 {
   char *p;
   pstring p1, p2;
-  fstring ebase,eext,sbase,sext;
+  fstring ebase,sbase;
   BOOL matched;
 
   /* Make local copies of str and regexp */
index adb968db81566b915c224e19672ff05cb5e1d0e7..efc5b47ad77f9dd24f43ff88616a380fcfe48b5b 100644 (file)
@@ -23,7 +23,7 @@
 
 extern int DEBUGLEVEL;
 extern pstring global_myname;
-extern global_client_caps;
+extern uint32 global_client_caps;
 
 #ifdef MS_DFS
 
@@ -442,7 +442,7 @@ int setup_dfs_referral(char* pathname, int max_referral_level,
 #endif
 
 /* Trivial fn that chops off upper bytes to convert unicode to dos */
-int unistr_to_dos(char* dst,uint16* src)              
+void unistr_to_dos(char* dst,uint16* src)             
 {
   pstring s;
   int i=0;
index 9079590f31904d7ce249bfa1fb40407322c14156..9a17862bd58fe81ebae285b1745548e341b64b4c 100644 (file)
@@ -492,15 +492,6 @@ BOOL api_pipe_bind_auth_resp(pipes_struct *p, prs_struct *rpc_in_p)
 
        DEBUG(5,("api_pipe_bind_auth_resp: decode request. %d\n", __LINE__));
 
-       /*
-        * Create the response data buffer.
-        */
-
-       if(!pipe_init_outgoing_data(&p->out_data)) {
-               DEBUG(0,("api_pipe_bind_auth_resp: failed to create outgoing buffer.\n"));
-               return False;
-       }
-
        if (p->hdr.auth_len == 0) {
                DEBUG(0,("api_pipe_bind_auth_resp: No auth field sent !\n"));
                return False;
@@ -695,15 +686,6 @@ BOOL api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p)
 
        DEBUG(5,("api_pipe_bind_req: decode request. %d\n", __LINE__));
 
-       /*
-        * Create the response data buffer.
-        */
-
-       if(!pipe_init_outgoing_data(&p->out_data)) {
-               DEBUG(0,("api_pipe_bind_req: failed to create outgoing buffer.\n"));
-               return False;
-       }
-
        /*
         * Try and find the correct pipe name to ensure
         * that this is a pipe name we support.
@@ -1062,15 +1044,6 @@ BOOL api_pipe_request(pipes_struct *p)
        BOOL ret = False;
        BOOL changed_user_id = False;
 
-       /*
-        * Create the response data buffer.
-        */
-
-       if(!pipe_init_outgoing_data(&p->out_data)) {
-               DEBUG(0,("api_pipe_request: failed to create outgoing buffer.\n"));
-               return False;
-       }
-
        if (p->ntlmssp_auth_validated) {
 
                if(!become_authenticated_pipe_user(p)) {
index 4c71433c2a5db333ed9d5056e9c7cfb00c5b5789..fdee90e8aeb3d680c2e003f4f56e7259aa024020 100644 (file)
@@ -77,8 +77,12 @@ void init_rpc_pipe_hnd(void)
  Initialise an outgoing packet.
 ****************************************************************************/
 
-BOOL pipe_init_outgoing_data(output_data *o_data)
+static BOOL pipe_init_outgoing_data(output_data *o_data, uint32 len)
 {
+       /* Reset the offset counters. */
+       o_data->data_sent_length = 0;
+       o_data->current_pdu_len = 0;
+       o_data->current_pdu_sent = 0;
 
        memset(o_data->current_pdu, '\0', sizeof(o_data->current_pdu));
 
@@ -89,21 +93,16 @@ BOOL pipe_init_outgoing_data(output_data *o_data)
         * Initialize the outgoing RPC data buffer.
         * we will use this as the raw data area for replying to rpc requests.
         */     
-       if(!prs_init(&o_data->rdata, MAX_PDU_FRAG_LEN, 4, MARSHALL)) {
+       if(!prs_init(&o_data->rdata, len, 4, MARSHALL)) {
                DEBUG(0,("pipe_init_outgoing_data: malloc fail.\n"));
                return False;
        }
 
-       /* Reset the offset counters. */
-       o_data->data_sent_length = 0;
-       o_data->current_pdu_len = 0;
-       o_data->current_pdu_sent = 0;
-
        return True;
 }
 
 /****************************************************************************
HACK !!! Attempt to find a remote process to communicate RPC's with.
+ Attempt to find a remote process to communicate RPC's with.
 ****************************************************************************/
 
 static void attempt_remote_rpc_connect(pipes_struct *p)
@@ -254,7 +253,7 @@ pipes_struct *open_rpc_pipe_p(char *pipe_name,
        fstrcpy(p->name, pipe_name);
        
        /*
-        * HACK !!! For Luke - attempt to connect to RPC redirect process.
+        * For Luke - attempt to connect to RPC redirect process.
         */
 
        attempt_remote_rpc_connect(p);
@@ -464,7 +463,7 @@ authentication failed. Denying the request.\n", p->name));
        }
 
        if(p->hdr.flags & RPC_FLG_LAST) {
-               BOOL ret;
+               BOOL ret = False;
                /*
                 * Ok - we finally have a complete RPC stream.
                 * Call the rpc command to process it.
@@ -482,7 +481,8 @@ authentication failed. Denying the request.\n", p->name));
                 * Process the complete data stream here.
                 */
 
-               ret = api_pipe_request(p);
+               if(pipe_init_outgoing_data(&p->out_data, MAX_PDU_FRAG_LEN))
+                       ret = api_pipe_request(p);
 
                /*
                 * We have consumed the whole data stream. Set back to
@@ -532,13 +532,15 @@ static ssize_t process_complete_pdu(pipes_struct *p)
                        /*
                         * We assume that a pipe bind is only in one pdu.
                         */
-                       reply = api_pipe_bind_req(p, &rpc_in);
+                       if(pipe_init_outgoing_data(&p->out_data, MAX_PDU_FRAG_LEN))
+                               reply = api_pipe_bind_req(p, &rpc_in);
                        break;
                case RPC_BINDRESP:
                        /*
                         * We assume that a pipe bind_resp is only in one pdu.
                         */
-                       reply = api_pipe_bind_auth_resp(p, &rpc_in);
+                       if(pipe_init_outgoing_data(&p->out_data, MAX_PDU_FRAG_LEN))
+                               reply = api_pipe_bind_auth_resp(p, &rpc_in);
                        break;
                case RPC_REQUEST:
                        reply = process_request_pdu(p, &rpc_in);
@@ -661,7 +663,14 @@ ssize_t write_to_pipe(pipes_struct *p, char *data, size_t n)
 
                DEBUG(10,("write_to_pipe: data_left = %u\n", (unsigned int)data_left ));
 
-               data_used = process_incoming_data(p, data, data_left);
+               /*
+                * Deal with the redirect to the remote RPC daemon.
+                */
+
+               if(p->m)
+                       data_used = write(p->m->fd, data, data_left);
+               else
+                       data_used = process_incoming_data(p, data, data_left);
 
                DEBUG(10,("write_to_pipe: data_used = %d\n", (int)data_used ));
 
@@ -675,9 +684,72 @@ ssize_t write_to_pipe(pipes_struct *p, char *data, size_t n)
        return n;
 }
 
+/****************************************************************************
+ Gets data from a remote TNG daemon. Gets data from the remote daemon into
+ the outgoing prs_struct.
+
+ NB. Note to Luke : This code will be broken until Luke implements a length
+ field before reply data...
+
+****************************************************************************/
+
+static BOOL read_from_remote(pipes_struct *p)
+{
+       uint32 data_len;
+       uint32 data_len_left;
+
+       if(prs_offset(&p->out_data.rdata) == 0) {
+
+               ssize_t len = 0;
+
+               /*
+                * Read all the reply data as a stream of pre-created
+                * PDU's from the remote deamon into the rdata struct.
+                */
+
+           /*
+                * Create the response data buffer.
+                */
+
+               if(!pipe_init_outgoing_data(&p->out_data, 65536)) {
+                       DEBUG(0,("read_from_remote: failed to create outgoing buffer.\n"));
+                       return False;
+               }
+
+               /* Read from remote here. */
+               if((len = read_with_timeout(p->m->fd, prs_data_p(&p->out_data.rdata), 1, 65536, 10000)) < 0) {
+                       DEBUG(0,("read_from_remote: failed to read from external daemon.\n"));
+                       prs_mem_free(&p->out_data.rdata);
+                       return False;
+               }
+
+               /* Set the length we got. */
+               prs_set_offset(&p->out_data.rdata, (uint32)len);
+       }
+
+       /*
+        * The amount we send is the minimum of the available
+        * space and the amount left to send.
+        */
+
+       data_len_left = prs_offset(&p->out_data.rdata) - p->out_data.data_sent_length;
+
+       /*
+        * Ensure there really is data left to send.
+        */
+
+       if(!data_len_left) {
+               DEBUG(0,("read_from_remote: no data left to send !\n"));
+               return False;
+       }
+
+       data_len = MIN(data_len_left, MAX_PDU_FRAG_LEN);
+
+       return False; /* Notfinished... */
+}
 
 /****************************************************************************
- Replyies to a request to read data from a pipe.
+ Replies to a request to read data from a pipe.
 
  Headers are interspersed with the data at PDU intervals. By the time
  this function is called, the start of the data could possibly have been
@@ -685,13 +757,12 @@ ssize_t write_to_pipe(pipes_struct *p, char *data, size_t n)
 
  Calling create_rpc_reply() here is a hack. The data should already
  have been prepared into arrays of headers + data stream sections.
+****************************************************************************/
 
- ****************************************************************************/
-
-int read_from_pipe(pipes_struct *p, char *data, int n)
+ssize_t read_from_pipe(pipes_struct *p, char *data, size_t n)
 {
        uint32 pdu_remaining = 0;
-       int data_returned = 0;
+       ssize_t data_returned = 0;
 
        if (!p || !p->open) {
                DEBUG(0,("read_from_pipe: pipe not open\n"));
@@ -700,7 +771,7 @@ int read_from_pipe(pipes_struct *p, char *data, int n)
 
        DEBUG(6,("read_from_pipe: %x", p->pnum));
 
-       DEBUG(6,(" name: %s len: %d\n", p->name, n));
+       DEBUG(6,(" name: %s len: %u\n", p->name, (unsigned int)n));
 
        /*
         * We cannot return more than one PDU length per
@@ -708,8 +779,8 @@ int read_from_pipe(pipes_struct *p, char *data, int n)
         */
 
        if(n > MAX_PDU_FRAG_LEN) {
-               DEBUG(0,("read_from_pipe: loo large read (%d) requested on pipe %s. We can \
-only service %d sized reads.\n", n, p->name, MAX_PDU_FRAG_LEN ));
+               DEBUG(0,("read_from_pipe: loo large read (%u) requested on pipe %s. We can \
+only service %d sized reads.\n", (unsigned int)n, p->name, MAX_PDU_FRAG_LEN ));
                return -1;
        }
 
@@ -722,7 +793,7 @@ only service %d sized reads.\n", n, p->name, MAX_PDU_FRAG_LEN ));
         */
 
        if((pdu_remaining = p->out_data.current_pdu_len - p->out_data.current_pdu_sent) > 0) {
-               data_returned = MIN(n, pdu_remaining);
+               data_returned = (ssize_t)MIN(n, pdu_remaining);
 
                DEBUG(10,("read_from_pipe: %s: current_pdu_len = %u, current_pdu_sent = %u \
 returning %d bytes.\n", p->name, (unsigned int)p->out_data.current_pdu_len, 
@@ -749,17 +820,28 @@ returning %d bytes.\n", p->name, (unsigned int)p->out_data.current_pdu_len,
                return 0;
        }
 
-       /*
-        * We need to create a new PDU from the data left in p->rdata.
-        * Create the header/data/footers. This also sets up the fields
-        * p->current_pdu_len, p->current_pdu_sent, p->data_sent_length
-        * and stores the outgoing PDU in p->current_pdu.
-        */
+       if(p->m) {
+               /*
+                * Remote to the RPC daemon.
+                */
+               if(!read_from_remote(p)) {
+                       DEBUG(0,("read_from_pipe: %s: read_from_remote failed.\n", p->name ));
+                       return -1;
+               }
 
-       if(!create_next_pdu(p)) {
-               DEBUG(0,("read_from_pipe: %s: create_next_pdu failed.\n",
-                        p->name));
-               return -1;
+       } else {
+
+               /*
+                * We need to create a new PDU from the data left in p->rdata.
+                * Create the header/data/footers. This also sets up the fields
+                * p->current_pdu_len, p->current_pdu_sent, p->data_sent_length
+                * and stores the outgoing PDU in p->current_pdu.
+                */
+
+               if(!create_next_pdu(p)) {
+                       DEBUG(0,("read_from_pipe: %s: create_next_pdu failed.\n", p->name));
+                       return -1;
+               }
        }
 
        data_returned = MIN(n, p->out_data.current_pdu_len);
index 9170b8afdd9e536d449dafe6b35c935126919cb7..b4aefe44c174245f41f79d6738e3392a093345f9 100644 (file)
@@ -4140,6 +4140,8 @@ static uint32 getjob_level_1(print_queue_struct *queue, int count, int snum, uin
 
 /****************************************************************************
 ****************************************************************************/
+#if 0
+... Not yet used...
 static uint32 getjob_level_2(print_queue_struct *queue, int count, int snum, uint32 jobid, NEW_BUFFER *buffer, uint32 offered, uint32 *needed)
 {
        int i=0;
@@ -4179,6 +4181,7 @@ static uint32 getjob_level_2(print_queue_struct *queue, int count, int snum, uin
        else
                return NT_STATUS_NO_PROBLEMO;
 }
+#endif
 
 /****************************************************************************
 ****************************************************************************/
index 21fa9b5cc55ce66de68a238e589d2f48e741479e..3135079514d8498076c6aa9acc992da209c4e863 100644 (file)
@@ -2132,6 +2132,7 @@ static int call_trans2getdfsreferral(connection_struct *conn, char* inbuf,
                                     char* outbuf, int length, int bufsize,
                                     char** pparams, char** ppdata)
 {
+#ifdef MS_DFS
   char *params = *pparams;
   enum remote_arch_types ra_type = get_remote_arch();
   BOOL NT_arch = ((ra_type == RA_WINNT) || (ra_type == RA_WIN2K));
@@ -2139,6 +2140,7 @@ static int call_trans2getdfsreferral(connection_struct *conn, char* inbuf,
   int reply_size = 0;
   char* dfs_referral = NULL;
   int max_referral_level = SVAL(params,0);
+#endif
 
   DEBUG(10,("call_trans2getdfsreferral\n"));
 #ifdef MS_DFS