summaryrefslogtreecommitdiffstats
path: root/source/registry/reg_printing.c
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2005-07-01 22:24:00 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 10:58:10 -0500
commit89f17b41cee633838b8cbd0d1bf8119a4b8d707e (patch)
tree9137dc0df8a79a96fd51de1114108ee96e713a71 /source/registry/reg_printing.c
parentfa6cc0bdefe272ec538a71a2b6ba72a724411764 (diff)
downloadsamba-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.c104
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;
}
/*********************************************************************