summaryrefslogtreecommitdiff
path: root/source3/registry
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2005-07-02 01:23:21 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 10:58:10 -0500
commitc296f858ef61acd6c749db768670453f436f78f2 (patch)
tree64f7b354af3861d018f345984f6305ee01dee4af /source3/registry
parent0a01b2246abb61bac833649bb189cf26db62fba2 (diff)
downloadsamba-c296f858ef61acd6c749db768670453f436f78f2.tar.gz
samba-c296f858ef61acd6c749db768670453f436f78f2.tar.bz2
samba-c296f858ef61acd6c749db768670453f436f78f2.zip
r8066: * had to modify the printer data storage slightly in ntprinters.tdb
when packing values. It is a compatible change though and will not require a tdb version upgrade * Can successfully create new printer subkeys via winreg that are immediately available via spoolss calls. Still cannot delete keys yet though. That comes next. (This used to be commit 00bce2b3bb78a44842a258b1737076281297d247)
Diffstat (limited to 'source3/registry')
-rw-r--r--source3/registry/reg_printing.c79
1 files changed, 60 insertions, 19 deletions
diff --git a/source3/registry/reg_printing.c b/source3/registry/reg_printing.c
index f5562fcf5d..09a0dd0c34 100644
--- a/source3/registry/reg_printing.c
+++ b/source3/registry/reg_printing.c
@@ -215,7 +215,7 @@ static char* strip_printers_prefix( const char *key )
/*********************************************************************
*********************************************************************/
-static int key_printer_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys )
+static int key_printers_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys )
{
int n_services = lp_numservices();
int snum;
@@ -223,11 +223,11 @@ static int key_printer_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys )
int i;
int num_subkeys = 0;
char *printers_key;
- char *base, *new_path;
+ char *printername, *printerdatakey;
NT_PRINTER_INFO_LEVEL *printer = NULL;
fstring *subkey_names = NULL;
- DEBUG(10,("print_subpath_printers: key=>[%s]\n", key ? key : "NULL" ));
+ DEBUG(10,("key_printers_fetch_keys: key=>[%s]\n", key ? key : "NULL" ));
printers_key = strip_printers_prefix( key );
@@ -254,12 +254,12 @@ static int key_printer_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys )
/* get information for a specific printer */
- reg_split_path( printers_key, &base, &new_path );
+ reg_split_path( printers_key, &printername, &printerdatakey );
- if ( !W_ERROR_IS_OK( get_a_printer(NULL, &printer, 2, base) ) )
+ if ( !W_ERROR_IS_OK( get_a_printer(NULL, &printer, 2, printername) ) )
goto done;
- num_subkeys = get_printer_subkeys( &printer->info_2->data, new_path?new_path:"", &subkey_names );
+ num_subkeys = get_printer_subkeys( &printer->info_2->data, printerdatakey?printerdatakey:"", &subkey_names );
for ( i=0; i<num_subkeys; i++ )
regsubkey_ctr_addkey( subkeys, subkey_names[i] );
@@ -277,18 +277,59 @@ done:
/**********************************************************************
*********************************************************************/
-static BOOL key_printer_store_keys( const char *key, REGSUBKEY_CTR *subkeys )
+static BOOL add_printers_by_registry( REGSUBKEY_CTR *subkeys )
+{
+ return False;
+}
+
+/**********************************************************************
+ *********************************************************************/
+
+static BOOL key_printers_store_keys( const char *key, REGSUBKEY_CTR *subkeys )
{
char *printers_key;
+ char *printername, *printerdatakey;
+ NT_PRINTER_INFO_LEVEL *printer = NULL;
+ int i, num_subkeys;
+ char *subkeyname;
printers_key = strip_printers_prefix( key );
if ( !printers_key ) {
/* have to deal with some new or deleted printer */
+ return add_printers_by_registry( subkeys );
+ }
+
+ reg_split_path( printers_key, &printername, &printerdatakey );
+
+ /* lookup the printer */
+
+ if ( !W_ERROR_IS_OK(get_a_printer(NULL, &printer, 2, printername)) ) {
+ DEBUG(0,("key_printers_store_keys: Tried to store subkey for bad printername %s\n",
+ printername));
return False;
}
- return False;
+ num_subkeys = regsubkey_ctr_numkeys( subkeys );
+ for ( i=0; i<num_subkeys; i++ ) {
+ subkeyname = regsubkey_ctr_specific_key(subkeys, i);
+ /* add any missing printer keys */
+ if ( lookup_printerkey(&printer->info_2->data, subkeyname) == -1 ) {
+ if ( add_new_printer_key( &printer->info_2->data, subkeyname ) == -1 )
+ return False;
+ }
+ }
+
+ /* write back to disk */
+
+ mod_a_printer( printer, 2 );
+
+ /* cleanup */
+
+ if ( printer )
+ free_a_printer( &printer, 2 );
+
+ return True;
}
/**********************************************************************
@@ -386,7 +427,7 @@ 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 )
+static int key_printers_fetch_values( const char *key, REGVAL_CTR *values )
{
int num_values;
char *printers_key;
@@ -420,7 +461,7 @@ static int key_printer_fetch_values( const char *key, REGVAL_CTR *values )
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));
+ DEBUG(10,("key_printers_fetch_values: Unknown keyname [%s]\n", printerdatakey));
if ( printer )
free_a_printer( &printer, 2 );
return -1;
@@ -441,7 +482,7 @@ done:
/**********************************************************************
*********************************************************************/
-static BOOL key_printer_store_values( const char *key, REGVAL_CTR *values )
+static BOOL key_printers_store_values( const char *key, REGVAL_CTR *values )
{
char *printers_key;
@@ -827,10 +868,10 @@ static struct reg_dyn_tree print_registry[] = {
&key_forms_fetch_values,
NULL },
{ KEY_CONTROL_PRINTERS,
- &key_printer_fetch_keys,
- &key_printer_store_keys,
- &key_printer_fetch_values,
- &key_printer_store_values },
+ &key_printers_fetch_keys,
+ &key_printers_store_keys,
+ &key_printers_fetch_values,
+ &key_printers_store_values },
{ KEY_ENVIRONMENTS,
&key_driver_fetch_keys,
NULL,
@@ -842,10 +883,10 @@ static struct reg_dyn_tree print_registry[] = {
NULL,
NULL },
{ KEY_WINNT_PRINTERS,
- &key_printer_fetch_keys,
- &key_printer_store_keys,
- &key_printer_fetch_values,
- &key_printer_store_values },
+ &key_printers_fetch_keys,
+ &key_printers_store_keys,
+ &key_printers_fetch_values,
+ &key_printers_store_values },
{ KEY_PORTS,
&regdb_fetch_keys,
&regdb_store_keys,