[GLUE] Rsync SAMBA_3_2_0 SVN r25598 in order to create the v3-2-test branch.
[sfrench/samba-autobuild/.git] / source3 / rpc_server / srv_spoolss_nt.c
index 890d2e08855f52f1afe67c74f2f6e8158c1e96d7..11827c223bb19320ec3cc485739b2611e0fa7610 100644 (file)
@@ -10,7 +10,7 @@
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
+ *  the Free Software Foundation; either version 3 of the License, or
  *  (at your option) any later version.
  *
  *  This program is distributed in the hope that it will be useful,
@@ -19,8 +19,7 @@
  *  GNU General Public License for more details.
  *
  *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 /* Since the SPOOLSS rpc routines are basically DOS 16-bit calls wrapped
@@ -64,7 +63,7 @@ static uint32 smb_connections=0;
 
 /* in printing/nt_printing.c */
 
-extern STANDARD_MAPPING printer_std_mapping, printserver_std_mapping;
+extern struct standard_mapping printer_std_mapping, printserver_std_mapping;
 
 /* API table for Xcv Monitor functions */
 
@@ -313,7 +312,7 @@ WERROR delete_printer_hook( NT_USER_TOKEN *token, const char *sharename )
        if ( (ret = smbrun(command, NULL)) == 0 ) {
                /* Tell everyone we updated smb.conf. */
                message_send_all(smbd_messaging_context(),
-                                MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
+                                MSG_SMB_CONF_UPDATED, NULL, 0, NULL);
        }
                
        if ( is_print_op )
@@ -329,7 +328,7 @@ WERROR delete_printer_hook( NT_USER_TOKEN *token, const char *sharename )
        /* go ahead and re-read the services immediately */
        reload_services( False );
        
-       if ( share_defined( sharename ) )
+       if ( lp_servicenumber( sharename )  < 0 )
                return WERR_ACCESS_DENIED;
                
        return WERR_OK;
