const char *devicename,
struct spoolss_DeviceMode **devmode);
-int pack_devicemode(struct spoolss_DeviceMode *devmode, uint8 *buf, int buflen);
-
-int unpack_devicemode(TALLOC_CTX *mem_ctx,
- const uint8 *buf, int buflen,
- struct spoolss_DeviceMode **devmode);
-
WERROR spoolss_create_default_secdesc(TALLOC_CTX *mem_ctx,
struct spoolss_security_descriptor **secdesc);
return false;
}
- if (!nt_printing_tdb_migrate()) {
- return false;
- }
-
/*
* register callback to handle updating printers as new
* drivers are installed
return (*perr);
}
-/****************************************************************************
-****************************************************************************/
-int pack_devicemode(struct spoolss_DeviceMode *devmode, uint8 *buf, int buflen)
-{
- enum ndr_err_code ndr_err;
- DATA_BLOB blob;
- int len = 0;
-
- if (devmode) {
- ndr_err = ndr_push_struct_blob(&blob, talloc_tos(),
- devmode,
- (ndr_push_flags_fn_t)
- ndr_push_spoolss_DeviceMode);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- DEBUG(10, ("pack_devicemode: "
- "error encoding spoolss_DeviceMode\n"));
- goto done;
- }
- } else {
- ZERO_STRUCT(blob);
- }
-
- len = tdb_pack(buf, buflen, "B", blob.length, blob.data);
-
- if (devmode) {
- DEBUG(8, ("Packed devicemode [%s]\n", devmode->formname));
- }
-
-done:
- return len;
-}
-
-/****************************************************************************
-****************************************************************************/
-int unpack_devicemode(TALLOC_CTX *mem_ctx,
- const uint8 *buf, int buflen,
- struct spoolss_DeviceMode **devmode)
-{
- struct spoolss_DeviceMode *dm;
- enum ndr_err_code ndr_err;
- char *data = NULL;
- int data_len = 0;
- DATA_BLOB blob;
- int len = 0;
-
- *devmode = NULL;
-
- len = tdb_unpack(buf, buflen, "B", &data_len, &data);
- if (!data) {
- return len;
- }
-
- dm = talloc_zero(mem_ctx, struct spoolss_DeviceMode);
- if (!dm) {
- goto done;
- }
-
- blob = data_blob_const(data, data_len);
-
- ndr_err = ndr_pull_struct_blob(&blob, dm, dm,
- (ndr_pull_flags_fn_t)ndr_pull_spoolss_DeviceMode);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- DEBUG(10, ("unpack_devicemode: "
- "error parsing spoolss_DeviceMode\n"));
- goto done;
- }
-
- DEBUG(8, ("Unpacked devicemode [%s](%s)\n",
- dm->devicename, dm->formname));
- if (dm->driverextra_data.data) {
- DEBUG(8, ("with a private section of %d bytes\n",
- dm->__driverextra_length));
- }
-
- *devmode = dm;
-
-done:
- SAFE_FREE(data);
- return len;
-}
-
/****************************************************************************
Create and allocate a default devicemode.
****************************************************************************/
status = rpc_pipe_open_internal(tmp_ctx,
&ndr_table_spoolss.syntax_id,
- rpc_spoolss_dispatch,
server_info,
&spoolss_pipe);
if (!NT_STATUS_IS_OK(status)) {
return ret;
}
+/****************************************************************************
+ Pack the devicemode to store it in a tdb.
+****************************************************************************/
+static int pack_devicemode(struct spoolss_DeviceMode *devmode, uint8 *buf, int buflen)
+{
+ enum ndr_err_code ndr_err;
+ DATA_BLOB blob;
+ int len = 0;
+
+ if (devmode) {
+ ndr_err = ndr_push_struct_blob(&blob, talloc_tos(),
+ devmode,
+ (ndr_push_flags_fn_t)
+ ndr_push_spoolss_DeviceMode);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ DEBUG(10, ("pack_devicemode: "
+ "error encoding spoolss_DeviceMode\n"));
+ goto done;
+ }
+ } else {
+ ZERO_STRUCT(blob);
+ }
+
+ len = tdb_pack(buf, buflen, "B", blob.length, blob.data);
+
+ if (devmode) {
+ DEBUG(8, ("Packed devicemode [%s]\n", devmode->formname));
+ }
+
+done:
+ return len;
+}
+
+/****************************************************************************
+ Unpack the devicemode to store it in a tdb.
+****************************************************************************/
+static int unpack_devicemode(TALLOC_CTX *mem_ctx,
+ const uint8 *buf, int buflen,
+ struct spoolss_DeviceMode **devmode)
+{
+ struct spoolss_DeviceMode *dm;
+ enum ndr_err_code ndr_err;
+ char *data = NULL;
+ int data_len = 0;
+ DATA_BLOB blob;
+ int len = 0;
+
+ *devmode = NULL;
+
+ len = tdb_unpack(buf, buflen, "B", &data_len, &data);
+ if (!data) {
+ return len;
+ }
+
+ dm = talloc_zero(mem_ctx, struct spoolss_DeviceMode);
+ if (!dm) {
+ goto done;
+ }
+
+ blob = data_blob_const(data, data_len);
+
+ ndr_err = ndr_pull_struct_blob(&blob, dm, dm,
+ (ndr_pull_flags_fn_t)ndr_pull_spoolss_DeviceMode);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ DEBUG(10, ("unpack_devicemode: "
+ "error parsing spoolss_DeviceMode\n"));
+ goto done;
+ }
+
+ DEBUG(8, ("Unpacked devicemode [%s](%s)\n",
+ dm->devicename, dm->formname));
+ if (dm->driverextra_data.data) {
+ DEBUG(8, ("with a private section of %d bytes\n",
+ dm->__driverextra_length));
+ }
+
+ *devmode = dm;
+
+done:
+ SAFE_FREE(data);
+ return len;
+}
+
/***********************************************************************
unpack a pjob from a tdb buffer
***********************************************************************/
/* Map generic permissions to print server object specific permissions */
-const struct generic_mapping printserver_std_mapping = {
+const struct standard_mapping printserver_std_mapping = {
SERVER_READ,
SERVER_WRITE,
SERVER_EXECUTE,
continue; /* skip */
}
- /* FIXME: should we use a SYSTEM server_info here? */
+ /* Maybe we should use the SYSTEM server_info here... */
result = winreg_get_printer(mem_ctx, p->server_info,
Printer->servername,
lp_servicename(snum),
get_printer_snum(p, hnd, &snum, NULL);
- /* FIXME: should we use a SYSTEM server_info here ? */
+ /* Maybe we should use the SYSTEM server_info here... */
result = winreg_get_printer(mem_ctx, p->server_info,
Printer->servername,
lp_servicename(snum), &pinfo2);
struct security_acl *the_acl;
int i;
- the_acl = secdesc_ctr->sd->dacl;
+ the_acl = old_secdesc->dacl;
DEBUG(10, ("old_secdesc_ctr for %s has %d aces:\n",
printer, the_acl->num_aces));
#include "../librpc/gen_ndr/srv_winreg.h"
#include "../librpc/gen_ndr/srv_wkssvc.h"
#include "librpc/gen_ndr/messaging.h"
+#include "printing/nt_printing_migrate.h"
extern bool global_machine_password_needs_changing;
return false;
}
+static bool spoolss_init_cb(void)
+{
+ return nt_printing_tdb_migrate();
+}
+
/****************************************************************************
Process commands from the client
****************************************************************************/
struct tsocket_address *remote_address = NULL;
const char *remaddr = NULL;
int ret;
+ struct rpc_srv_callbacks spoolss_cb;
if (lp_maxprotocol() == PROTOCOL_SMB2 &&
lp_security() != SEC_SHARE &&
tsocket_address_string(remote_address, talloc_tos()),
tsocket_address_string(local_address, talloc_tos())));
- static_init_rpc;
-
init_modules();
smb_perfcount_init();
exit_server("failed to create smbd_server_connection fde");
}
+ /*
+ * Initialize spoolss with an init function to convert printers first.
+ * static_init_rpc will try to initialize the spoolss server too but you
+ * can't register it twice.
+ */
+ spoolss_cb.init = spoolss_init_cb;
+ spoolss_cb.shutdown = NULL;
+
+
+ if (!NT_STATUS_IS_OK(rpc_winreg_init(NULL))) {
+ exit(1);
+ }
+
+ if (!NT_STATUS_IS_OK(rpc_spoolss_init(&spoolss_cb))) {
+ exit(1);
+ }
+
+ static_init_rpc;
+
TALLOC_FREE(frame);
while (True) {