r8324: * initial cut at creating printers via the registry API
authorGerald Carter <jerry@samba.org>
Mon, 11 Jul 2005 18:27:22 +0000 (18:27 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:58:19 +0000 (10:58 -0500)
  Need to add delete_key support

source/registry/reg_printing.c
source/rpc_server/srv_spoolss_nt.c

index c689882d532bc0e5f55c7f2377def196939de527..b1fdcea09c4c7021624291318b16be5a39929542 100644 (file)
@@ -225,6 +225,7 @@ static int key_printers_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys )
        char *printername, *printerdatakey;
        NT_PRINTER_INFO_LEVEL *printer = NULL;
        fstring *subkey_names = NULL;
+       fstring sharename;
        
        DEBUG(10,("key_printers_fetch_keys: key=>[%s]\n", key ? key : "NULL" ));
        
@@ -255,8 +256,13 @@ static int key_printers_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys )
        
        reg_split_path( printers_key, &printername, &printerdatakey );
 
-       if ( !W_ERROR_IS_OK( get_a_printer(NULL, &printer, 2, printername) ) )
-               goto done;
+       alpha_strcpy( sharename, printername, "", sizeof(sharename)-1);
+
+       if ( find_service(sharename) == -1
+               || !W_ERROR_IS_OK( get_a_printer(NULL, &printer, 2, sharename) ) ) 
+       {
+               return -1;
+       }
 
        num_subkeys = get_printer_subkeys( &printer->info_2->data, printerdatakey?printerdatakey:"", &subkey_names );
        
@@ -274,12 +280,41 @@ done:
 }
 
 /**********************************************************************
- Take a printer name and call add_printer_hook() if necessary
+ Take a list of names and call add_printer_hook() if necessary
+ Note that we do this a little differently from Windows since the 
+ keyname is the sharename and not the printer name.
  *********************************************************************/
 
 static BOOL add_printers_by_registry( REGSUBKEY_CTR *subkeys )
 {
-       return False;
+       int i, num_keys, snum;
+       char *printername;
+       NT_PRINTER_INFO_LEVEL_2 info2;
+       NT_PRINTER_INFO_LEVEL printer;
+       
+       ZERO_STRUCT( info2 );
+       printer.info_2 = &info2;
+       
+       num_keys = regsubkey_ctr_numkeys( subkeys );
+       
+       become_root();
+       for ( i=0; i<num_keys; i++ ) {
+               printername = regsubkey_ctr_specific_key( subkeys, i );
+               snum = find_service( printername );
+               
+               /* just verify a valied snum for now */
+               if ( snum == -1 ) {
+                       fstrcpy( info2.printername, printername );
+                       alpha_strcpy( info2.sharename, printername, "", sizeof(info2.sharename)-1);
+                       if ( !add_printer_hook( NULL, &printer ) ) {
+                               DEBUG(0,("add_printers_by_registry: Failed to add printer [%s]\n",
+                                       printername));
+                       }       
+               }
+       }
+       unbecome_root();
+
+       return True;
 }
 
 /**********************************************************************
@@ -533,7 +568,7 @@ struct {
        { "UntilTime",          REG_IDX_UNTILTIME },
        { "Name",               REG_IDX_NAME },
        { "Location",           REG_IDX_LOCATION },
-       { "Description",        REG_IDX_DESCRIPTION },
+       { "Descrioption",       REG_IDX_DESCRIPTION },
        { "Parameters",         REG_IDX_PARAMETERS },
        { "Port",               REG_IDX_PORT },
        { "Share Name",         REG_IDX_SHARENAME },
index 0329471d49ac59aaf2a5b1d298b307eedb5e9797..b5dd4594623824208ba947843ee0d275df397919 100644 (file)
@@ -6033,7 +6033,7 @@ static BOOL check_printer_ok(NT_PRINTER_INFO_LEVEL_2 *info, int snum)
 /****************************************************************************
 ****************************************************************************/
 
-static BOOL add_printer_hook(NT_USER_TOKEN *token, NT_PRINTER_INFO_LEVEL *printer)
+BOOL add_printer_hook(NT_USER_TOKEN *token, NT_PRINTER_INFO_LEVEL *printer)
 {
        char *cmd = lp_addprinter_cmd();
        char **qlines;
@@ -6043,7 +6043,7 @@ static BOOL add_printer_hook(NT_USER_TOKEN *token, NT_PRINTER_INFO_LEVEL *printe
        int fd;
        fstring remote_machine = "%m";
        SE_PRIV se_printop = SE_PRINT_OPERATOR;
-       BOOL is_print_op;
+       BOOL is_print_op = False;
 
        standard_sub_basic(current_user_info.smb_name, remote_machine,sizeof(remote_machine));
        
@@ -6052,7 +6052,8 @@ static BOOL add_printer_hook(NT_USER_TOKEN *token, NT_PRINTER_INFO_LEVEL *printe
                        printer->info_2->portname, printer->info_2->drivername,
                        printer->info_2->location, printer->info_2->comment, remote_machine);
 
-       is_print_op = user_has_privileges( token, &se_printop );
+       if ( token )
+               is_print_op = user_has_privileges( token, &se_printop );
 
        DEBUG(10,("Running [%s]\n", command));