From 0a01b2246abb61bac833649bb189cf26db62fba2 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 1 Jul 2005 22:24:00 +0000 Subject: [PATCH] r8064: * add the REG_XXX error codes to the pretty error messages * more work on the store_values() functions for the Printers key * add Control\Print\Monitors key to list for reg_db (This used to be commit 89f17b41cee633838b8cbd0d1bf8119a4b8d707e) --- source3/libsmb/doserr.c | 3 + source3/registry/reg_db.c | 9 ++- source3/registry/reg_printing.c | 104 ++++++++++++++++++++------------ 3 files changed, 75 insertions(+), 41 deletions(-) diff --git a/source3/libsmb/doserr.c b/source3/libsmb/doserr.c index 4449c92ab18..ef71a883f7f 100644 --- a/source3/libsmb/doserr.c +++ b/source3/libsmb/doserr.c @@ -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) } }; diff --git a/source3/registry/reg_db.c b/source3/registry/reg_db.c index 82548483d4d..cfc8b854fca 100644 --- a/source3/registry/reg_db.c +++ b/source3/registry/reg_db.c @@ -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 } } }; diff --git a/source3/registry/reg_printing.c b/source3/registry/reg_printing.c index 27e28ce2dd7..f5562fcf5d8 100644 --- a/source3/registry/reg_printing.c +++ b/source3/registry/reg_printing.c @@ -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; snuminfo_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; } /********************************************************************* -- 2.34.1