*/
#include "includes.h"
+#include "../librpc/gen_ndr/cli_spoolss.h"
+#include "rpc_client/cli_spoolss.h"
+#include "registry.h"
+#include "registry/reg_objects.h"
+#include "nt_printing.h"
#ifdef HAVE_ADS
map a REG_SZ to an ldap mod
*/
static bool map_sz(TALLOC_CTX *ctx, ADS_MODLIST *mods,
- const REGISTRY_VALUE *value)
+ struct regval_blob *value)
{
char *str_value = NULL;
size_t converted_size;
ADS_STATUS status;
- if (value->type != REG_SZ)
+ if (regval_type(value) != REG_SZ)
return false;
- if (value->size && *((smb_ucs2_t *) value->data_p)) {
+ if (regval_size(value) && *((smb_ucs2_t *) regval_data_p(value))) {
if (!pull_ucs2_talloc(ctx, &str_value,
- (const smb_ucs2_t *) value->data_p,
+ (const smb_ucs2_t *) regval_data_p(value),
&converted_size))
{
return false;
}
- status = ads_mod_str(ctx, mods, value->valuename, str_value);
+ status = ads_mod_str(ctx, mods, regval_name(value), str_value);
return ADS_ERR_OK(status);
}
return true;
map a REG_DWORD to an ldap mod
*/
static bool map_dword(TALLOC_CTX *ctx, ADS_MODLIST *mods,
- const REGISTRY_VALUE *value)
+ struct regval_blob *value)
{
char *str_value = NULL;
ADS_STATUS status;
- if (value->type != REG_DWORD)
+ if (regval_type(value) != REG_DWORD)
return False;
- str_value = talloc_asprintf(ctx, "%d", *((uint32 *) value->data_p));
+ str_value = talloc_asprintf(ctx, "%d", *((uint32 *) regval_data_p(value)));
if (!str_value) {
return False;
}
- status = ads_mod_str(ctx, mods, value->valuename, str_value);
+ status = ads_mod_str(ctx, mods, regval_name(value), str_value);
return ADS_ERR_OK(status);
}
map a boolean REG_BINARY to an ldap mod
*/
static bool map_bool(TALLOC_CTX *ctx, ADS_MODLIST *mods,
- const REGISTRY_VALUE *value)
+ struct regval_blob *value)
{
char *str_value;
ADS_STATUS status;
- if ((value->type != REG_BINARY) || (value->size != 1))
+ if ((regval_type(value) != REG_BINARY) || (regval_size(value) != 1))
return False;
str_value = talloc_asprintf(ctx, "%s",
- *(value->data_p) ? "TRUE" : "FALSE");
+ *(regval_data_p(value)) ? "TRUE" : "FALSE");
if (!str_value) {
return False;
}
- status = ads_mod_str(ctx, mods, value->valuename, str_value);
+ status = ads_mod_str(ctx, mods, regval_name(value), str_value);
return ADS_ERR_OK(status);
}
map a REG_MULTI_SZ to an ldap mod
*/
static bool map_multi_sz(TALLOC_CTX *ctx, ADS_MODLIST *mods,
- const REGISTRY_VALUE *value)
+ struct regval_blob *value)
{
char **str_values = NULL;
size_t converted_size;
- smb_ucs2_t *cur_str = (smb_ucs2_t *) value->data_p;
+ smb_ucs2_t *cur_str = (smb_ucs2_t *) regval_data_p(value);
uint32 size = 0, num_vals = 0, i=0;
ADS_STATUS status;
- if (value->type != REG_MULTI_SZ)
+ if (regval_type(value) != REG_MULTI_SZ)
return False;
- while(cur_str && *cur_str && (size < value->size)) {
+ while(cur_str && *cur_str && (size < regval_size(value))) {
size += 2 * (strlen_w(cur_str) + 1);
cur_str += strlen_w(cur_str) + 1;
num_vals++;
memset(str_values, '\0',
(num_vals + 1) * sizeof(char *));
- cur_str = (smb_ucs2_t *) value->data_p;
+ cur_str = (smb_ucs2_t *) regval_data_p(value);
for (i=0; i < num_vals; i++) {
cur_str += pull_ucs2_talloc(ctx, &str_values[i],
cur_str, &converted_size) ?
converted_size : (size_t)-1;
}
- status = ads_mod_strlist(ctx, mods, value->valuename,
+ status = ads_mod_strlist(ctx, mods, regval_name(value),
(const char **) str_values);
return ADS_ERR_OK(status);
}
struct valmap_to_ads {
const char *valname;
- bool (*fn)(TALLOC_CTX *, ADS_MODLIST *, const REGISTRY_VALUE *);
+ bool (*fn)(TALLOC_CTX *, ADS_MODLIST *, struct regval_blob *);
};
/*
map a REG_SZ to an ldap mod
*/
static void map_regval_to_ads(TALLOC_CTX *ctx, ADS_MODLIST *mods,
- REGISTRY_VALUE *value)
+ struct regval_blob *value)
{
const struct valmap_to_ads map[] = {
{SPOOL_REG_ASSETNUMBER, map_sz},
int i;
for (i=0; map[i].valname; i++) {
- if (StrCaseCmp(map[i].valname, value->valuename) == 0) {
+ if (StrCaseCmp(map[i].valname, regval_name(value)) == 0) {
if (!map[i].fn(ctx, mods, value)) {
- DEBUG(5, ("Add of value %s to modlist failed\n", value->valuename));
+ DEBUG(5, ("Add of value %s to modlist failed\n", regval_name(value)));
} else {
- DEBUG(7, ("Mapped value %s\n", value->valuename));
+ DEBUG(7, ("Mapped value %s\n", regval_name(value)));
}
}
} else {
/* Have the data we need now, so start building */
for (i=0; i < count; i++) {
- REGISTRY_VALUE v;
- DATA_BLOB blob;
-
- result = push_spoolss_PrinterData(mem_ctx, &blob,
- info[i].type,
- info[i].data);
- if (W_ERROR_IS_OK(result)) {
- fstrcpy(v.valuename, info[i].value_name);
- v.type = info[i].type;
- v.data_p = blob.data;
- v.size = blob.length;
-
- map_regval_to_ads(mem_ctx, mods, &v);
+ struct regval_blob *v;
+
+ v = regval_compose(mem_ctx, info[i].value_name,
+ info[i].type,
+ info[i].data->data,
+ info[i].data->length);
+ if (v == NULL) {
+ return WERR_NOMEM;
}
+
+ map_regval_to_ads(mem_ctx, mods, v);
+ talloc_free(v);
}
}
printername, win_errstr(result)));
} else {
for (i=0; i < count; i++) {
- REGISTRY_VALUE v;
- DATA_BLOB blob;
-
- result = push_spoolss_PrinterData(mem_ctx, &blob,
- info[i].type,
- info[i].data);
- if (W_ERROR_IS_OK(result)) {
- fstrcpy(v.valuename, info[i].value_name);
- v.type = info[i].type;
- v.data_p = blob.data;
- v.size = blob.length;
-
- map_regval_to_ads(mem_ctx, mods, &v);
+ struct regval_blob *v;
+
+ v = regval_compose(mem_ctx, info[i].value_name,
+ info[i].type,
+ info[i].data->data,
+ info[i].data->length);
+ if (v == NULL) {
+ return WERR_NOMEM;
}
+
+ map_regval_to_ads(mem_ctx, mods, v);
+ talloc_free(v);
}
}
return result;
}
-bool get_local_printer_publishing_data(TALLOC_CTX *mem_ctx,
+static bool get_local_printer_publishing_data(TALLOC_CTX *mem_ctx,
ADS_MODLIST *mods,
NT_PRINTER_DATA *data)
{
uint32 key,val;
for (key=0; key < data->num_keys; key++) {
- REGVAL_CTR *ctr = data->keys[key].values;
- for (val=0; val < ctr->num_values; val++)
- map_regval_to_ads(mem_ctx, mods, ctr->values[val]);
+ struct regval_ctr *ctr = data->keys[key].values;
+ for (val=0; val < regval_ctr_numvals(ctr); val++)
+ map_regval_to_ads(mem_ctx, mods, regval_ctr_specific_value(ctr, val));
}
return True;
}