#include "auth/auth.h"
#include "dsdb/samdb/samdb.h"
#include "ldb_wrap.h"
-#include "util/util_ldb.h"
#include "rpc_server/common/common.h"
#include "param/param.h"
connect to the SPOOLSS database
return a ldb_context pointer on success, or NULL on failure
*/
-static struct ldb_context *sptr_db_connect(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx)
+static struct ldb_context *sptr_db_connect(TALLOC_CTX *mem_ctx, struct tevent_context *ev_ctx, struct loadparm_context *lp_ctx)
{
- return ldb_wrap_connect(mem_ctx, lp_ctx, lp_spoolss_url(lp_ctx), system_session(mem_ctx, lp_ctx),
- NULL, 0, NULL);
+ return ldb_wrap_connect(mem_ctx, ev_ctx, lp_ctx, lpcfg_spoolss_url(lp_ctx), system_session(lp_ctx),
+ NULL, 0);
}
static int sptr_db_search(struct ldb_context *ldb,
#define SET_STRING(ldb, mod, attr, value) do { \
if (value == NULL) return WERR_INVALID_PARAM; \
- if (samdb_msg_add_string(ldb, (TALLOC_CTX *)mod, mod, attr, value) != 0) { \
+ if (samdb_msg_add_string(ldb, (TALLOC_CTX *)mod, mod, attr, value) != LDB_SUCCESS) { \
return WERR_NOMEM; \
} \
} while (0)
#define SET_UINT(ldb, mod, attr, value) do { \
- if (samdb_msg_add_uint(ldb, (TALLOC_CTX *)mod, mod, attr, value) != 0) { \
+ if (samdb_msg_add_uint(ldb, (TALLOC_CTX *)mod, mod, attr, value) != LDB_SUCCESS) { \
return WERR_NOMEM; \
} \
} while (0)
static NTSTATUS sptr_init_context(struct ntptr_context *ntptr)
{
- struct ldb_context *sptr_db = sptr_db_connect(ntptr, global_loadparm);
+ struct ldb_context *sptr_db = sptr_db_connect(ntptr, ntptr->ev_ctx, ntptr->lp_ctx);
NT_STATUS_HAVE_NO_MEMORY(sptr_db);
ntptr->private_data = sptr_db;
/*
* PrintServer PrinterData functions
*/
-static WERROR sptr_GetPrintServerData(struct ntptr_GenericHandle *server, TALLOC_CTX *mem_ctx,
- struct spoolss_GetPrinterData *r)
+
+static WERROR sptr_PrintServerData(struct ntptr_GenericHandle *server,
+ TALLOC_CTX *mem_ctx,
+ const char *value_name,
+ union spoolss_PrinterData *r,
+ enum winreg_Type *type)
{
- if (strcmp("W3SvcInstalled", r->in.value_name) == 0) {
- r->out.type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
- r->out.data.value = 0;
+ struct dcerpc_server_info *server_info = lpcfg_dcerpc_server_info(mem_ctx, server->ntptr->lp_ctx);
+ if (strcmp("W3SvcInstalled", value_name) == 0) {
+ *type = REG_DWORD;
+ r->value = 0;
return WERR_OK;
- } else if (strcmp("BeepEnabled", r->in.value_name) == 0) {
- r->out.type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
- r->out.data.value = 0;
+ } else if (strcmp("BeepEnabled", value_name) == 0) {
+ *type = REG_DWORD;
+ r->value = 0;
return WERR_OK;
- } else if (strcmp("EventLog", r->in.value_name) == 0) {
- r->out.type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
- r->out.data.value = 0;
+ } else if (strcmp("EventLog", value_name) == 0) {
+ *type = REG_DWORD;
+ r->value = 0;
return WERR_OK;
- } else if (strcmp("NetPopup", r->in.value_name) == 0) {
- r->out.type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
- r->out.data.value = 0;
+ } else if (strcmp("NetPopup", value_name) == 0) {
+ *type = REG_DWORD;
+ r->value = 0;
return WERR_OK;
- } else if (strcmp("NetPopupToComputer", r->in.value_name) == 0) {
- r->out.type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
- r->out.data.value = 0;
+ } else if (strcmp("NetPopupToComputer", value_name) == 0) {
+ *type = REG_DWORD;
+ r->value = 0;
return WERR_OK;
- } else if (strcmp("MajorVersion", r->in.value_name) == 0) {
- r->out.type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
- r->out.data.value = 3;
+ } else if (strcmp("MajorVersion", value_name) == 0) {
+ *type = REG_DWORD;
+ r->value = 3;
return WERR_OK;
- } else if (strcmp("MinorVersion", r->in.value_name) == 0) {
- r->out.type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
- r->out.data.value = 0;
+ } else if (strcmp("MinorVersion", value_name) == 0) {
+ *type = REG_DWORD;
+ r->value = 0;
return WERR_OK;
- } else if (strcmp("DefaultSpoolDirectory", r->in.value_name) == 0) {
- r->out.type = SPOOLSS_PRINTER_DATA_TYPE_STRING;
- r->out.data.string = "C:\\PRINTERS";
+ } else if (strcmp("DefaultSpoolDirectory", value_name) == 0) {
+ *type = REG_SZ;
+ r->string = "C:\\PRINTERS";
return WERR_OK;
- } else if (strcmp("Architecture", r->in.value_name) == 0) {
- r->out.type = SPOOLSS_PRINTER_DATA_TYPE_STRING;
- r->out.data.string = SPOOLSS_ARCHITECTURE_NT_X86;
+ } else if (strcmp("Architecture", value_name) == 0) {
+ *type = REG_SZ;
+ r->string = SPOOLSS_ARCHITECTURE_NT_X86;
return WERR_OK;
- } else if (strcmp("DsPresent", r->in.value_name) == 0) {
- r->out.type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
- r->out.data.value = 1;
+ } else if (strcmp("DsPresent", value_name) == 0) {
+ *type = REG_DWORD;
+ r->value = 1;
return WERR_OK;
- } else if (strcmp("OSVersion", r->in.value_name) == 0) {
+ } else if (strcmp("OSVersion", value_name) == 0) {
DATA_BLOB blob;
enum ndr_err_code ndr_err;
struct spoolss_OSVersion os;
- os.major = dcesrv_common_get_version_major(mem_ctx, global_loadparm);
- os.minor = dcesrv_common_get_version_minor(mem_ctx, global_loadparm);
- os.build = dcesrv_common_get_version_build(mem_ctx, global_loadparm);
+ os.major = server_info->version_major;
+ os.minor = server_info->version_minor;
+ os.build = server_info->version_build;
os.extra_string = "";
ndr_err = ndr_push_struct_blob(&blob, mem_ctx, &os, (ndr_push_flags_fn_t)ndr_push_spoolss_OSVersion);
return WERR_GENERAL_FAILURE;
}
- r->out.type = SPOOLSS_PRINTER_DATA_TYPE_BINARY;
- r->out.data.binary = blob;
+ *type = REG_BINARY;
+ r->binary = blob;
return WERR_OK;
- } else if (strcmp("OSVersionEx", r->in.value_name) == 0) {
+ } else if (strcmp("OSVersionEx", value_name) == 0) {
DATA_BLOB blob;
enum ndr_err_code ndr_err;
struct spoolss_OSVersionEx os_ex;
- os_ex.major = dcesrv_common_get_version_major(mem_ctx, global_loadparm);
- os_ex.minor = dcesrv_common_get_version_minor(mem_ctx, global_loadparm);
- os_ex.build = dcesrv_common_get_version_build(mem_ctx, global_loadparm);
- os_ex.extra_string = "";
- os_ex.unknown2 = 0;
- os_ex.unknown3 = 0;
+ os_ex.major = server_info->version_major;
+ os_ex.minor = server_info->version_minor;
+ os_ex.build = server_info->version_build;
+ os_ex.extra_string = "";
+ os_ex.service_pack_major= 0;
+ os_ex.service_pack_minor= 0;
+ os_ex.suite_mask = 0;
+ os_ex.product_type = 0;
+ os_ex.reserved = 0;
ndr_err = ndr_push_struct_blob(&blob, mem_ctx, &os_ex, (ndr_push_flags_fn_t)ndr_push_spoolss_OSVersionEx);
if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
return WERR_GENERAL_FAILURE;
}
- r->out.type = SPOOLSS_PRINTER_DATA_TYPE_BINARY;
- r->out.data.binary = blob;
+ *type = REG_BINARY;
+ r->binary = blob;
return WERR_OK;
- } else if (strcmp("DNSMachineName", r->in.value_name) == 0) {
- if (!lp_realm(global_loadparm)) return WERR_INVALID_PARAM;
-
- r->out.type = SPOOLSS_PRINTER_DATA_TYPE_STRING;
- r->out.data.string = talloc_asprintf(mem_ctx, "%s.%s",
- lp_netbios_name(global_loadparm),
- lp_realm(global_loadparm));
- W_ERROR_HAVE_NO_MEMORY(r->out.data.string);
+ } else if (strcmp("DNSMachineName", value_name) == 0) {
+ const char *dnsdomain = lpcfg_dnsdomain(server->ntptr->lp_ctx);
+
+ if (dnsdomain == NULL) return WERR_INVALID_PARAM;
+
+ *type = REG_SZ;
+ r->string = talloc_asprintf(mem_ctx, "%s.%s",
+ lpcfg_netbios_name(server->ntptr->lp_ctx),
+ dnsdomain);
+ W_ERROR_HAVE_NO_MEMORY(r->string);
return WERR_OK;
}
return WERR_INVALID_PARAM;
}
+static WERROR sptr_GetPrintServerData(struct ntptr_GenericHandle *server, TALLOC_CTX *mem_ctx,
+ struct spoolss_GetPrinterData *r)
+{
+ WERROR result;
+ union spoolss_PrinterData data;
+ DATA_BLOB blob;
+ enum ndr_err_code ndr_err;
+
+ result = sptr_PrintServerData(server, mem_ctx, r->in.value_name, &data, r->out.type);
+ if (!W_ERROR_IS_OK(result)) {
+ return result;
+ }
+
+ ndr_err = ndr_push_union_blob(&blob, mem_ctx,
+ &data, *r->out.type, (ndr_push_flags_fn_t)ndr_push_spoolss_PrinterData);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ return WERR_GENERAL_FAILURE;
+ }
+
+ *r->out.needed = blob.length;
+
+ if (r->in.offered >= *r->out.needed) {
+ memcpy(r->out.data, blob.data, blob.length);
+ }
+
+ return WERR_OK;
+}
+
/* PrintServer Form functions */
static WERROR sptr_EnumPrintServerForms(struct ntptr_GenericHandle *server, TALLOC_CTX *mem_ctx,
struct spoolss_EnumForms *r)
switch (r->in.level) {
case 1:
for (i=0; i < count; i++) {
- info[i].info1.flags = samdb_result_uint(msgs[i], "flags", SPOOLSS_FORM_BUILTIN);
+ info[i].info1.flags = ldb_msg_find_attr_as_uint(msgs[i], "flags", SPOOLSS_FORM_BUILTIN);
- info[i].info1.form_name = samdb_result_string(msgs[i], "form-name", NULL);
+ info[i].info1.form_name = ldb_msg_find_attr_as_string(msgs[i], "form-name", NULL);
W_ERROR_HAVE_NO_MEMORY(info[i].info1.form_name);
- info[i].info1.size.width = samdb_result_uint(msgs[i], "size-width", 0);
- info[i].info1.size.height = samdb_result_uint(msgs[i], "size-height", 0);
+ info[i].info1.size.width = ldb_msg_find_attr_as_uint(msgs[i], "size-width", 0);
+ info[i].info1.size.height = ldb_msg_find_attr_as_uint(msgs[i], "size-height", 0);
- info[i].info1.area.left = samdb_result_uint(msgs[i], "area-left", 0);
- info[i].info1.area.top = samdb_result_uint(msgs[i], "area-top", 0);
- info[i].info1.area.right = samdb_result_uint(msgs[i], "area-right", 0);
- info[i].info1.area.bottom = samdb_result_uint(msgs[i], "area-bottom", 0);
+ info[i].info1.area.left = ldb_msg_find_attr_as_uint(msgs[i], "area-left", 0);
+ info[i].info1.area.top = ldb_msg_find_attr_as_uint(msgs[i], "area-top", 0);
+ info[i].info1.area.right = ldb_msg_find_attr_as_uint(msgs[i], "area-right", 0);
+ info[i].info1.area.bottom = ldb_msg_find_attr_as_uint(msgs[i], "area-bottom", 0);
}
break;
default:
return WERR_UNKNOWN_LEVEL;
}
- r->out.info = info;
- r->out.count = count;
+ *r->out.info = info;
+ *r->out.count = count;
return WERR_OK;
}
if (count > 1) return WERR_FOOBAR;
if (count < 0) return WERR_GENERAL_FAILURE;
- flags = samdb_result_uint(msgs[0], "flags", SPOOLSS_FORM_BUILTIN);
+ flags = ldb_msg_find_attr_as_uint(msgs[0], "flags", SPOOLSS_FORM_BUILTIN);
if (flags != SPOOLSS_FORM_USER) {
return WERR_FOOBAR;
}
return WERR_UNKNOWN_LEVEL;
}
- ret = samdb_replace(sptr_db, mem_ctx, msg);
+ ret = dsdb_replace(sptr_db, msg, 0);
if (ret != 0) {
return WERR_FOOBAR;
}
if (count > 1) return WERR_FOOBAR;
if (count < 0) return WERR_GENERAL_FAILURE;
- flags = samdb_result_uint(msgs[0], "flags", SPOOLSS_FORM_BUILTIN);
+ flags = ldb_msg_find_attr_as_uint(msgs[0], "flags", SPOOLSS_FORM_BUILTIN);
if (flags != SPOOLSS_FORM_USER) {
return WERR_FOOBAR;
}
switch(r->in.level) {
case 1:
for (i = 0; i < count; i++) {
- info[i].info1.flags = samdb_result_uint(msgs[i], "flags", 0);
+ info[i].info1.flags = ldb_msg_find_attr_as_uint(msgs[i], "flags", 0);
- info[i].info1.name = samdb_result_string(msgs[i], "name", "");
+ info[i].info1.name = ldb_msg_find_attr_as_string(msgs[i], "name", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info1.name);
- info[i].info1.description = samdb_result_string(msgs[i], "description", "");
+ info[i].info1.description = ldb_msg_find_attr_as_string(msgs[i], "description", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info1.description);
- info[i].info1.comment = samdb_result_string(msgs[i], "comment", NULL);
+ info[i].info1.comment = ldb_msg_find_attr_as_string(msgs[i], "comment", NULL);
}
break;
case 2:
for (i = 0; i < count; i++) {
- info[i].info2.servername = samdb_result_string(msgs[i], "servername", "");
+ info[i].info2.servername = ldb_msg_find_attr_as_string(msgs[i], "servername", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info2.servername);
- info[i].info2.printername = samdb_result_string(msgs[i], "printername", "");
+ info[i].info2.printername = ldb_msg_find_attr_as_string(msgs[i], "printername", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info2.printername);
- info[i].info2.sharename = samdb_result_string(msgs[i], "sharename", "");
+ info[i].info2.sharename = ldb_msg_find_attr_as_string(msgs[i], "sharename", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info2.sharename);
- info[i].info2.portname = samdb_result_string(msgs[i], "portname", "");
+ info[i].info2.portname = ldb_msg_find_attr_as_string(msgs[i], "portname", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info2.portname);
- info[i].info2.drivername = samdb_result_string(msgs[i], "drivername", "");
+ info[i].info2.drivername = ldb_msg_find_attr_as_string(msgs[i], "drivername", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info2.drivername);
- info[i].info2.comment = samdb_result_string(msgs[i], "comment", NULL);
+ info[i].info2.comment = ldb_msg_find_attr_as_string(msgs[i], "comment", NULL);
- info[i].info2.location = samdb_result_string(msgs[i], "location", NULL);
+ info[i].info2.location = ldb_msg_find_attr_as_string(msgs[i], "location", NULL);
info[i].info2.devmode = NULL;
- info[i].info2.sepfile = samdb_result_string(msgs[i], "sepfile", NULL);
+ info[i].info2.sepfile = ldb_msg_find_attr_as_string(msgs[i], "sepfile", NULL);
- info[i].info2.printprocessor = samdb_result_string(msgs[i], "printprocessor", "");
+ info[i].info2.printprocessor = ldb_msg_find_attr_as_string(msgs[i], "printprocessor", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info2.printprocessor);
- info[i].info2.datatype = samdb_result_string(msgs[i], "datatype", "");
+ info[i].info2.datatype = ldb_msg_find_attr_as_string(msgs[i], "datatype", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info2.datatype);
- info[i].info2.parameters = samdb_result_string(msgs[i], "parameters", NULL);
+ info[i].info2.parameters = ldb_msg_find_attr_as_string(msgs[i], "parameters", NULL);
info[i].info2.secdesc = NULL;
- info[i].info2.attributes = samdb_result_uint(msgs[i], "attributes", 0);
- info[i].info2.priority = samdb_result_uint(msgs[i], "priority", 0);
- info[i].info2.defaultpriority = samdb_result_uint(msgs[i], "defaultpriority", 0);
- info[i].info2.starttime = samdb_result_uint(msgs[i], "starttime", 0);
- info[i].info2.untiltime = samdb_result_uint(msgs[i], "untiltime", 0);
- info[i].info2.status = samdb_result_uint(msgs[i], "status", 0);
- info[i].info2.cjobs = samdb_result_uint(msgs[i], "cjobs", 0);
- info[i].info2.averageppm = samdb_result_uint(msgs[i], "averageppm", 0);
+ info[i].info2.attributes = ldb_msg_find_attr_as_uint(msgs[i], "attributes", 0);
+ info[i].info2.priority = ldb_msg_find_attr_as_uint(msgs[i], "priority", 0);
+ info[i].info2.defaultpriority = ldb_msg_find_attr_as_uint(msgs[i], "defaultpriority", 0);
+ info[i].info2.starttime = ldb_msg_find_attr_as_uint(msgs[i], "starttime", 0);
+ info[i].info2.untiltime = ldb_msg_find_attr_as_uint(msgs[i], "untiltime", 0);
+ info[i].info2.status = ldb_msg_find_attr_as_uint(msgs[i], "status", 0);
+ info[i].info2.cjobs = ldb_msg_find_attr_as_uint(msgs[i], "cjobs", 0);
+ info[i].info2.averageppm = ldb_msg_find_attr_as_uint(msgs[i], "averageppm", 0);
}
break;
case 4:
for (i = 0; i < count; i++) {
- info[i].info4.printername = samdb_result_string(msgs[i], "printername", "");
+ info[i].info4.printername = ldb_msg_find_attr_as_string(msgs[i], "printername", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info2.printername);
- info[i].info4.servername = samdb_result_string(msgs[i], "servername", "");
+ info[i].info4.servername = ldb_msg_find_attr_as_string(msgs[i], "servername", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info2.servername);
- info[i].info4.attributes = samdb_result_uint(msgs[i], "attributes", 0);
+ info[i].info4.attributes = ldb_msg_find_attr_as_uint(msgs[i], "attributes", 0);
}
break;
case 5:
for (i = 0; i < count; i++) {
- info[i].info5.printername = samdb_result_string(msgs[i], "name", "");
+ info[i].info5.printername = ldb_msg_find_attr_as_string(msgs[i], "name", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info5.printername);
- info[i].info5.portname = samdb_result_string(msgs[i], "port", "");
+ info[i].info5.portname = ldb_msg_find_attr_as_string(msgs[i], "port", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info5.portname);
- info[i].info5.attributes = samdb_result_uint(msgs[i], "attributes", 0);
- info[i].info5.device_not_selected_timeout = samdb_result_uint(msgs[i], "device_not_selected_timeout", 0);
- info[i].info5.transmission_retry_timeout = samdb_result_uint(msgs[i], "transmission_retry_timeout", 0);
+ info[i].info5.attributes = ldb_msg_find_attr_as_uint(msgs[i], "attributes", 0);
+ info[i].info5.device_not_selected_timeout = ldb_msg_find_attr_as_uint(msgs[i], "device_not_selected_timeout", 0);
+ info[i].info5.transmission_retry_timeout = ldb_msg_find_attr_as_uint(msgs[i], "transmission_retry_timeout", 0);
}
break;
default:
return WERR_UNKNOWN_LEVEL;
}
- r->out.info = info;
- r->out.count = count;
+ *r->out.info = info;
+ *r->out.count = count;
return WERR_OK;
}
switch (r->in.level) {
case 1:
for (i = 0; i < count; i++) {
- info[i].info1.port_name = samdb_result_string(msgs[i], "port-name", "");
+ info[i].info1.port_name = ldb_msg_find_attr_as_string(msgs[i], "port-name", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info1.port_name);
}
break;
case 2:
for (i=0; i < count; i++) {
- info[i].info2.port_name = samdb_result_string(msgs[i], "port-name", "");
+ info[i].info2.port_name = ldb_msg_find_attr_as_string(msgs[i], "port-name", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info2.port_name);
- info[i].info2.monitor_name = samdb_result_string(msgs[i], "monitor-name", "");
+ info[i].info2.monitor_name = ldb_msg_find_attr_as_string(msgs[i], "monitor-name", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info2.monitor_name);
- info[i].info2.description = samdb_result_string(msgs[i], "description", "");
+ info[i].info2.description = ldb_msg_find_attr_as_string(msgs[i], "description", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info2.description);
- info[i].info2.port_type = samdb_result_uint(msgs[i], "port-type", SPOOLSS_PORT_TYPE_WRITE);
- info[i].info2.reserved = samdb_result_uint(msgs[i], "reserved", 0);
+ info[i].info2.port_type = ldb_msg_find_attr_as_uint(msgs[i], "port-type", SPOOLSS_PORT_TYPE_WRITE);
+ info[i].info2.reserved = ldb_msg_find_attr_as_uint(msgs[i], "reserved", 0);
}
break;
default:
return WERR_UNKNOWN_LEVEL;
}
- r->out.info = info;
- r->out.count = count;
+ *r->out.info = info;
+ *r->out.count = count;
return WERR_OK;
}
switch (r->in.level) {
case 1:
for (i = 0; i < count; i++) {
- info[i].info1.monitor_name = samdb_result_string(msgs[i], "monitor-name", "");
+ info[i].info1.monitor_name = ldb_msg_find_attr_as_string(msgs[i], "monitor-name", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info1.monitor_name);
}
break;
case 2:
for (i=0; i < count; i++) {
- info[i].info2.monitor_name = samdb_result_string(msgs[i], "monitor-name", "");
+ info[i].info2.monitor_name = ldb_msg_find_attr_as_string(msgs[i], "monitor-name", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info2.monitor_name);
- info[i].info2.environment = samdb_result_string(msgs[i], "environment", "");
+ info[i].info2.environment = ldb_msg_find_attr_as_string(msgs[i], "environment", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info2.environment);
- info[i].info2.dll_name = samdb_result_string(msgs[i], "dll-name", "");
+ info[i].info2.dll_name = ldb_msg_find_attr_as_string(msgs[i], "dll-name", "");
W_ERROR_HAVE_NO_MEMORY(info[i].info2.dll_name);
}
break;
return WERR_UNKNOWN_LEVEL;
}
- r->out.info = info;
- r->out.count = count;
- return WERR_OK;
+ *r->out.info = info;
+ *r->out.count = count;
return WERR_OK;
}
switch (r->in.level) {
case 1:
- info->info1.flags = samdb_result_uint(msgs[0], "flags", SPOOLSS_FORM_BUILTIN);
+ info->info1.flags = ldb_msg_find_attr_as_uint(msgs[0], "flags", SPOOLSS_FORM_BUILTIN);
- info->info1.form_name = samdb_result_string(msgs[0], "form-name", NULL);
+ info->info1.form_name = ldb_msg_find_attr_as_string(msgs[0], "form-name", NULL);
W_ERROR_HAVE_NO_MEMORY(info->info1.form_name);
- info->info1.size.width = samdb_result_uint(msgs[0], "size-width", 0);
- info->info1.size.height = samdb_result_uint(msgs[0], "size-height", 0);
+ info->info1.size.width = ldb_msg_find_attr_as_uint(msgs[0], "size-width", 0);
+ info->info1.size.height = ldb_msg_find_attr_as_uint(msgs[0], "size-height", 0);
- info->info1.area.left = samdb_result_uint(msgs[0], "area-left", 0);
- info->info1.area.top = samdb_result_uint(msgs[0], "area-top", 0);
- info->info1.area.right = samdb_result_uint(msgs[0], "area-right", 0);
- info->info1.area.bottom = samdb_result_uint(msgs[0], "area-bottom", 0);
+ info->info1.area.left = ldb_msg_find_attr_as_uint(msgs[0], "area-left", 0);
+ info->info1.area.top = ldb_msg_find_attr_as_uint(msgs[0], "area-top", 0);
+ info->info1.area.right = ldb_msg_find_attr_as_uint(msgs[0], "area-right", 0);
+ info->info1.area.bottom = ldb_msg_find_attr_as_uint(msgs[0], "area-bottom", 0);
break;
default:
return WERR_UNKNOWN_LEVEL;
return WERR_OK;
}
+static WERROR sptr_GetPrintProcessorDirectory(struct ntptr_context *ntptr, TALLOC_CTX *mem_ctx,
+ struct spoolss_GetPrintProcessorDirectory *r)
+{
+ union spoolss_PrintProcessorDirectoryInfo *info;
+ const char *prefix;
+ const char *postfix;
+
+ /*
+ * NOTE: normally r->in.level is 1, but both w2k3 and nt4 sp6a
+ * are ignoring the r->in.level completely, so we do :-)
+ */
+
+ /*
+ * TODO: check the server name is ours
+ * - if it's a invalid UNC then return WERR_INVALID_NAME
+ * - if it's the wrong host name return WERR_INVALID_PARAM
+ * - if it's "" then we need to return a local WINDOWS path
+ */
+ if (!r->in.server || !r->in.server[0]) {
+ prefix = "C:\\PRTPROCS";
+ } else {
+ prefix = talloc_asprintf(mem_ctx, "%s\\prnproc$", r->in.server);
+ W_ERROR_HAVE_NO_MEMORY(prefix);
+ }
+
+ if (r->in.environment && strcmp(SPOOLSS_ARCHITECTURE_NT_X86, r->in.environment) == 0) {
+ postfix = "W32X86";
+ } else {
+ return WERR_INVALID_ENVIRONMENT;
+ }
+
+ info = talloc(mem_ctx, union spoolss_PrintProcessorDirectoryInfo);
+ W_ERROR_HAVE_NO_MEMORY(info);
+
+ info->info1.directory_name = talloc_asprintf(mem_ctx, "%s\\%s", prefix, postfix);
+ W_ERROR_HAVE_NO_MEMORY(info->info1.directory_name);
+
+ r->out.info = info;
+ return WERR_OK;
+}
+
/*
initialialise the simble ldb backend, registering ourselves with the ntptr subsystem
/* PrintProcessor functions */
/* .EnumPrintProcessors = sptr_EnumPrintProcessors,
*/
+ .GetPrintProcessorDirectory = sptr_GetPrintProcessorDirectory,
+
/* Printer functions */
.EnumPrinters = sptr_EnumPrinters,
.OpenPrinter = sptr_OpenPrinter,