summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/libsmb/doserr.c3
-rw-r--r--source3/registry/reg_db.c9
-rw-r--r--source3/registry/reg_printing.c104
3 files changed, 75 insertions, 41 deletions
diff --git a/source3/libsmb/doserr.c b/source3/libsmb/doserr.c
index 4449c92ab1..ef71a883f7 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 82548483d4..cfc8b854fc 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 27e28ce2dd..f5562fcf5d 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; 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;
}
/*********************************************************************