Removed version number from file header.
[ira/wip.git] / source3 / rpc_client / cli_spoolss.c
index 7417e0c0fc6f96ea0f312dc51bc5adca736b30ee..55becc198278bc5533aabbdaed1afe015f6c14ee 100644 (file)
@@ -1,6 +1,5 @@
 /*
- *  Unix SMB/Netbios implementation.
- *  Version 1.9.
+ *  Unix SMB/CIFS implementation.
  *  RPC Pipe client / server routines
  *  Copyright (C) Andrew Tridgell              1992-2000,
  *  Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
 
 #include "includes.h"
 #include "rpc_parse.h"
-#include "rpc_client.h"
 #include "nterr.h"
 
-extern int DEBUGLEVEL;
-
 /****************************************************************************
 do a SPOOLSS Enum Printer Drivers
 ****************************************************************************/
@@ -47,8 +43,8 @@ uint32 spoolss_enum_printerdrivers(const char *srv_name, const char *environment
         if (!cli_connection_init(srv_name, PIPE_SPOOLSS, &con))
                 return False;
 
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+        prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUM_PRINTERS */
 
@@ -59,34 +55,26 @@ uint32 spoolss_enum_printerdrivers(const char *srv_name, const char *environment
                                 level, buffer, offered);
 
         /* turn parameters into data stream */
-        if (!spoolss_io_q_enumprinterdrivers("", &q_o, &buf, 0) ) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-
-                cli_connection_unlink(con);
-        }
-
-        if(!rpc_con_pipe_req(con, SPOOLSS_ENUMPRINTERDRIVERS, &buf, &rbuf)) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-
-                cli_connection_unlink(con);
-        }
-
-        prs_mem_free(&buf);
-        ZERO_STRUCT(r_o);
-
-        prs_switch_type(&buffer->prs, UNMARSHALL);
-        prs_set_offset(&buffer->prs, 0);
-        r_o.buffer=buffer;
+        if (spoolss_io_q_enumprinterdrivers("", &q_o, &buf, 0) &&
+            rpc_con_pipe_req(con, SPOOLSS_ENUMPRINTERDRIVERS, &buf, &rbuf)) 
+       {
+               prs_mem_free(&buf);
+               ZERO_STRUCT(r_o);
 
-        if(!new_spoolss_io_r_enumprinterdrivers("", &r_o, &rbuf, 0)) {
-                prs_mem_free(&rbuf);
-                cli_connection_unlink(con);
-        }
+               prs_switch_type(&buffer->prs, UNMARSHALL);
+               prs_set_offset(&buffer->prs, 0);
+               r_o.buffer=buffer;
 
-        *needed=r_o.needed;
-        *returned=r_o.returned;
+               if(spoolss_io_r_enumprinterdrivers("", &r_o, &rbuf, 0)) 
+               {
+                       if (r_o.status != NT_STATUS_OK)
+                       {
+                               DEBUG(3,("SPOOLSS_ENUMPRINTERDRIVERS:  %s\n", get_nt_error_msg(r_o.status)));
+                       }
+                       *needed=r_o.needed;
+                       *returned=r_o.returned;
+               }
+       }
 
         prs_mem_free(&rbuf);
         prs_mem_free(&buf );
