summaryrefslogtreecommitdiff
path: root/source3/registry/reg_backend_printing.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/registry/reg_backend_printing.c')
-rw-r--r--source3/registry/reg_backend_printing.c104
1 files changed, 45 insertions, 59 deletions
diff --git a/source3/registry/reg_backend_printing.c b/source3/registry/reg_backend_printing.c
index 8c6f673ace..453e2b2d0c 100644
--- a/source3/registry/reg_backend_printing.c
+++ b/source3/registry/reg_backend_printing.c
@@ -386,7 +386,6 @@ static bool key_printers_store_keys( const char *key, struct regsubkey_ctr *subk
static void fill_in_printer_values(NT_PRINTER_INFO_LEVEL_2 *info2, struct regval_ctr *values)
{
struct spoolss_DeviceMode *devmode;
- UNISTR2 data;
char *p;
uint32 printer_status = PRINTER_STATUS_OK;
@@ -406,35 +405,17 @@ static void fill_in_printer_values(NT_PRINTER_INFO_LEVEL_2 *info2, struct regval
p = info2->printername;
else
p++;
- init_unistr2( &data, p, UNI_STR_TERMINATE);
- regval_ctr_addvalue( values, "Name", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
- init_unistr2( &data, info2->location, UNI_STR_TERMINATE);
- regval_ctr_addvalue( values, "Location", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-
- init_unistr2( &data, info2->comment, UNI_STR_TERMINATE);
- regval_ctr_addvalue( values, "Description", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-
- init_unistr2( &data, info2->parameters, UNI_STR_TERMINATE);
- regval_ctr_addvalue( values, "Parameters", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-
- init_unistr2( &data, info2->portname, UNI_STR_TERMINATE);
- regval_ctr_addvalue( values, "Port", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-
- init_unistr2( &data, info2->sharename, UNI_STR_TERMINATE);
- regval_ctr_addvalue( values, "Share Name", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-
- init_unistr2( &data, info2->drivername, UNI_STR_TERMINATE);
- regval_ctr_addvalue( values, "Printer Driver", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-
- init_unistr2( &data, info2->sepfile, UNI_STR_TERMINATE);
- regval_ctr_addvalue( values, "Separator File", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-
- init_unistr2( &data, "WinPrint", UNI_STR_TERMINATE);
- regval_ctr_addvalue( values, "Print Processor", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
-
- init_unistr2( &data, "RAW", UNI_STR_TERMINATE);
- regval_ctr_addvalue( values, "Datatype", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
+ regval_ctr_addvalue_sz(values, "Name", p);
+ regval_ctr_addvalue_sz(values, "Location", info2->location);
+ regval_ctr_addvalue_sz(values, "Description", info2->comment);
+ regval_ctr_addvalue_sz(values, "Parameters", info2->parameters);
+ regval_ctr_addvalue_sz(values, "Port", info2->portname);
+ regval_ctr_addvalue_sz(values, "Share Name", info2->sharename);
+ regval_ctr_addvalue_sz(values, "Printer Driver", info2->drivername);
+ regval_ctr_addvalue_sz(values, "Separator File", info2->sepfile);
+ regval_ctr_addvalue_sz(values, "Print Processor", "WinPrint");
+ regval_ctr_addvalue_sz(values, "Datatype", "RAW");
/* stream the device mode */
@@ -594,7 +575,16 @@ static int find_valuename_index( const char *valuename )
/**********************************************************************
*********************************************************************/
-static void convert_values_to_printer_info_2(NT_PRINTER_INFO_LEVEL_2 *printer2, struct regval_ctr *values)
+static void pull_reg_sz_fstring(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob, fstring s)
+{
+ const char *str;
+ pull_reg_sz(mem_ctx, blob, &str);
+ fstrcpy(s, str);
+}
+
+static void convert_values_to_printer_info_2(TALLOC_CTX *mem_ctx,
+ NT_PRINTER_INFO_LEVEL_2 *printer2,
+ struct regval_ctr *values)
{
int num_values = regval_ctr_numvals( values );
uint32 value_index;
@@ -602,8 +592,11 @@ static void convert_values_to_printer_info_2(NT_PRINTER_INFO_LEVEL_2 *printer2,
int i;
for ( i=0; i<num_values; i++ ) {
+ DATA_BLOB blob;
val = regval_ctr_specific_value( values, i );
value_index = find_valuename_index( regval_name( val ) );
+
+ blob = data_blob_const(regval_data_p(val), regval_size(val));
switch( value_index ) {
case REG_IDX_ATTRIBUTES:
@@ -625,34 +618,34 @@ static void convert_values_to_printer_info_2(NT_PRINTER_INFO_LEVEL_2 *printer2,
printer2->untiltime = (uint32)(*regval_data_p(val));
break;
case REG_IDX_NAME:
- rpcstr_pull( printer2->printername, regval_data_p(val), sizeof(fstring), regval_size(val), 0 );
+ pull_reg_sz_fstring(mem_ctx, &blob, printer2->printername);
break;
case REG_IDX_LOCATION:
- rpcstr_pull( printer2->location, regval_data_p(val), sizeof(fstring), regval_size(val), 0 );
+ pull_reg_sz_fstring(mem_ctx, &blob, printer2->location);
break;
case REG_IDX_DESCRIPTION:
- rpcstr_pull( printer2->comment, regval_data_p(val), sizeof(fstring), regval_size(val), 0 );
+ pull_reg_sz_fstring(mem_ctx, &blob, printer2->comment);
break;
case REG_IDX_PARAMETERS:
- rpcstr_pull( printer2->parameters, regval_data_p(val), sizeof(fstring), regval_size(val), 0 );
+ pull_reg_sz_fstring(mem_ctx, &blob, printer2->parameters);
break;
case REG_IDX_PORT:
- rpcstr_pull( printer2->portname, regval_data_p(val), sizeof(fstring), regval_size(val), 0 );
+ pull_reg_sz_fstring(mem_ctx, &blob, printer2->portname);
break;
case REG_IDX_SHARENAME:
- rpcstr_pull( printer2->sharename, regval_data_p(val), sizeof(fstring), regval_size(val), 0 );
+ pull_reg_sz_fstring(mem_ctx, &blob, printer2->sharename);
break;
case REG_IDX_DRIVER:
- rpcstr_pull( printer2->drivername, regval_data_p(val), sizeof(fstring), regval_size(val), 0 );
+ pull_reg_sz_fstring(mem_ctx, &blob, printer2->drivername);
break;
case REG_IDX_SEP_FILE:
- rpcstr_pull( printer2->sepfile, regval_data_p(val), sizeof(fstring), regval_size(val), 0 );
+ pull_reg_sz_fstring(mem_ctx, &blob, printer2->sepfile);
break;
case REG_IDX_PRINTPROC:
- rpcstr_pull( printer2->printprocessor, regval_data_p(val), sizeof(fstring), regval_size(val), 0 );
+ pull_reg_sz_fstring(mem_ctx, &blob, printer2->printprocessor);
break;
case REG_IDX_DATATYPE:
- rpcstr_pull( printer2->datatype, regval_data_p(val), sizeof(fstring), regval_size(val), 0 );
+ pull_reg_sz_fstring(mem_ctx, &blob, printer2->datatype);
break;
case REG_IDX_DEVMODE:
break;
@@ -677,6 +670,7 @@ static bool key_printers_store_values(const char *key, struct regval_ctr *values
char *printername, *keyname;
NT_PRINTER_INFO_LEVEL *printer = NULL;
WERROR result;
+ TALLOC_CTX *mem_ctx = talloc_init("key_printers_store_values");
printers_key = strip_printers_prefix( key );
@@ -697,7 +691,7 @@ static bool key_printers_store_values(const char *key, struct regval_ctr *values
/* deal with setting values directly under the printername */
if ( !keyname ) {
- convert_values_to_printer_info_2( printer->info_2, values );
+ convert_values_to_printer_info_2(mem_ctx, printer->info_2, values );
}
else {
int num_values = regval_ctr_numvals( values );
@@ -718,6 +712,7 @@ static bool key_printers_store_values(const char *key, struct regval_ctr *values
DEBUG(0,("key_printers_store_values: failed to set printer data [%s]!\n",
keyname));
free_a_printer( &printer, 2 );
+ talloc_destroy(mem_ctx);
return False;
}
}
@@ -726,6 +721,7 @@ static bool key_printers_store_values(const char *key, struct regval_ctr *values
result = mod_a_printer( printer, 2 );
free_a_printer( &printer, 2 );
+ talloc_destroy(mem_ctx);
return W_ERROR_IS_OK(result);
}
@@ -894,31 +890,21 @@ static void fill_in_driver_values(NT_PRINTER_DRIVER_INFO_LEVEL_3 *info3, struct
int buffer_size = 0;
int i, length;
const char *filename;
- UNISTR2 data;
+ DATA_BLOB data;
filename = dos_basename( info3->driverpath );
- init_unistr2( &data, filename, UNI_STR_TERMINATE);
- regval_ctr_addvalue( values, "Driver", REG_SZ, (char*)data.buffer,
- data.uni_str_len*sizeof(uint16) );
+ regval_ctr_addvalue_sz(values, "Driver", filename);
filename = dos_basename( info3->configfile );
- init_unistr2( &data, filename, UNI_STR_TERMINATE);
- regval_ctr_addvalue( values, "Configuration File", REG_SZ, (char*)data.buffer,
- data.uni_str_len*sizeof(uint16) );
+ regval_ctr_addvalue_sz(values, "Configuration File", filename);
filename = dos_basename( info3->datafile );
- init_unistr2( &data, filename, UNI_STR_TERMINATE);
- regval_ctr_addvalue( values, "Data File", REG_SZ, (char*)data.buffer,
- data.uni_str_len*sizeof(uint16) );
+ regval_ctr_addvalue_sz(values, "Data File", filename);
filename = dos_basename( info3->helpfile );
- init_unistr2( &data, filename, UNI_STR_TERMINATE);
- regval_ctr_addvalue( values, "Help File", REG_SZ, (char*)data.buffer,
- data.uni_str_len*sizeof(uint16) );
+ regval_ctr_addvalue_sz(values, "Help File", filename);
- init_unistr2( &data, info3->defaultdatatype, UNI_STR_TERMINATE);
- regval_ctr_addvalue( values, "Data Type", REG_SZ, (char*)data.buffer,
- data.uni_str_len*sizeof(uint16) );
+ regval_ctr_addvalue_sz(values, "Data Type", info3->defaultdatatype);
regval_ctr_addvalue( values, "Version", REG_DWORD, (char*)&info3->cversion,
sizeof(info3->cversion) );
@@ -940,8 +926,8 @@ static void fill_in_driver_values(NT_PRINTER_DRIVER_INFO_LEVEL_3 *info3, struct
break;
}
- init_unistr2( &data, filename, UNI_STR_TERMINATE);
- memcpy( buffer+buffer_size, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
+ push_reg_sz(talloc_tos(), &data, filename);
+ memcpy( buffer+buffer_size, (char*)data.data, data.length);
buffer_size += (length + 1)*sizeof(uint16);
}