summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorAndreas Schneider <asn@samba.org>2010-06-15 13:37:44 +0200
committerSimo Sorce <idra@samba.org>2010-07-27 10:27:15 -0400
commitb95d5563ddff7aec15f4138be731578785dca7ec (patch)
tree9ea8eff8950269b12fbd22e712a00b2ef35454d7 /source3
parent924cc43d1b8f8358f7c7aaef16b06437e39cd05b (diff)
downloadsamba-b95d5563ddff7aec15f4138be731578785dca7ec.tar.gz
samba-b95d5563ddff7aec15f4138be731578785dca7ec.tar.bz2
samba-b95d5563ddff7aec15f4138be731578785dca7ec.zip
s3-printing: Added automatic migration of printing tdbs.
Signed-off-by: Jim McDonough <jmcd@samba.org>
Diffstat (limited to 'source3')
-rw-r--r--source3/include/nt_printing.h6
-rw-r--r--source3/printing/nt_printing.c85
-rw-r--r--source3/printing/nt_printing_migrate.c1
-rw-r--r--source3/printing/printing.c83
-rw-r--r--source3/rpc_server/srv_spoolss_nt.c8
-rw-r--r--source3/smbd/process.c28
6 files changed, 113 insertions, 98 deletions
diff --git a/source3/include/nt_printing.h b/source3/include/nt_printing.h
index 830afb4804..199236bd5e 100644
--- a/source3/include/nt_printing.h
+++ b/source3/include/nt_printing.h
@@ -229,12 +229,6 @@ WERROR spoolss_create_default_devmode(TALLOC_CTX *mem_ctx,
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);
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index 8a06ef11c6..1186c6710c 100644
--- a/source3/printing/nt_printing.c
+++ b/source3/printing/nt_printing.c
@@ -82,10 +82,6 @@ bool nt_printing_init(struct messaging_context *msg_ctx)
return false;
}
- if (!nt_printing_tdb_migrate()) {
- return false;
- }
-
/*
* register callback to handle updating printers as new
* drivers are installed
@@ -1145,87 +1141,6 @@ WERROR move_driver_to_download_area(struct pipes_struct *p,
}
/****************************************************************************
-****************************************************************************/
-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.
****************************************************************************/
diff --git a/source3/printing/nt_printing_migrate.c b/source3/printing/nt_printing_migrate.c
index 94f8d87397..624d24539d 100644
--- a/source3/printing/nt_printing_migrate.c
+++ b/source3/printing/nt_printing_migrate.c
@@ -602,7 +602,6 @@ bool nt_printing_tdb_migrate(void)
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)) {
diff --git a/source3/printing/printing.c b/source3/printing/printing.c
index b620db03d5..3635e59c34 100644
--- a/source3/printing/printing.c
+++ b/source3/printing/printing.c
@@ -275,6 +275,89 @@ static TDB_DATA print_key(uint32 jobid, uint32 *tmp)
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
***********************************************************************/
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index ea3f3207fc..d781e2c950 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -85,7 +85,7 @@ const struct standard_mapping printer_std_mapping = {
/* 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,
@@ -3213,7 +3213,7 @@ static WERROR printserver_notify_info(pipes_struct *p,
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),
@@ -3296,7 +3296,7 @@ static WERROR printer_notify_info(pipes_struct *p, struct policy_handle *hnd,
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);
@@ -5392,7 +5392,7 @@ static WERROR update_printer_sec(struct policy_handle *handle,
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));
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index 13fec92ea5..d91c07e169 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -35,6 +35,7 @@
#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;
@@ -2856,6 +2857,11 @@ fail:
return false;
}
+static bool spoolss_init_cb(void)
+{
+ return nt_printing_tdb_migrate();
+}
+
/****************************************************************************
Process commands from the client
****************************************************************************/
@@ -2870,6 +2876,7 @@ void smbd_process(void)
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 &&
@@ -2969,8 +2976,6 @@ void smbd_process(void)
tsocket_address_string(remote_address, talloc_tos()),
tsocket_address_string(local_address, talloc_tos())));
- static_init_rpc;
-
init_modules();
smb_perfcount_init();
@@ -3108,6 +3113,25 @@ void smbd_process(void)
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) {