@@ -114,8 +102,8 @@ uint32 spoolss_enum_printers(uint32 flags, fstring srv_name, uint32 level,
         if (!cli_connection_init(srv_name, PIPE_SPOOLSS, &con))
                 return False;
 
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+        prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUM_PRINTERS */
 
@@ -124,35 +112,29 @@ uint32 spoolss_enum_printers(uint32 flags, fstring srv_name, uint32 level,
         make_spoolss_q_enumprinters(&q_o, flags, "", level, buffer, offered);
 
         /* turn parameters into data stream */
-        if (!spoolss_io_q_enumprinters("", &q_o, &buf, 0) ) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-
-                cli_connection_unlink(con);
-        }
+        if (spoolss_io_q_enumprinters("", &q_o, &buf, 0) &&
+          rpc_con_pipe_req(con, SPOOLSS_ENUMPRINTERS, &buf, &rbuf)) 
+       {
+               ZERO_STRUCT(r_o);
 
-        if(!rpc_con_pipe_req(con, SPOOLSS_ENUMPRINTERS, &buf, &rbuf)) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
+               prs_switch_type(&buffer->prs, UNMARSHALL);
+               prs_set_offset(&buffer->prs, 0);
+               r_o.buffer=buffer;
 
-                cli_connection_unlink(con);
-        }
-
-        prs_mem_free(&buf );
-        ZERO_STRUCT(r_o);
+               if(new_spoolss_io_r_enumprinters("", &r_o, &rbuf, 0)) 
+               {
+                       if (r_o.status != NT_STATUS_OK)
+                       {
+                               /* report error code */
+                               DEBUG(3,("SPOOLSS_ENUMPRINTERS: %s\n", get_nt_error_msg(r_o.status)));
+                       }
 
-        prs_switch_type(&buffer->prs, UNMARSHALL);
-        prs_set_offset(&buffer->prs, 0);
-        r_o.buffer=buffer;
+                       *needed=r_o.needed;
+                       *returned=r_o.returned;
+               }
 
-        if(!new_spoolss_io_r_enumprinters("", &r_o, &rbuf, 0)) {
-                prs_mem_free(&rbuf);
-                cli_connection_unlink(con);
         }
 
-        *needed=r_o.needed;
-        *returned=r_o.returned;
-
         prs_mem_free(&rbuf);
         prs_mem_free(&buf );
 
@@ -179,8 +161,8 @@ uint32 spoolss_enum_ports(fstring srv_name, uint32 level,
         if (!cli_connection_init(srv_name, PIPE_SPOOLSS, &con))
                 return False;
 
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+        prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUMPORTS */
 
@@ -189,35 +171,28 @@ uint32 spoolss_enum_ports(fstring srv_name, uint32 level,
         make_spoolss_q_enumports(&q_o, "", level, buffer, offered);
 
         /* turn parameters into data stream */
-        if (!spoolss_io_q_enumports("", &q_o, &buf, 0) ) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-
-                cli_connection_unlink(con);
-        }
-
-        if(!rpc_con_pipe_req(con, SPOOLSS_ENUMPORTS, &buf, &rbuf)) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-
-                cli_connection_unlink(con);
-        }
-
-        prs_mem_free(&buf );
-        ZERO_STRUCT(r_o);
+        if (spoolss_io_q_enumports("", &q_o, &buf, 0) &&
+            rpc_con_pipe_req(con, SPOOLSS_ENUMPORTS, &buf, &rbuf))
+       {
+               prs_mem_free(&buf );
+               ZERO_STRUCT(r_o);
 
-        prs_switch_type(&buffer->prs, UNMARSHALL);
-        prs_set_offset(&buffer->prs, 0);
-        r_o.buffer=buffer;
+               prs_switch_type(&buffer->prs, UNMARSHALL);
+               prs_set_offset(&buffer->prs, 0);
+               r_o.buffer=buffer;
 
-        if(!new_spoolss_io_r_enumports("", &r_o, &rbuf, 0)) {
-                prs_mem_free(&rbuf);
-                cli_connection_unlink(con);
+               if(new_spoolss_io_r_enumports("", &r_o, &rbuf, 0)) 
+               {
+                       if (r_o.status != NT_STATUS_OK)
+                       {
+                               DEBUG(3,("SPOOLSS_ENUMPORTS: %s\n", get_nt_error_msg(r_o.status)));
+                       }
+                       
+                       *needed=r_o.needed;
+                       *returned=r_o.returned;
+               }
         }
 
-        *needed=r_o.needed;
-        *returned=r_o.returned;
-
         prs_mem_free(&rbuf);
         prs_mem_free(&buf );
 
@@ -242,8 +217,8 @@ uint32 spoolss_enum_jobs(const POLICY_HND *hnd, uint32 firstjob, uint32 numofjob
         if (hnd == NULL)
                 return NT_STATUS_INVALID_PARAMETER;
 
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+        prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUMJOBS */
 
@@ -252,28 +227,24 @@ uint32 spoolss_enum_jobs(const POLICY_HND *hnd, uint32 firstjob, uint32 numofjob
         make_spoolss_q_enumjobs(&q_o, hnd, firstjob, numofjobs, level, buffer, offered);
 
         /* turn parameters into data stream */
-        if (!spoolss_io_q_enumjobs("", &q_o, &buf, 0)) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-        }
-
-        if(!rpc_hnd_pipe_req(hnd, SPOOLSS_ENUMJOBS, &buf, &rbuf))
+        if (spoolss_io_q_enumjobs("", &q_o, &buf, 0) &&
+            rpc_hnd_pipe_req(hnd, SPOOLSS_ENUMJOBS, &buf, &rbuf))
         {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-        }
-
-        ZERO_STRUCT(r_o);
-        prs_mem_free(&buf );
+               ZERO_STRUCT(r_o);
+               prs_mem_free(&buf );
 
-        r_o.buffer=buffer;
+               r_o.buffer=buffer;
 
-        if(!spoolss_io_r_enumjobs("", &r_o, &rbuf, 0)) {
-                prs_mem_free(&rbuf);
-        }
-
-        *needed=r_o.needed;
-        *returned=r_o.returned;
+               if(spoolss_io_r_enumjobs("", &r_o, &rbuf, 0)) 
+               {
+                       if (r_o.status != NT_STATUS_OK)
+                       {
+                               DEBUG(3,("SPOOLSS_ENUMJOBS: %s\n", get_nt_error_msg(r_o.status)));
+                       }
+                       *needed=r_o.needed;
+                       *returned=r_o.returned;
+               }
+       }
 
         prs_mem_free(&rbuf);
         prs_mem_free(&buf );
@@ -303,8 +274,8 @@ uint32 spoolss_enum_printerdata(const POLICY_HND *hnd, uint32 idx,
                DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
                return False;
        }
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, mem_ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, mem_ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
+        prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api  SPOOLSS_ENUMPRINTERDATA*/
 
@@ -313,31 +284,30 @@ uint32 spoolss_enum_printerdata(const POLICY_HND *hnd, uint32 idx,
         make_spoolss_q_enumprinterdata(&q_o, hnd, idx, *valuelen, *datalen);
 
         /* turn parameters into data stream */
-        if (!spoolss_io_q_enumprinterdata("", &q_o, &buf, 0)) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-        }
-
-        if(!rpc_hnd_pipe_req(hnd, SPOOLSS_ENUMPRINTERDATA, &buf, &rbuf)) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-        }
-
-        ZERO_STRUCT(r_o);
-        prs_mem_free(&buf );
+        if (spoolss_io_q_enumprinterdata("", &q_o, &buf, 0) &&
+            rpc_hnd_pipe_req(hnd, SPOOLSS_ENUMPRINTERDATA, &buf, &rbuf)) 
+       {
+               ZERO_STRUCT(r_o);
+               prs_mem_free(&buf );
 
-        r_o.data=data;
-        r_o.value=value;
+               r_o.data=data;
+               r_o.value=value;
 
-        if(!spoolss_io_r_enumprinterdata("", &r_o, &rbuf, 0)) {
-                prs_mem_free(&rbuf);
-        }
+               if(spoolss_io_r_enumprinterdata("", &r_o, &rbuf, 0))
+               {
+                       if (r_o.status != NT_STATUS_OK)
+                       {
+                               DEBUG(3,("SPOOLSS_ENUMPRINTERDATA: %s\n", get_nt_error_msg(r_o.status)));
+                       }
+                       
+                       *valuelen=r_o.valuesize;
+                       *rvaluelen=r_o.realvaluesize;
+                       *type=r_o.type;
+                       *datalen=r_o.datasize;
+                       *rdatalen=r_o.realdatasize;
 
-        *valuelen=r_o.valuesize;
-        *rvaluelen=r_o.realvaluesize;
-        *type=r_o.type;
-        *datalen=r_o.datasize;
-        *rdatalen=r_o.realdatasize;
+               }
+       }
 
         prs_mem_free(&rbuf);
         prs_mem_free(&buf );
@@ -363,8 +333,8 @@ uint32 spoolss_getprinter(const POLICY_HND *hnd, uint32 level,
         if (hnd == NULL)
                 return NT_STATUS_INVALID_PARAMETER;
 
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+        prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUMJOBS */
 
@@ -373,28 +343,25 @@ uint32 spoolss_getprinter(const POLICY_HND *hnd, uint32 level,
         make_spoolss_q_getprinter(&q_o, hnd, level, buffer, offered);
 
         /* turn parameters into data stream */
-        if (!spoolss_io_q_getprinter("", &q_o, &buf, 0)) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-        }
-
-        if(!rpc_hnd_pipe_req(hnd, SPOOLSS_GETPRINTER, &buf, &rbuf)) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-        }
-
-        ZERO_STRUCT(r_o);
-        prs_mem_free(&buf );
+        if (spoolss_io_q_getprinter("", &q_o, &buf, 0) &&
+             rpc_hnd_pipe_req(hnd, SPOOLSS_GETPRINTER, &buf, &rbuf)) 
+       {
+               ZERO_STRUCT(r_o);
+               prs_mem_free(&buf );
 
-        prs_switch_type(&buffer->prs, UNMARSHALL);
-        prs_set_offset(&buffer->prs, 0);
-        r_o.buffer=buffer;
+               prs_switch_type(&buffer->prs, UNMARSHALL);
+               prs_set_offset(&buffer->prs, 0);
+               r_o.buffer=buffer;
 
-        if(!spoolss_io_r_getprinter("", &r_o, &rbuf, 0)) {
-                prs_mem_free(&rbuf);
-        }
-
-        *needed=r_o.needed;
+               if(!spoolss_io_r_getprinter("", &r_o, &rbuf, 0)) 
+               {
+                       if (r_o.status != NT_STATUS_OK)
+                       {
+                               DEBUG(3,("SPOOLSS_GETPRINTER: %s\n", get_nt_error_msg(r_o.status)));
+                       }
+                       *needed=r_o.needed;
+               }
+       }
 
         prs_mem_free(&rbuf);
         prs_mem_free(&buf );
@@ -419,8 +386,8 @@ uint32 spoolss_getprinterdriver(const POLICY_HND *hnd,
         if (hnd == NULL)
                 return NT_STATUS_INVALID_PARAMETER;
 
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+        prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUMJOBS */
 
@@ -429,28 +396,26 @@ uint32 spoolss_getprinterdriver(const POLICY_HND *hnd,
         make_spoolss_q_getprinterdriver2(&q_o, hnd, environment, level, 2, 0, buffer, offered);
 
         /* turn parameters into data stream */
-        if (!spoolss_io_q_getprinterdriver2("", &q_o, &buf, 0)) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-        }
-
-        if(!rpc_hnd_pipe_req(hnd, SPOOLSS_GETPRINTERDRIVER2, &buf, &rbuf)) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-        }
-
-        ZERO_STRUCT(r_o);
-        prs_mem_free(&buf );
+        if (spoolss_io_q_getprinterdriver2("", &q_o, &buf, 0) &&
+            rpc_hnd_pipe_req(hnd, SPOOLSS_GETPRINTERDRIVER2, &buf, &rbuf)) 
+       {
+               ZERO_STRUCT(r_o);
+               prs_mem_free(&buf );
 
-        prs_switch_type(&buffer->prs, UNMARSHALL);
-        prs_set_offset(&buffer->prs, 0);
-        r_o.buffer=buffer;
+               prs_switch_type(&buffer->prs, UNMARSHALL);
+               prs_set_offset(&buffer->prs, 0);
+               r_o.buffer=buffer;
 
-        if(!spoolss_io_r_getprinterdriver2("", &r_o, &rbuf, 0)) {
-                prs_mem_free(&rbuf);
-        }
+               if(spoolss_io_r_getprinterdriver2("", &r_o, &rbuf, 0)) 
+               {
+                       if (r_o.status != NT_STATUS_OK)
+                       {
+                               DEBUG(3,("SPOOLSS_GETPRINTERDRIVER2: %s\n", get_nt_error_msg(r_o.status)));
+                       }
 
-        *needed=r_o.needed;
+                       *needed=r_o.needed;
+               }
+       }
 
         prs_mem_free(&rbuf);
         prs_mem_free(&buf );
@@ -480,7 +445,7 @@ BOOL spoolss_open_printer_ex(  const char *printername,
         memset(srv_name, 0, sizeof(srv_name));
         fstrcpy(srv_name, printername);
 
-        s = strchr(&srv_name[2], '\\');
+        s = strchr_m(&srv_name[2], '\\');
        if (s != NULL)
                *s = '\0';
 
@@ -495,8 +460,8 @@ BOOL spoolss_open_printer_ex(  const char *printername,
                DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
                return False;
        }
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, mem_ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, mem_ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
+        prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_OPENPRINTEREX */
 
@@ -517,7 +482,7 @@ BOOL spoolss_open_printer_ex(  const char *printername,
                 if (prs_offset(&rbuf)!= 0 && r_o.status != 0)
                 {
                         /* report error code */
-                        DEBUG(5,("SPOOLSS_OPENPRINTEREX: %s\n", get_nt_error_msg(r_o.status)));
+                        DEBUG(3,("SPOOLSS_OPENPRINTEREX: %s\n", get_nt_error_msg(r_o.status)));
                         p = False;
                 }
 
@@ -553,7 +518,7 @@ BOOL spoolss_addprinterex(POLICY_HND *hnd, const char* srv_name, PRINTER_INFO_2
         SPOOL_R_ADDPRINTEREX r_o;
        struct cli_connection *con = NULL;
        TALLOC_CTX *mem_ctx = NULL;
-        fstring client_name;
+        fstring the_client_name;
        BOOL valid_pol = True;
 
 
@@ -569,18 +534,18 @@ BOOL spoolss_addprinterex(POLICY_HND *hnd, const char* srv_name, PRINTER_INFO_2
                DEBUG(0,("spoolss_addprinterex: talloc_init() failed!\n"));
                return NT_STATUS_ACCESS_DENIED;
        }
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, mem_ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, mem_ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
+        prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUMPORTS */
         DEBUG(5,("SPOOLSS Add Printer Ex (Server: %s)\n", srv_name));
        
-        fstrcpy(client_name, "\\\\");
-        fstrcat(client_name, con->pCli_state->desthost);
-        strupper(client_name);
+        fstrcpy(the_client_name, "\\\\");
+        fstrcat(the_client_name, con->pCli_state->desthost);
+        strupper(the_client_name);
        
 
-        make_spoolss_q_addprinterex(&q_o, srv_name, client_name, 
+        make_spoolss_q_addprinterex(mem_ctx, &q_o, srv_name, the_client_name, 
                                    /* "Administrator", */
                                    con->pCli_state->user_name,
                                    2, info2);
@@ -593,10 +558,10 @@ BOOL spoolss_addprinterex(POLICY_HND *hnd, const char* srv_name, PRINTER_INFO_2
 
                if(spoolss_io_r_addprinterex("", &r_o, &rbuf, 0)) 
                {
-                       if (r_o.status != NT_STATUS_NO_PROBLEMO)
+                       if (r_o.status != NT_STATUS_OK)
                         {
                                /* report error code */
-                               DEBUG(0,("SPOOLSS_ADDPRINTEREX: %s\n", get_nt_error_msg(r_o.status)));
+                               DEBUG(3,("SPOOLSS_ADDPRINTEREX: %s\n", get_nt_error_msg(r_o.status)));
                                valid_pol = False;
                        }
                }
@@ -615,7 +580,6 @@ BOOL spoolss_addprinterex(POLICY_HND *hnd, const char* srv_name, PRINTER_INFO_2
 
         prs_mem_free(&rbuf);
         prs_mem_free(&buf );
-       free_spoolss_q_addprinterex(&q_o);
 
        if (mem_ctx)
                talloc_destroy(mem_ctx);
@@ -643,8 +607,8 @@ BOOL spoolss_closeprinter(POLICY_HND *hnd)
                DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
                return False;
        }
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, mem_ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, mem_ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
+        prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
 
         DEBUG(4,("SPOOL Close Printer\n"));
 
@@ -662,7 +626,7 @@ BOOL spoolss_closeprinter(POLICY_HND *hnd)
                 if (prs_offset(&rbuf)!=0 && r_c.status != 0)
                 {
                         /* report error code */
-                        DEBUG(0,("SPOOL_CLOSEPRINTER: %s\n", get_nt_error_msg(r_c.status)));
+                        DEBUG(3,("SPOOL_CLOSEPRINTER: %s\n", get_nt_error_msg(r_c.status)));
                 }
                else
                        valid_close = True;
@@ -703,38 +667,36 @@ uint32 spoolss_getprinterdata(const POLICY_HND *hnd, const UNISTR2 *valuename,
                DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
                return False;
        }
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, mem_ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, mem_ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
+        prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_GETPRINTERDATA */
 
         DEBUG(5,("SPOOLSS Get Printer data)\n"));
 
-        make_spoolss_q_getprinterdata(&q_o, hnd, valuename, in_size);
+        make_spoolss_q_getprinterdata(&q_o, hnd,(UNISTR2 *)valuename, in_size);
 
         /* turn parameters into data stream */
-        if (!spoolss_io_q_getprinterdata("", &q_o, &buf, 0)) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-        }
-
-        if (!rpc_hnd_pipe_req(hnd, SPOOLSS_GETPRINTERDATA, &buf, &rbuf)) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-        }
-
-        ZERO_STRUCT(r_o);
-        prs_mem_free(&buf );
+        if (spoolss_io_q_getprinterdata("", &q_o, &buf, 0) &&
+             rpc_hnd_pipe_req(hnd, SPOOLSS_GETPRINTERDATA, &buf, &rbuf)) 
+       {
+               ZERO_STRUCT(r_o);
+               prs_mem_free(&buf );
 
-        r_o.data=data;
+               r_o.data=data;
 
-        if(!spoolss_io_r_getprinterdata("", &r_o, &rbuf, 0)) {
-                prs_mem_free(&rbuf);
-        }
+               if(spoolss_io_r_getprinterdata("", &r_o, &rbuf, 0)) 
+               {
+                       if (r_o.status != NT_STATUS_OK)
+                       {
+                               DEBUG(3,("SPOOLSS_GETPRINTERDATA: %s\n", get_nt_error_msg(r_o.status)));
+                       }
 
-        *type=r_o.type;
-        *out_size=r_o.size;
-        *needed=r_o.needed;
+                       *type=r_o.type;
+                       *out_size=r_o.size;
+                       *needed=r_o.needed;
+               }
+       }
 
         prs_mem_free(&rbuf);
         prs_mem_free(&buf );
@@ -760,8 +722,8 @@ uint32 spoolss_getprinterdriverdir(fstring srv_name, fstring env_name, uint32 le
         if (!cli_connection_init(srv_name, PIPE_SPOOLSS, &con))
                 return False;
 
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+        prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUM_PRINTERS */
 
@@ -772,32 +734,26 @@ uint32 spoolss_getprinterdriverdir(fstring srv_name, fstring env_name, uint32 le
                                           buffer, offered);
 
         /* turn parameters into data stream */
-        if (!spoolss_io_q_getprinterdriverdir("", &q_o, &buf, 0) ) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-
-                cli_connection_unlink(con);
-        }
-
-        if(!rpc_con_pipe_req(con, SPOOLSS_GETPRINTERDRIVERDIRECTORY, &buf, &rbuf)) {
-                prs_mem_free(&rbuf);
-                prs_mem_free(&buf );
-
-                cli_connection_unlink(con);
-        }
+        if (spoolss_io_q_getprinterdriverdir("", &q_o, &buf, 0) &&
+             rpc_con_pipe_req(con, SPOOLSS_GETPRINTERDRIVERDIRECTORY, &buf, &rbuf)) 
+       {
+               prs_mem_free(&buf );
+               ZERO_STRUCT(r_o);
 
-        prs_mem_free(&buf );
-        ZERO_STRUCT(r_o);
+               prs_switch_type(&buffer->prs, UNMARSHALL);
+               prs_set_offset(&buffer->prs, 0);
+               r_o.buffer=buffer;
 
-        prs_switch_type(&buffer->prs, UNMARSHALL);
-        prs_set_offset(&buffer->prs, 0);
-        r_o.buffer=buffer;
+               if(spoolss_io_r_getprinterdriverdir("", &r_o, &rbuf, 0)) 
+               {
+                       if (r_o.status != NT_STATUS_OK)
+                       {
+                               DEBUG(3,("SPOOLSS_GETPRINTERDRIVERDIRECTORY: %s\n", get_nt_error_msg(r_o.status)));
+                       }
 
-        if(!spoolss_io_r_getprinterdriverdir("", &r_o, &rbuf, 0)) {
-                prs_mem_free(&rbuf);
-                cli_connection_unlink(con);
-        }
-        *needed=r_o.needed;
+                       *needed=r_o.needed;
+               }
+       }
 
         prs_mem_free(&rbuf);
         prs_mem_free(&buf );
@@ -827,11 +783,11 @@ uint32 spoolss_addprinterdriver(const char *srv_name, uint32 level, PRINTER_DRIV
                DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
                return False;
        }
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, mem_ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, mem_ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
+        prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
        
        /* make the ADDPRINTERDRIVER PDU */
-       make_spoolss_q_addprinterdriver(&q_o, srv_name, level, info);
+       make_spoolss_q_addprinterdriver(mem_ctx, &q_o, srv_name, level, info);
 
        /* turn the data into an io stream */
         if (spoolss_io_q_addprinterdriver("", &q_o, &buf, 0) &&
@@ -839,17 +795,19 @@ uint32 spoolss_addprinterdriver(const char *srv_name, uint32 level, PRINTER_DRIV
        {
                ZERO_STRUCT(r_o);
 
-               if(!spoolss_io_r_addprinterdriver("", &r_o, &rbuf, 0)) 
+               if(spoolss_io_r_addprinterdriver("", &r_o, &rbuf, 0)) 
                {
-                        /* report error code */
-                        DEBUG(5,("SPOOLSS_ADDPRINTEREX: %s\n", get_nt_error_msg(r_o.status)));
+                       if (r_o.status != NT_STATUS_OK)
+                       {
+                               /* report error code */
+                               DEBUG(3,("SPOOLSS_ADDPRINTERDRIVER: %s\n", get_nt_error_msg(r_o.status)));
+                       }
                }
         }
 
 
         prs_mem_free(&rbuf);
         prs_mem_free(&buf );
-       free_spool_driver_info_3(q_o.info.info_3);
 
        if (mem_ctx)
                talloc_destroy(mem_ctx);
@@ -857,5 +815,3 @@ uint32 spoolss_addprinterdriver(const char *srv_name, uint32 level, PRINTER_DRIV
        return r_o.status;
 
 }
-
-