r8064: * add the REG_XXX error codes to the pretty error messages
authorGerald Carter <jerry@samba.org>
Fri, 1 Jul 2005 22:24:00 +0000 (22:24 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:58:10 +0000 (10:58 -0500)
* more work on the store_values() functions for the Printers key
* add Control\Print\Monitors key to list for reg_db

source/libsmb/doserr.c
source/registry/reg_db.c
source/registry/reg_printing.c

index 4449c92ab18422756dda85f085a76958b3b36741..ef71a883f7f6e61b8228272b4645bc576942b818 100644 (file)
@@ -72,6 +72,9 @@ werror_code_struct dos_errs[] =
        { "WERR_IO_PENDING", WERR_IO_PENDING },
        { "WERR_INVALID_SERVICE_CONTROL", WERR_INVALID_SERVICE_CONTROL },
        { "WERR_NET_NAME_NOT_FOUND", WERR_NET_NAME_NOT_FOUND },
+       { "WERR_REG_CORRUPT", WERR_REG_CORRUPT },
+       { "WERR_REG_IO_FAILURE", WERR_REG_IO_FAILURE },
+       { "WERR_REG_FILE_INVALID", WERR_REG_FILE_INVALID },
        { NULL, W_ERROR(0) }
 };
 
index 82548483d4d4dbe7c11d4055482cf2ca76e41ab8..cfc8b854fca448431ff5fca8805f70a32d1f7bec 100644 (file)
@@ -45,6 +45,7 @@ static const char *builtin_registry_paths[] = {
        KEY_PRINTING,
        KEY_SHARES,
        KEY_EVENTLOG,
+       "HKLM\\SYSTEM\\CurrentControlSet\\Control\\Print\\Monitors",
        "HKLM\\SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
        "HKLM\\SYSTEM\\CurrentControlSet\\Services\\TcpIp\\Parameters",
        "HKLM\\SYSTEM\\CurrentControlSet\\Services\\Netlogon\\Parameters",
@@ -63,8 +64,12 @@ struct builtin_regkey_value {
 };
 
 static struct builtin_regkey_value builtin_registry_values[] = {
-       { "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",         "SystemRoot",          REG_SZ,  { "c:\\Windows" } },
-       { "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Ports",  "Samba Printer Port",  REG_SZ,  { "" } },
+       { "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",         
+               "SystemRoot", REG_SZ, { "c:\\Windows" } },
+       { "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Ports",  
+               "Samba Printer Port", REG_SZ, { "" } },
+       { "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers",  
+               "DefaultSpoolDirectory", REG_SZ, { "c:\\windows\\system32\\spool\\printers" } },
        { NULL, NULL, 0, { NULL } }
 };
 
index 27e28ce2dd7943d14146475ca8a5f9cb74607ae7..f5562fcf5d86254a3519624a6b02ddf9c71adae8 100644 (file)
@@ -189,6 +189,32 @@ static int key_forms_fetch_values( const char *key, REGVAL_CTR *values )
  *********************************************************************
  *********************************************************************/
 
+/*********************************************************************
+ strip off prefix for printers key.  DOes return a pointer to static 
+ memory.
+ *********************************************************************/
+
+static char* strip_printers_prefix( const char *key )
+{
+       char *subkeypath;
+       pstring path;
+       
+       pstrcpy( path, key );
+       normalize_reg_path( path );
+
+       /* normalizing the path does not change length, just key delimiters and case */
+
+       if ( strncmp( path, KEY_WINNT_PRINTERS, strlen(KEY_WINNT_PRINTERS) ) == 0 )
+               subkeypath = remaining_path( key + strlen(KEY_WINNT_PRINTERS) );
+       else
+               subkeypath = remaining_path( key + strlen(KEY_CONTROL_PRINTERS) );
+               
+       return subkeypath;
+}
+
+/*********************************************************************
+ *********************************************************************/
 static int key_printer_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys )
 {
        int n_services = lp_numservices();      
@@ -196,26 +222,16 @@ static int key_printer_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys )
        fstring sname;
        int i;
        int num_subkeys = 0;
-       char *keystr;
+       char *printers_key;
        char *base, *new_path;
        NT_PRINTER_INFO_LEVEL *printer = NULL;
        fstring *subkey_names = NULL;
-       pstring path;
        
        DEBUG(10,("print_subpath_printers: key=>[%s]\n", key ? key : "NULL" ));
        
