r884: convert samba4 to use [u]int32_t instead of [u]int32
[nivanova/samba-autobuild/.git] / source4 / libcli / raw / rawtrans.c
index 508f9202685844579618def626c689b45634ed80..d13a1227dd0ccf471ddecd236b75c3c3bbbfc27b 100644 (file)
@@ -64,7 +64,6 @@ NTSTATUS smb_raw_trans2_recv(struct cli_request *req,
        parms->out.params.data = NULL;
 
        if (!cli_request_receive(req)) {
-               req->status = NT_STATUS_UNSUCCESSFUL;
                return cli_request_destroy(req);
        }
        
@@ -194,21 +193,32 @@ failed:
        return cli_request_destroy(req);
 }
 
+NTSTATUS smb_raw_trans_recv(struct cli_request *req,
+                            TALLOC_CTX *mem_ctx,
+                            struct smb_trans2 *parms)
+{
+       return smb_raw_trans2_recv(req, mem_ctx, parms);
+}
 
 /****************************************************************************
- trans2 raw async interface - only BLOBs used in this interface.
-note that this doesn't yet support multi-part requests
+ trans/trans2 raw async interface - only BLOBs used in this interface.
+ note that this doesn't yet support multi-part requests
 ****************************************************************************/
-struct cli_request *smb_raw_trans2_send(struct cli_tree *tree,
-                                       struct smb_trans2 *parms)
+struct cli_request *smb_raw_trans_send_backend(struct cli_tree *tree,
+                                              struct smb_trans2 *parms,
+                                              uint8 command)
 {
-       uint8 command = SMBtrans2;
        int wct = 14 + parms->in.setup_count;
        struct cli_request *req; 
        char *outdata,*outparam;
-       int data_sent, param_sent;
        int i;
-       const int padding = 3;
+       int padding;
+       size_t namelen = 0;
+
+       if (command == SMBtrans)
+               padding = 1;
+       else
+               padding = 3;
        
        req = cli_request_setup(tree, command, wct, padding);
        if (!req) {
@@ -216,14 +226,17 @@ struct cli_request *smb_raw_trans2_send(struct cli_tree *tree,
        }
        
        /* fill in SMB parameters */
-       data_sent = parms->in.data.length;
-       param_sent = parms->in.params.length;
        outparam = req->out.data + padding;
-       outdata = outparam + param_sent;
+       outdata = outparam + parms->in.params.length;
 
        /* make sure we don't leak data via the padding */
        memset(req->out.data, 0, padding);
 
+       if (command == SMBtrans && parms->in.trans_name) {
+               namelen = cli_req_append_string(req, parms->in.trans_name, 
+                                               STR_TERMINATE);
+       }
+
        /* primary request */
        SSVAL(req->out.vwv,VWV(0),parms->in.params.length);
        SSVAL(req->out.vwv,VWV(1),parms->in.data.length);
@@ -234,9 +247,9 @@ struct cli_request *smb_raw_trans2_send(struct cli_tree *tree,
        SIVAL(req->out.vwv,VWV(6),parms->in.timeout);
        SSVAL(req->out.vwv,VWV(8),0); /* reserved */
        SSVAL(req->out.vwv,VWV(9),parms->in.params.length);
-       SSVAL(req->out.vwv,VWV(10),PTR_DIFF(outparam,req->out.hdr));
+       SSVAL(req->out.vwv,VWV(10),PTR_DIFF(outparam,req->out.hdr)+namelen);
        SSVAL(req->out.vwv,VWV(11),parms->in.data.length);
-       SSVAL(req->out.vwv,VWV(12),PTR_DIFF(outdata,req->out.hdr));
+       SSVAL(req->out.vwv,VWV(12),PTR_DIFF(outdata,req->out.hdr)+namelen);
        SSVAL(req->out.vwv,VWV(13),parms->in.setup_count);
        for (i=0;i<parms->in.setup_count;i++)   {
                SSVAL(req->out.vwv,VWV(14)+i*2,parms->in.setup[i]);
@@ -256,6 +269,23 @@ struct cli_request *smb_raw_trans2_send(struct cli_tree *tree,
        return req;
 }
 
+/****************************************************************************
+ trans/trans2 raw async interface - only BLOBs used in this interface.
+note that this doesn't yet support multi-part requests
+****************************************************************************/
+
+struct cli_request *smb_raw_trans_send(struct cli_tree *tree,
+                                      struct smb_trans2 *parms)
+{
+       return smb_raw_trans_send_backend(tree, parms, SMBtrans);
+}
+
+struct cli_request *smb_raw_trans2_send(struct cli_tree *tree,
+                                      struct smb_trans2 *parms)
+{
+       return smb_raw_trans_send_backend(tree, parms, SMBtrans2);
+}
+
 /*
   trans2 synchronous blob interface
 */
@@ -270,6 +300,19 @@ NTSTATUS smb_raw_trans2(struct cli_tree *tree,
 }
 
 
+/*
+  trans synchronous blob interface
+*/
+NTSTATUS smb_raw_trans(struct cli_tree *tree,
+                      TALLOC_CTX *mem_ctx,
+                      struct smb_trans2 *parms)
+{
+       struct cli_request *req;
+       req = smb_raw_trans_send(tree, parms);
+       if (!req) return NT_STATUS_UNSUCCESSFUL;
+       return smb_raw_trans_recv(req, mem_ctx, parms);
+}
+
 /****************************************************************************
   receive a SMB nttrans response allocating the necessary memory
   ****************************************************************************/
@@ -277,8 +320,8 @@ NTSTATUS smb_raw_nttrans_recv(struct cli_request *req,
                              TALLOC_CTX *mem_ctx,
                              struct smb_nttrans *parms)
 {
-       uint32 total_data, recvd_data=0;
-       uint32 total_param, recvd_param=0;
+       uint32_t total_data, recvd_data=0;
+       uint32_t total_param, recvd_param=0;
 
        if (!cli_request_receive(req) ||
            cli_request_is_error(req)) {
@@ -326,9 +369,9 @@ NTSTATUS smb_raw_nttrans_recv(struct cli_request *req,
        
        while (recvd_data < total_data || 
               recvd_param < total_param)  {
-               uint32 param_count, param_ofs, param_disp;
-               uint32 data_count, data_ofs, data_disp;
-               uint32 total_data2, total_param2;
+               uint32_t param_count, param_ofs, param_disp;
+               uint32_t data_count, data_ofs, data_disp;
+               uint32_t total_data2, total_param2;
 
                /* parse out the total lengths again - they can shrink! */
                total_param2 = IVAL(req->in.vwv, 3);