diff options
author | Gerald Carter <jerry@samba.org> | 2005-07-01 22:24:00 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 10:58:10 -0500 |
commit | 89f17b41cee633838b8cbd0d1bf8119a4b8d707e (patch) | |
tree | 9137dc0df8a79a96fd51de1114108ee96e713a71 /source/registry/reg_printing.c | |
parent | fa6cc0bdefe272ec538a71a2b6ba72a724411764 (diff) | |
download | samba-89f17b41cee633838b8cbd0d1bf8119a4b8d707e.tar.gz samba-89f17b41cee633838b8cbd0d1bf8119a4b8d707e.tar.xz samba-89f17b41cee633838b8cbd0d1bf8119a4b8d707e.zip |
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
Diffstat (limited to 'source/registry/reg_printing.c')
-rw-r--r-- | source/registry/reg_printing.c | 104 |
1 files changed, 65 insertions, 39 deletions
diff --git a/source/registry/reg_printing.c b/source/registry/reg_printing.c index 27e28ce2dd7..f5562fcf5d8 100644 --- a/source/registry/reg_printing.c +++ b/source/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; 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; } /********************************************************************* |