-       pstrcpy( path, key );
-       normalize_reg_path( path );
-
-       /* normalizing the path does not change length, just key delimiters and case */
-
-       if ( strncmp( path, KEY_WINNT_PRINTERS, strlen(KEY_WINNT_PRINTERS) ) == 0 )
-               keystr = remaining_path( key + strlen(KEY_WINNT_PRINTERS) );
-       else
-               keystr = remaining_path( key + strlen(KEY_CONTROL_PRINTERS) );
+       printers_key = strip_printers_prefix( key );    
        
-       
-       if ( !keystr ) {
+       if ( !printers_key ) {
                /* enumerate all printers */
                
                for (snum=0; snum<n_services; snum++) {
@@ -238,7 +254,7 @@ static int key_printer_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys )
 
        /* get information for a specific printer */
        
-       reg_split_path( keystr, &base, &new_path );
+       reg_split_path( printers_key, &base, &new_path );
 
                if ( !W_ERROR_IS_OK( get_a_printer(NULL, &printer, 2, base) ) )
                goto done;
@@ -263,7 +279,16 @@ done:
 
 static BOOL key_printer_store_keys( const char *key, REGSUBKEY_CTR *subkeys )
 {
-       return True;
+       char *printers_key;
+       
+       printers_key = strip_printers_prefix( key );
+       
+       if ( !printers_key ) {
+               /* have to deal with some new or deleted printer */
+               return False;
+       }
+
+       return False;
 }
 
 /**********************************************************************
@@ -364,37 +389,24 @@ static void fill_in_printer_values( NT_PRINTER_INFO_LEVEL_2 *info2, REGVAL_CTR *
 static int key_printer_fetch_values( const char *key, REGVAL_CTR *values )
 {
        int             num_values;
-       char            *keystr;
+       char            *printers_key;
        char            *printername, *printerdatakey;
        NT_PRINTER_INFO_LEVEL   *printer = NULL;
        NT_PRINTER_DATA *p_data;
-       pstring         path;
        int             i, key_index;
        
-       /* 
-        * Theres are tw cases to deal with here
-        * (1) enumeration of printer_info_2 values
-        * (2) enumeration of the PrinterDriverData subney
-        */
-        
-       pstrcpy( path, key );
-       normalize_reg_path( path );
-
-       /* normalizing the path does not change length, just key delimiters and case */
-
-       if ( strncmp( path, KEY_WINNT_PRINTERS, strlen(KEY_WINNT_PRINTERS) ) == 0 )
-               keystr = remaining_path( key + strlen(KEY_WINNT_PRINTERS) );
-       else
-               keystr = remaining_path( key + strlen(KEY_CONTROL_PRINTERS) );
+       printers_key = strip_printers_prefix( key );    
        
-       /* top level key has no values */
+       /* top level key values stored in the registry has no values */
        
-       if ( !keystr )
-               return 0;
+       if ( !printers_key ) {
+               /* normalize to the 'HKLM\SOFTWARE\...\Print\Printers' ket */
+               return regdb_fetch_values( KEY_WINNT_PRINTERS, values );
+       }
        
        /* lookup the printer object */
        
-       reg_split_path( keystr, &printername, &printerdatakey );
+       reg_split_path( printers_key, &printername, &printerdatakey );
        if ( !W_ERROR_IS_OK( get_a_printer(NULL, &printer, 2, printername) ) )
                goto done;
                
@@ -403,12 +415,15 @@ static int key_printer_fetch_values( const char *key, REGVAL_CTR *values )
                goto done;
        }
                
-       /* iterate over all printer data and fill the regval container */
+       /* iterate over all printer data keys and fill the regval container */
        
        p_data = &printer->info_2->data;
        if ( (key_index = lookup_printerkey( p_data, printerdatakey )) == -1  ) {
+               /* failure....should never happen if the client has a valid open handle first */
                DEBUG(10,("key_printer_fetch_values: Unknown keyname [%s]\n", printerdatakey));
-               goto done;
+               if ( printer )
+                       free_a_printer( &printer, 2 );
+               return -1;
        }
        
        num_values = regval_ctr_numvals( &p_data->keys[key_index].values );     
@@ -428,7 +443,18 @@ done:
 
 static BOOL key_printer_store_values( const char *key, REGVAL_CTR *values )
 {
-       return True;
+       char *printers_key;
+       
+       printers_key = strip_printers_prefix( key );
+       
+       /* values in the top level key get stored in the registry */
+
+       if ( !printers_key ) {
+               /* normalize on thw 'HKLM\SOFTWARE\....\Print\Printers' ket */
+               return regdb_store_values( KEY_WINNT_PRINTERS, values );
+       }
+       
+       return False;
 }
 
 /*********************************************************************