@@ -389,13 +388,6 @@ static BOOL get_printer_snum(pipes_struct *p, POLICY_HND *hnd, int *number,
                case SPLHND_PRINTER:            
                        DEBUG(4,("short name:%s\n", Printer->sharename));                       
                        *number = print_queue_snum(Printer->sharename);
-                       if ((*number != -1) && (params != NULL)) {
-                               *params = get_share_params(tmp_talloc_ctx(),
-                                                          Printer->sharename);
-                               if (*params == NULL) {
-                                       return False;
-                               }
-                       }
                        return (*number != -1);
                case SPLHND_SERVER:
                        return False;
@@ -1550,7 +1542,7 @@ WERROR _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u,
        /* some sanity check because you can open a printer or a print server */
        /* aka: \\server\printer or \\server */
 
-       unistr2_to_ascii(name, q_u->printername, sizeof(name)-1);
+       unistr2_to_ascii(name, q_u->printername, sizeof(name));
 
        DEBUGADD(3,("checking name: %s\n",name));
 
@@ -1998,8 +1990,8 @@ WERROR _spoolss_deleteprinterdriver(pipes_struct *p, SPOOL_Q_DELETEPRINTERDRIVER
                return WERR_ACCESS_DENIED;
        }
 
-       unistr2_to_ascii(driver, &q_u->driver, sizeof(driver)-1 );
-       unistr2_to_ascii(arch,   &q_u->arch,   sizeof(arch)-1   );
+       unistr2_to_ascii(driver, &q_u->driver, sizeof(driver));
+       unistr2_to_ascii(arch,   &q_u->arch,   sizeof(arch));
        
        /* check that we have a valid driver name first */
        
@@ -2093,8 +2085,8 @@ WERROR _spoolss_deleteprinterdriverex(pipes_struct *p, SPOOL_Q_DELETEPRINTERDRIV
                return WERR_ACCESS_DENIED;
        }
        
-       unistr2_to_ascii(driver, &q_u->driver, sizeof(driver)-1 );
-       unistr2_to_ascii(arch,   &q_u->arch,   sizeof(arch)-1   );
+       unistr2_to_ascii(driver, &q_u->driver, sizeof(driver));
+       unistr2_to_ascii(arch,   &q_u->arch,   sizeof(arch));
 
        /* check that we have a valid driver name first */
        if ((version=get_version_id(arch)) == -1) {
@@ -2276,6 +2268,7 @@ static WERROR getprinterdata_printer_server(TALLOC_CTX *ctx, fstring value, uint
                *type = REG_DWORD;
                if ( !(*data = TALLOC_ARRAY(ctx, uint8, sizeof(uint32) )) )
                        return WERR_NOMEM;
+               SIVAL(*data, 0, 0x00);
                *needed = 0x4;
                return WERR_OK;
        }
@@ -2470,7 +2463,7 @@ WERROR _spoolss_getprinterdata(pipes_struct *p, SPOOL_Q_GETPRINTERDATA *q_u, SPO
                goto done;
        }
        
-       unistr2_to_ascii(value, valuename, sizeof(value)-1);
+       unistr2_to_ascii(value, valuename, sizeof(value));
        
        if ( Printer->printer_type == SPLHND_SERVER )
                status = getprinterdata_printer_server( p->mem_ctx, value, type, data, needed, *out_size );
@@ -2688,7 +2681,7 @@ WERROR _spoolss_rffpcnex(pipes_struct *p, SPOOL_Q_RFFPCNEX *q_u, SPOOL_R_RFFPCNE
        Printer->notify.option=dup_spool_notify_option(option);
 
        unistr2_to_ascii(Printer->notify.localmachine, localmachine, 
-                      sizeof(Printer->notify.localmachine)-1);
+                      sizeof(Printer->notify.localmachine));
 
        /* Connect to the client machine and send a ReplyOpenPrinter */
 
@@ -3953,9 +3946,7 @@ done:
  * fill a printer_info_0 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_0(Printer_entry *print_hnd,
-                                    PRINTER_INFO_0 *printer,
-                                    const struct share_params *params)
+static BOOL construct_printer_info_0(Printer_entry *print_hnd, PRINTER_INFO_0 *printer, int snum)
 {
        pstring chaine;
        int count;
@@ -3966,15 +3957,14 @@ static BOOL construct_printer_info_0(Printer_entry *print_hnd,
        time_t setuptime;
        print_status_struct status;
        
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
-                                        lp_const_servicename(params->service))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
                return False;
 
-       count = print_queue_length(params->service, &status);
+       count = print_queue_length(snum, &status);
 
        /* check if we already have a counter for this printer */       
        for(session_counter = counter_list; session_counter; session_counter = session_counter->next) {
-               if (session_counter->snum == params->service)
+               if (session_counter->snum == snum)
                        break;
        }
 
@@ -3985,7 +3975,7 @@ static BOOL construct_printer_info_0(Printer_entry *print_hnd,
                        return False;
                }
                ZERO_STRUCTP(session_counter);
-               session_counter->snum=params->service;
+               session_counter->snum=snum;
                session_counter->counter=0;
                DLIST_ADD(counter_list, session_counter);
        }
@@ -4061,25 +4051,21 @@ static BOOL construct_printer_info_0(Printer_entry *print_hnd,
  * construct_printer_info_1
  * fill a printer_info_1 struct
  ********************************************************************/
-static BOOL construct_printer_info_1(Printer_entry *print_hnd, uint32 flags,
-                                    PRINTER_INFO_1 *printer,
-                                    const struct share_params *params)
+static BOOL construct_printer_info_1(Printer_entry *print_hnd, uint32 flags, PRINTER_INFO_1 *printer, int snum)
 {
        pstring chaine;
        pstring chaine2;
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
 
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
-                                        lp_const_servicename(params->service))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
                return False;
 
        printer->flags=flags;
 
        if (*ntprinter->info_2->comment == '\0') {
-               init_unistr(&printer->comment, lp_comment(params->service));
+               init_unistr(&printer->comment, lp_comment(snum));
                slprintf(chaine,sizeof(chaine)-1,"%s,%s,%s", ntprinter->info_2->printername,
-                       ntprinter->info_2->drivername,
-                        lp_comment(params->service));
+                       ntprinter->info_2->drivername, lp_comment(snum));
        }
        else {
                init_unistr(&printer->comment, ntprinter->info_2->comment); /* saved comment. */
@@ -4170,7 +4156,7 @@ DEVICEMODE *construct_dev_mode(const char *servicename)
        
        DEBUGADD(8,("getting printer characteristics\n"));
 
-       if (!W_ERROR_IS_OK(get_a_printer(NULL, &printer, 2, servicename)))
+       if (!W_ERROR_IS_OK(get_a_printer(NULL, &printer, 2, servicename))) 
                return NULL;
 
        if ( !printer->info_2->devmode ) {
@@ -4203,29 +4189,26 @@ done:
  * fill a printer_info_2 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_2(Printer_entry *print_hnd,
-                                    PRINTER_INFO_2 *printer,
-                                    const struct share_params *params)
+static BOOL construct_printer_info_2(Printer_entry *print_hnd, PRINTER_INFO_2 *printer, int snum)
 {
        int count;
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
 
        print_status_struct status;
 
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
-                                        lp_const_servicename(params->service))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
                return False;
                
-       count = print_queue_length(params->service, &status);
+       count = print_queue_length(snum, &status);
 
        init_unistr(&printer->servername, ntprinter->info_2->servername); /* servername*/
        init_unistr(&printer->printername, ntprinter->info_2->printername);                             /* printername*/
-       init_unistr(&printer->sharename, lp_servicename(params->service));                      /* sharename */
+       init_unistr(&printer->sharename, lp_servicename(snum));                 /* sharename */
        init_unistr(&printer->portname, ntprinter->info_2->portname);                   /* port */      
        init_unistr(&printer->drivername, ntprinter->info_2->drivername);       /* drivername */
 
        if (*ntprinter->info_2->comment == '\0')
-               init_unistr(&printer->comment, lp_comment(params->service));                    /* comment */   
+               init_unistr(&printer->comment, lp_comment(snum));                       /* comment */   
        else
                init_unistr(&printer->comment, ntprinter->info_2->comment); /* saved comment. */
 
@@ -4246,7 +4229,7 @@ static BOOL construct_printer_info_2(Printer_entry *print_hnd,
        printer->averageppm = ntprinter->info_2->averageppm;                    /* average pages per minute */
                        
        if ( !(printer->devmode = construct_dev_mode(
-                      lp_const_servicename(params->service))) )
+                      lp_const_servicename(snum))) )
                DEBUG(8, ("Returning NULL Devicemode!\n"));
 
        printer->secdesc = NULL;
@@ -4257,7 +4240,7 @@ static BOOL construct_printer_info_2(Printer_entry *print_hnd,
                /* don't use talloc_steal() here unless you do a deep steal of all 
                   the SEC_DESC members */
 
-               printer->secdesc = dup_sec_desc( get_talloc_ctx(), 
+               printer->secdesc = dup_sec_desc( talloc_tos(),
                        ntprinter->info_2->secdesc_buf->sd );
        }
 
@@ -4271,15 +4254,12 @@ static BOOL construct_printer_info_2(Printer_entry *print_hnd,
  * fill a printer_info_3 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_3(Printer_entry *print_hnd,
-                                    PRINTER_INFO_3 **pp_printer,
-                                    const struct share_params *params)
+static BOOL construct_printer_info_3(Printer_entry *print_hnd, PRINTER_INFO_3 **pp_printer, int snum)
 {
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
        PRINTER_INFO_3 *printer = NULL;
 
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
-                                        lp_const_servicename(params->service))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
                return False;
 
        *pp_printer = NULL;
@@ -4297,7 +4277,7 @@ static BOOL construct_printer_info_3(Printer_entry *print_hnd,
                /* don't use talloc_steal() here unless you do a deep steal of all 
                   the SEC_DESC members */
 
-               printer->secdesc = dup_sec_desc( get_talloc_ctx(), 
+               printer->secdesc = dup_sec_desc( talloc_tos(),
                        ntprinter->info_2->secdesc_buf->sd );
        }
 
@@ -4312,14 +4292,11 @@ static BOOL construct_printer_info_3(Printer_entry *print_hnd,
  * fill a printer_info_4 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_4(Printer_entry *print_hnd,
-                                    PRINTER_INFO_4 *printer,
-                                    const struct share_params *params)
+static BOOL construct_printer_info_4(Printer_entry *print_hnd, PRINTER_INFO_4 *printer, int snum)
 {
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
 
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
-                                        lp_const_servicename(params->service))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
                return False;
                
        init_unistr(&printer->printername, ntprinter->info_2->printername);                             /* printername*/
@@ -4335,14 +4312,11 @@ static BOOL construct_printer_info_4(Printer_entry *print_hnd,
  * fill a printer_info_5 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_5(Printer_entry *print_hnd,
-                                    PRINTER_INFO_5 *printer,
-                                    const struct share_params *params)
+static BOOL construct_printer_info_5(Printer_entry *print_hnd, PRINTER_INFO_5 *printer, int snum)
 {
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
 
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
-                                        lp_const_servicename(params->service))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
                return False;
                
        init_unistr(&printer->printername, ntprinter->info_2->printername);
@@ -4366,17 +4340,17 @@ static BOOL construct_printer_info_5(Printer_entry *print_hnd,
 
 static BOOL construct_printer_info_6(Printer_entry *print_hnd,
                                     PRINTER_INFO_6 *printer,
-                                    const struct share_params *params)
+                                    int snum)
 {
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
        int count;
        print_status_struct status;
 
        if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
-                                        lp_const_servicename(params->service))))
+                                        lp_const_servicename(snum))))
                return False;
 
-       count = print_queue_length(params->service, &status);
+       count = print_queue_length(snum, &status);
 
        printer->status = nt_printq_status(status.status);
                
@@ -4390,14 +4364,12 @@ static BOOL construct_printer_info_6(Printer_entry *print_hnd,
  * fill a printer_info_7 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_7(Printer_entry *print_hnd,
-                                    PRINTER_INFO_7 *printer,
-                                    const struct share_params *params)
+static BOOL construct_printer_info_7(Printer_entry *print_hnd, PRINTER_INFO_7 *printer, int snum)
 {
        char *guid_str = NULL;
        struct GUID guid; 
        
-       if (is_printer_published(print_hnd, params->service, &guid)) {
+       if (is_printer_published(print_hnd, snum, &guid)) {
                asprintf(&guid_str, "{%s}", smb_uuid_string_static(guid));
                strupper_m(guid_str);
                init_unistr(&printer->guid, guid_str);
@@ -4416,45 +4388,31 @@ static BOOL construct_printer_info_7(Printer_entry *print_hnd,
 
 static WERROR enum_all_printers_info_1(uint32 flags, RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
 {
+       int snum;
        int i;
-       struct share_iterator *shares;
-       struct share_params *printer;
+       int n_services=lp_numservices();
        PRINTER_INFO_1 *printers=NULL;
+       PRINTER_INFO_1 current_prt;
        WERROR result = WERR_OK;
        
        DEBUG(4,("enum_all_printers_info_1\n"));        
 
-       if (!(shares = share_list_all(NULL))) {
-               DEBUG(5, ("Could not list printers\n"));
-               return WERR_ACCESS_DENIED;
-       }
+       for (snum=0; snum<n_services; snum++) {
+               if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) {
+                       DEBUG(4,("Found a printer in smb.conf: %s[%x]\n", lp_servicename(snum), snum));
 
-       while ((printer = next_printer(shares)) != NULL) {
-               PRINTER_INFO_1 current_prt;
-
-               DEBUG(4,("Found a printer in smb.conf: %s\n",
-                        lp_servicename(printer->service)));
-
-               if (!construct_printer_info_1(NULL, flags, &current_prt,
-                                             printer)) {
-                       continue;
-               }
+                       if (construct_printer_info_1(NULL, flags, &current_prt, snum)) {
+                               if((printers=SMB_REALLOC_ARRAY(printers, PRINTER_INFO_1, *returned +1)) == NULL) {
+                                       DEBUG(2,("enum_all_printers_info_1: failed to enlarge printers buffer!\n"));
+                                       *returned=0;
+                                       return WERR_NOMEM;
+                               }
+                               DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_1\n", *returned));             
 
-               if((printers=SMB_REALLOC_ARRAY(printers, PRINTER_INFO_1,
-                                              *returned +1)) == NULL) {
-                       DEBUG(2,("enum_all_printers_info_1: failed to enlarge "
-                                "printers buffer!\n"));
-                       *returned=0;
-                       TALLOC_FREE(shares);
-                       return WERR_NOMEM;
+                               memcpy(&printers[*returned], &current_prt, sizeof(PRINTER_INFO_1));
+                               (*returned)++;
+                       }
                }
-               DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_1\n",
-                        *returned));
-
-               memcpy(&printers[*returned], &current_prt,
-                      sizeof(PRINTER_INFO_1));
-               (*returned)++;
-               TALLOC_FREE(printer);
        }
                
        /* check the required size. */  
@@ -4479,7 +4437,6 @@ out:
        /* clear memory */
 
        SAFE_FREE(printers);
-       TALLOC_FREE(shares);
 
        if ( !W_ERROR_IS_OK(result) )
                *returned = 0;
@@ -4617,45 +4574,33 @@ static WERROR enum_all_printers_info_1_network(fstring name, RPC_BUFFER *buffer,
 
 static WERROR enum_all_printers_info_2(RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
 {
+       int snum;
        int i;
-       struct share_iterator *shares;
-       struct share_params *printer;
+       int n_services=lp_numservices();
        PRINTER_INFO_2 *printers=NULL;
+       PRINTER_INFO_2 current_prt;
        WERROR result = WERR_OK;
 
        *returned = 0;
 
-       if (!(shares = share_list_all(NULL))) {
-               DEBUG(5, ("Could not list printers\n"));
-               return WERR_ACCESS_DENIED;
-       }
+       for (snum=0; snum<n_services; snum++) {
+               if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) {
+                       DEBUG(4,("Found a printer in smb.conf: %s[%x]\n", lp_servicename(snum), snum));
+                               
+                       if (construct_printer_info_2(NULL, &current_prt, snum)) {
+                               if ( !(printers=SMB_REALLOC_ARRAY(printers, PRINTER_INFO_2, *returned +1)) ) {
+                                       DEBUG(2,("enum_all_printers_info_2: failed to enlarge printers buffer!\n"));
+                                       *returned = 0;
+                                       return WERR_NOMEM;
+                               }
 
-       while ((printer = next_printer(shares)) != NULL) {
-               PRINTER_INFO_2 current_prt;
+                               DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_2\n", *returned + 1));         
 
-               DEBUG(4,("Found a printer in smb.conf: %s\n",
-                        lp_servicename(printer->service)));
+                               memcpy(&printers[*returned], &current_prt, sizeof(PRINTER_INFO_2));
 
-               if (!construct_printer_info_2(NULL, &current_prt,
-                                             printer)) {
-                       continue;
-               }
-               if ( !(printers=SMB_REALLOC_ARRAY(printers, PRINTER_INFO_2,
-                                                 *returned +1)) ) {
-                       DEBUG(2,("enum_all_printers_info_2: failed to enlarge "
-                                "printers buffer!\n"));
-                       *returned = 0;
-                       TALLOC_FREE(shares);
-                       return WERR_NOMEM;
+                               (*returned)++;
+                       }
                }
-
-               DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_2\n",
-                        *returned + 1));
-
-               memcpy(&printers[*returned], &current_prt,
-                      sizeof(PRINTER_INFO_2));
-               (*returned)++;
-               TALLOC_FREE(printer);
        }
        
        /* check the required size. */  
@@ -4683,7 +4628,6 @@ out:
                free_devmode(printers[i].devmode);
 
        SAFE_FREE(printers);
-       TALLOC_FREE(shares);
 
        if ( !W_ERROR_IS_OK(result) )
                *returned = 0;
@@ -4804,7 +4748,7 @@ WERROR _spoolss_enumprinters( pipes_struct *p, SPOOL_Q_ENUMPRINTERS *q_u, SPOOL_
         * Level 5: same as Level 2
         */
 
-       unistr2_to_ascii(name, servername, sizeof(name)-1);
+       unistr2_to_ascii(name, servername, sizeof(name));
        strupper_m(name);
 
        switch (level) {
@@ -4824,10 +4768,7 @@ WERROR _spoolss_enumprinters( pipes_struct *p, SPOOL_Q_ENUMPRINTERS *q_u, SPOOL_
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_0(Printer_entry *print_hnd,
-                                const struct share_params *params,
-                                RPC_BUFFER *buffer, uint32 offered,
-                                uint32 *needed)
+static WERROR getprinter_level_0(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
 {
        PRINTER_INFO_0 *printer=NULL;
        WERROR result = WERR_OK;
@@ -4835,7 +4776,7 @@ static WERROR getprinter_level_0(Printer_entry *print_hnd,
        if((printer=SMB_MALLOC_P(PRINTER_INFO_0)) == NULL)
                return WERR_NOMEM;
 
-       construct_printer_info_0(print_hnd, printer, params);
+       construct_printer_info_0(print_hnd, printer, snum);
        
        /* check the required size. */  
        *needed += spoolss_size_printer_info_0(printer);
@@ -4864,10 +4805,7 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_1(Printer_entry *print_hnd,
-                                const struct share_params *params,
-                                RPC_BUFFER *buffer, uint32 offered,
-                                uint32 *needed)
+static WERROR getprinter_level_1(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
 {
        PRINTER_INFO_1 *printer=NULL;
        WERROR result = WERR_OK;
@@ -4875,8 +4813,7 @@ static WERROR getprinter_level_1(Printer_entry *print_hnd,
        if((printer=SMB_MALLOC_P(PRINTER_INFO_1)) == NULL)
                return WERR_NOMEM;
 
-       construct_printer_info_1(print_hnd, PRINTER_ENUM_ICON8, printer,
-                                params);
+       construct_printer_info_1(print_hnd, PRINTER_ENUM_ICON8, printer, snum);
        
        /* check the required size. */  
        *needed += spoolss_size_printer_info_1(printer);
@@ -4904,10 +4841,7 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_2(Printer_entry *print_hnd,
-                                const struct share_params *params,
-                                RPC_BUFFER *buffer, uint32 offered,
-                                uint32 *needed)
+static WERROR getprinter_level_2(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
 {
        PRINTER_INFO_2 *printer=NULL;
        WERROR result = WERR_OK;
@@ -4915,7 +4849,7 @@ static WERROR getprinter_level_2(Printer_entry *print_hnd,
        if((printer=SMB_MALLOC_P(PRINTER_INFO_2))==NULL)
                return WERR_NOMEM;
        
-       construct_printer_info_2(print_hnd, printer, params);
+       construct_printer_info_2(print_hnd, printer, snum);
        
        /* check the required size. */  
        *needed += spoolss_size_printer_info_2(printer);
@@ -4944,15 +4878,12 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_3(Printer_entry *print_hnd,
-                                const struct share_params *params,
-                                RPC_BUFFER *buffer, uint32 offered,
-                                uint32 *needed)
+static WERROR getprinter_level_3(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
 {
        PRINTER_INFO_3 *printer=NULL;
        WERROR result = WERR_OK;
 
-       if (!construct_printer_info_3(print_hnd, &printer, params))
+       if (!construct_printer_info_3(print_hnd, &printer, snum))
                return WERR_NOMEM;
        
        /* check the required size. */  
@@ -4981,10 +4912,7 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_4(Printer_entry *print_hnd,
-                                const struct share_params *params,
-                                RPC_BUFFER *buffer, uint32 offered,
-                                uint32 *needed)
+static WERROR getprinter_level_4(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
 {
        PRINTER_INFO_4 *printer=NULL;
        WERROR result = WERR_OK;
@@ -4992,7 +4920,7 @@ static WERROR getprinter_level_4(Printer_entry *print_hnd,
        if((printer=SMB_MALLOC_P(PRINTER_INFO_4))==NULL)
                return WERR_NOMEM;
 
-       if (!construct_printer_info_4(print_hnd, printer, params)) {
+       if (!construct_printer_info_4(print_hnd, printer, snum)) {
                SAFE_FREE(printer);
                return WERR_NOMEM;
        }
@@ -5023,10 +4951,7 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_5(Printer_entry *print_hnd,
-                                const struct share_params *params,
-                                RPC_BUFFER *buffer, uint32 offered,
-                                uint32 *needed)
+static WERROR getprinter_level_5(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
 {
        PRINTER_INFO_5 *printer=NULL;
        WERROR result = WERR_OK;
@@ -5034,7 +4959,7 @@ static WERROR getprinter_level_5(Printer_entry *print_hnd,
        if((printer=SMB_MALLOC_P(PRINTER_INFO_5))==NULL)
                return WERR_NOMEM;
 
-       if (!construct_printer_info_5(print_hnd, printer, params)) {
+       if (!construct_printer_info_5(print_hnd, printer, snum)) {
                free_printer_info_5(printer);
                return WERR_NOMEM;
        }
@@ -5063,7 +4988,7 @@ out:
 }
 
 static WERROR getprinter_level_6(Printer_entry *print_hnd,
-                                const struct share_params *params,
+                                int snum,
                                 RPC_BUFFER *buffer, uint32 offered,
                                 uint32 *needed)
 {
@@ -5074,7 +4999,7 @@ static WERROR getprinter_level_6(Printer_entry *print_hnd,
                return WERR_NOMEM;
        }
 
-       if (!construct_printer_info_6(print_hnd, printer, params)) {
+       if (!construct_printer_info_6(print_hnd, printer, snum)) {
                free_printer_info_6(printer);
                return WERR_NOMEM;
        }
@@ -5102,10 +5027,7 @@ out:
        return result;  
 }
 
-static WERROR getprinter_level_7(Printer_entry *print_hnd,
-                                const struct share_params *params,
-                                RPC_BUFFER *buffer, uint32 offered,
-                                uint32 *needed)
+static WERROR getprinter_level_7(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
 {
        PRINTER_INFO_7 *printer=NULL;
        WERROR result = WERR_OK;
@@ -5113,7 +5035,7 @@ static WERROR getprinter_level_7(Printer_entry *print_hnd,
        if((printer=SMB_MALLOC_P(PRINTER_INFO_7))==NULL)
                return WERR_NOMEM;
 
-       if (!construct_printer_info_7(print_hnd, printer, params))
+       if (!construct_printer_info_7(print_hnd, printer, snum))
                return WERR_NOMEM;
        
        /* check the required size. */  
@@ -5151,7 +5073,6 @@ WERROR _spoolss_getprinter(pipes_struct *p, SPOOL_Q_GETPRINTER *q_u, SPOOL_R_GET
        uint32 offered = q_u->offered;
        uint32 *needed = &r_u->needed;
        Printer_entry *Printer=find_printer_index_by_hnd(p, handle);
-       struct share_params *params;
 
        int snum;
 
@@ -5166,34 +5087,26 @@ WERROR _spoolss_getprinter(pipes_struct *p, SPOOL_Q_GETPRINTER *q_u, SPOOL_R_GET
 
        *needed=0;
 
-       if (!get_printer_snum(p, handle, &snum, &params))
+       if (!get_printer_snum(p, handle, &snum, NULL))
                return WERR_BADFID;
 
        switch (level) {
        case 0:
-               return getprinter_level_0(Printer, params, buffer, offered,
-                                         needed);
+               return getprinter_level_0(Printer, snum, buffer, offered, needed);
        case 1:
-               return getprinter_level_1(Printer, params, buffer, offered,
-                                         needed);
+               return getprinter_level_1(Printer, snum, buffer, offered, needed);
        case 2:         
-               return getprinter_level_2(Printer, params, buffer, offered,
-                                         needed);
+               return getprinter_level_2(Printer, snum, buffer, offered, needed);
        case 3:         
-               return getprinter_level_3(Printer, params, buffer, offered,
-                                         needed);
+               return getprinter_level_3(Printer, snum, buffer, offered, needed);
        case 4:         
-               return getprinter_level_4(Printer, params, buffer, offered,
-                                         needed);
+               return getprinter_level_4(Printer, snum, buffer, offered, needed);
        case 5:         
-               return getprinter_level_5(Printer, params, buffer, offered,
-                                         needed);
-       case 6:
-               return getprinter_level_6(Printer, params, buffer, offered,
-                                         needed);
+               return getprinter_level_5(Printer, snum, buffer, offered, needed);
+       case 6:         
+               return getprinter_level_6(Printer, snum, buffer, offered, needed);
        case 7:
-               return getprinter_level_7(Printer, params, buffer, offered,
-                                         needed);
+               return getprinter_level_7(Printer, snum, buffer, offered, needed);
        }
        return WERR_UNKNOWN_LEVEL;
 }      
@@ -5788,7 +5701,7 @@ WERROR _spoolss_getprinterdriver2(pipes_struct *p, SPOOL_Q_GETPRINTERDRIVER2 *q_
        *serverminorversion = 0;
 
        fstrcpy(servername, get_server_name( printer ));
-       unistr2_to_ascii(architecture, uni_arch, sizeof(architecture)-1);
+       unistr2_to_ascii(architecture, uni_arch, sizeof(architecture));
 
        if (!get_printer_snum(p, handle, &snum, NULL))
                return WERR_BADFID;
@@ -6269,7 +6182,7 @@ BOOL add_printer_hook(NT_USER_TOKEN *token, NT_PRINTER_INFO_LEVEL *printer)
        if ( (ret = smbrun(command, &fd)) == 0 ) {
                /* Tell everyone we updated smb.conf. */
                message_send_all(smbd_messaging_context(),
-                                MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
+                                MSG_SMB_CONF_UPDATED, NULL, 0, NULL);
        }
 
        if ( is_print_op )
@@ -7215,8 +7128,8 @@ WERROR _spoolss_enumprinterdrivers( pipes_struct *p, SPOOL_Q_ENUMPRINTERDRIVERS
        *needed   = 0;
        *returned = 0;
 
-       unistr2_to_ascii(architecture, &q_u->environment, sizeof(architecture)-1);
-       unistr2_to_ascii(servername, &q_u->name, sizeof(servername)-1);
+       unistr2_to_ascii(architecture, &q_u->environment, sizeof(architecture));
+       unistr2_to_ascii(servername, &q_u->name, sizeof(servername));
 
        if ( !is_myname_or_ipaddr( servername ) )
                return WERR_UNKNOWN_PRINTER_DRIVER;
@@ -7388,7 +7301,7 @@ WERROR _spoolss_getform(pipes_struct *p, SPOOL_Q_GETFORM *q_u, SPOOL_R_GETFORM *
        rpcbuf_move(q_u->buffer, &r_u->buffer);
        buffer = r_u->buffer;
 
-       unistr2_to_ascii(form_name, uni_formname, sizeof(form_name)-1);
+       unistr2_to_ascii(form_name, uni_formname, sizeof(form_name));
 
        DEBUG(4,("_spoolss_getform\n"));
        DEBUGADD(5,("Offered buffer size [%d]\n", offered));
@@ -7490,8 +7403,13 @@ WERROR enumports_hook( int *count, char ***lines )
        /* if no hook then just fill in the default port */
        
        if ( !*cmd ) {
-               qlines = SMB_MALLOC_ARRAY( char*, 2 );
-               qlines[0] = SMB_STRDUP( SAMBA_PRINTER_PORT_NAME );
+               if (!(qlines = SMB_MALLOC_ARRAY( char*, 2 ))) {
+                       return WERR_NOMEM;
+               }
+               if (!(qlines[0] = SMB_STRDUP( SAMBA_PRINTER_PORT_NAME ))) {
+                       SAFE_FREE(qlines);
+                       return WERR_NOMEM;
+               }
                qlines[1] = NULL;
                numlines = 1;
        }
@@ -7999,8 +7917,8 @@ static WERROR getprinterdriverdir_level_1(UNISTR2 *name, UNISTR2 *uni_environmen
        DRIVER_DIRECTORY_1 *info=NULL;
        WERROR result = WERR_OK;
 
-       unistr2_to_ascii(servername, name, sizeof(servername)-1);
-       unistr2_to_ascii(long_archi, uni_environment, sizeof(long_archi)-1);
+       unistr2_to_ascii(servername, name, sizeof(servername));
+       unistr2_to_ascii(long_archi, uni_environment, sizeof(long_archi));
 
        /* check for beginning double '\'s and that the server
           long enough */
@@ -8317,7 +8235,7 @@ WERROR _spoolss_setprinterdata( pipes_struct *p, SPOOL_Q_SETPRINTERDATA *q_u, SP
        if (!W_ERROR_IS_OK(status))
                return status;
 
-       unistr2_to_ascii( valuename, value, sizeof(valuename)-1 );
+       unistr2_to_ascii(valuename, value, sizeof(valuename));
        
        /*
         * When client side code sets a magic printer data key, detect it and save
@@ -8409,7 +8327,7 @@ WERROR _spoolss_deleteprinterdata(pipes_struct *p, SPOOL_Q_DELETEPRINTERDATA *q_
        if (!W_ERROR_IS_OK(status))
                return status;
 
-       unistr2_to_ascii( valuename, value, sizeof(valuename)-1 );
+       unistr2_to_ascii(valuename, value, sizeof(valuename));
 
        status = delete_printer_dataex( printer, SPOOL_PRINTERDATA_KEY, valuename );
        
@@ -9131,8 +9049,8 @@ WERROR _spoolss_getprinterdataex(pipes_struct *p, SPOOL_Q_GETPRINTERDATAEX *q_u,
 
        DEBUG(4,("_spoolss_getprinterdataex\n"));
 
-        unistr2_to_ascii(keyname, &q_u->keyname, sizeof(keyname) - 1);
-        unistr2_to_ascii(valuename, &q_u->valuename, sizeof(valuename) - 1);
+        unistr2_to_ascii(keyname, &q_u->keyname, sizeof(keyname));
+        unistr2_to_ascii(valuename, &q_u->valuename, sizeof(valuename));
        
        DEBUG(10, ("_spoolss_getprinterdataex: key => [%s], value => [%s]\n", 
                keyname, valuename));
@@ -9263,8 +9181,8 @@ WERROR _spoolss_setprinterdataex(pipes_struct *p, SPOOL_Q_SETPRINTERDATAEX *q_u,
        if (!W_ERROR_IS_OK(status))
                return status;
 
-        unistr2_to_ascii( valuename, &q_u->value, sizeof(valuename) - 1);
-        unistr2_to_ascii( keyname, &q_u->key, sizeof(keyname) - 1);
+        unistr2_to_ascii( valuename, &q_u->value, sizeof(valuename));
+        unistr2_to_ascii( keyname, &q_u->key, sizeof(keyname));
        
        /* check for OID in valuename */
        
@@ -9341,8 +9259,8 @@ WERROR _spoolss_deleteprinterdataex(pipes_struct *p, SPOOL_Q_DELETEPRINTERDATAEX
        if (!W_ERROR_IS_OK(status))
                return status;
 
-       unistr2_to_ascii( valuename, value, sizeof(valuename)-1 );
-       unistr2_to_ascii( keyname, key, sizeof(keyname)-1 );
+       unistr2_to_ascii(valuename, value, sizeof(valuename));
+       unistr2_to_ascii(keyname, key, sizeof(keyname));
 
        status = delete_printer_dataex( printer, keyname, valuename );
 
@@ -9390,7 +9308,7 @@ WERROR _spoolss_enumprinterkey(pipes_struct *p, SPOOL_Q_ENUMPRINTERKEY *q_u, SPO
                
        /* get the list of subkey names */
        
-       unistr2_to_ascii( key, &q_u->key, sizeof(key)-1 );
+       unistr2_to_ascii(key, &q_u->key, sizeof(key));
        data = printer->info_2->data;
 
        num_keys = get_printer_subkeys( data, key, &keynames );
@@ -9465,7 +9383,7 @@ WERROR _spoolss_deleteprinterkey(pipes_struct *p, SPOOL_Q_DELETEPRINTERKEY *q_u,
        
        /* delete the key and all subneys */
        
-        unistr2_to_ascii(key, &q_u->keyname, sizeof(key) - 1);
+        unistr2_to_ascii(key, &q_u->keyname, sizeof(key));
  
        status = delete_all_printer_data( printer->info_2, key );       
 
@@ -9516,7 +9434,7 @@ WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_
         * --jerry
         */
         
-       unistr2_to_ascii(key, &q_u->key, sizeof(key) - 1);
+       unistr2_to_ascii(key, &q_u->key, sizeof(key));
        if ( !strlen(key) ) {
                result = WERR_INVALID_PARAM;
                goto done;
@@ -9536,7 +9454,7 @@ WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_
        
        p_data = printer->info_2->data;
        
-       unistr2_to_ascii(key, &q_u->key, sizeof(key) - 1);
+       unistr2_to_ascii(key, &q_u->key, sizeof(key));
        if ( (key_index = lookup_printerkey( p_data, key)) == -1  )
        {
                DEBUG(10,("_spoolss_enumprinterdataex: Unknown keyname [%s]\n", key));
@@ -9653,7 +9571,7 @@ static WERROR getprintprocessordirectory_level_1(UNISTR2 *name,
        PRINTPROCESSOR_DIRECTORY_1 *info=NULL;
        WERROR result = WERR_OK;
 
-       unistr2_to_ascii(long_archi, environment, sizeof(long_archi)-1);
+       unistr2_to_ascii(long_archi, environment, sizeof(long_archi));
 
        if (!get_short_archi(long_archi))
                return WERR_INVALID_ENVIRONMENT;