The branch, master has been updated
       via  bafd721 s3-net: use printing_migrate library, and eliminate 
duplicate code.
       via  e02abd6 s3-printing: split out printing migration code into a 
smaller library.
      from  1765833 s3:smbldap: make smbldap_connect_system self contained

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit bafd7212eb4c82e86874b2f80ddf5c04b2d180b9
Author: Günther Deschner <g...@samba.org>
Date:   Fri Jul 1 15:02:26 2011 +0200

    s3-net: use printing_migrate library, and eliminate duplicate code.
    
    Guenther
    
    Autobuild-User: Günther Deschner <g...@samba.org>
    Autobuild-Date: Fri Jul  1 17:57:09 CEST 2011 on sn-devel-104

commit e02abd6c83708f297b1985bb1bdc7d5dfbc924b2
Author: Günther Deschner <g...@samba.org>
Date:   Fri Jul 1 14:57:32 2011 +0200

    s3-printing: split out printing migration code into a smaller library.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 source3/Makefile.in                                |    3 +-
 source3/printing/nt_printing_migrate.c             |  265 +-----------
 source3/printing/nt_printing_migrate.h             |   21 +-
 source3/printing/nt_printing_migrate_internal.c    |  249 ++++++++++++
 ...ng_migrate.h => nt_printing_migrate_internal.h} |    6 +-
 source3/printing/spoolssd.c                        |    2 +-
 source3/rpc_server/rpc_ep_setup.c                  |    2 +-
 source3/utils/net_printing.c                       |  421 +-------------------
 source3/wscript_build                              |   11 +-
 9 files changed, 312 insertions(+), 668 deletions(-)
 create mode 100644 source3/printing/nt_printing_migrate_internal.c
 copy source3/printing/{nt_printing_migrate.h => 
nt_printing_migrate_internal.h} (87%)


Changeset truncated at 500 lines:

diff --git a/source3/Makefile.in b/source3/Makefile.in
index e052881..4839ab6 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -963,6 +963,7 @@ PRINTBACKEND_OBJ = printing/printing.o \
                   printing/nt_printing.o \
                   printing/nt_printing_tdb.o \
                   printing/nt_printing_migrate.o \
+                  printing/nt_printing_migrate_internal.o \
                   printing/nt_printing_ads.o \
                   librpc/gen_ndr/ndr_ntprinting.o \
                    ../librpc/ndr/ndr_ntprinting.o \
@@ -1201,7 +1202,7 @@ NET_OBJ1 = utils/net.o utils/net_ads.o utils/net_help.o \
           rpc_client/init_samr.o \
           registry/reg_parse.o registry/reg_format.o \
           registry/reg_parse_internal.o registry/reg_import.o \
-          lib/cbuf.o lib/srprs.o
+          lib/cbuf.o lib/srprs.o printing/nt_printing_migrate.o
 
 # these are not processed by make proto
 NET_OBJ2 = utils/net_registry_util.o utils/net_help_common.o
diff --git a/source3/printing/nt_printing_migrate.c 
b/source3/printing/nt_printing_migrate.c
index 7914585..dc3f369 100644
--- a/source3/printing/nt_printing_migrate.c
+++ b/source3/printing/nt_printing_migrate.c
@@ -19,27 +19,18 @@
  */
 
 #include "includes.h"
-#include "system/filesys.h"
 #include "printing/nt_printing_migrate.h"
 
 #include "rpc_client/rpc_client.h"
 #include "librpc/gen_ndr/ndr_ntprinting.h"
 #include "librpc/gen_ndr/ndr_spoolss_c.h"
 #include "librpc/gen_ndr/ndr_security.h"
-#include "rpc_server/rpc_ncacn_np.h"
-#include "auth.h"
-#include "util_tdb.h"
-
-#define FORMS_PREFIX "FORMS/"
-#define DRIVERS_PREFIX "DRIVERS/"
-#define PRINTERS_PREFIX "PRINTERS/"
-#define SECDESC_PREFIX "SECDESC/"
-
-static NTSTATUS migrate_form(TALLOC_CTX *mem_ctx,
-                        struct rpc_pipe_client *pipe_hnd,
-                        const char *key_name,
-                        unsigned char *data,
-                        size_t length)
+
+NTSTATUS printing_tdb_migrate_form(TALLOC_CTX *mem_ctx,
+                                  struct rpc_pipe_client *pipe_hnd,
+                                  const char *key_name,
+                                  unsigned char *data,
+                                  size_t length)
 {
        struct dcerpc_binding_handle *b = pipe_hnd->binding_handle;
        struct spoolss_DevmodeContainer devmode_ctr;
@@ -133,11 +124,11 @@ static NTSTATUS migrate_form(TALLOC_CTX *mem_ctx,
        return status;
 }
 
-static NTSTATUS migrate_driver(TALLOC_CTX *mem_ctx,
-                              struct rpc_pipe_client *pipe_hnd,
-                              const char *key_name,
-                              unsigned char *data,
-                              size_t length)
+NTSTATUS printing_tdb_migrate_driver(TALLOC_CTX *mem_ctx,
+                                    struct rpc_pipe_client *pipe_hnd,
+                                    const char *key_name,
+                                    unsigned char *data,
+                                    size_t length)
 {
        struct dcerpc_binding_handle *b = pipe_hnd->binding_handle;
        const char *srv_name_slash;
@@ -205,11 +196,11 @@ static NTSTATUS migrate_driver(TALLOC_CTX *mem_ctx,
        return status;
 }
 
-static NTSTATUS migrate_printer(TALLOC_CTX *mem_ctx,
-                               struct rpc_pipe_client *pipe_hnd,
-                               const char *key_name,
-                               unsigned char *data,
-                               size_t length)
+NTSTATUS printing_tdb_migrate_printer(TALLOC_CTX *mem_ctx,
+                                     struct rpc_pipe_client *pipe_hnd,
+                                     const char *key_name,
+                                     unsigned char *data,
+                                     size_t length)
 {
        struct dcerpc_binding_handle *b = pipe_hnd->binding_handle;
        struct policy_handle hnd;
@@ -409,11 +400,11 @@ static NTSTATUS migrate_printer(TALLOC_CTX *mem_ctx,
        return status;
 }
 
-static NTSTATUS migrate_secdesc(TALLOC_CTX *mem_ctx,
-                               struct rpc_pipe_client *pipe_hnd,
-                               const char *key_name,
-                               unsigned char *data,
-                               size_t length)
+NTSTATUS printing_tdb_migrate_secdesc(TALLOC_CTX *mem_ctx,
+                                     struct rpc_pipe_client *pipe_hnd,
+                                     const char *key_name,
+                                     unsigned char *data,
+                                     size_t length)
 {
        struct dcerpc_binding_handle *b = pipe_hnd->binding_handle;
        struct policy_handle hnd;
@@ -494,217 +485,3 @@ static NTSTATUS migrate_secdesc(TALLOC_CTX *mem_ctx,
 
        return status;
 }
-
-static int rename_file_with_suffix(TALLOC_CTX *mem_ctx,
-                                  const char *path,
-                                  const char *suffix)
-{
-       int rc = -1;
-       char *dst_path;
-
-       dst_path = talloc_asprintf(mem_ctx, "%s%s", path, suffix);
-       if (dst_path == NULL) {
-               DEBUG(3, ("error out of memory\n"));
-               return rc;
-       }
-
-       rc = (rename(path, dst_path) != 0);
-
-       if (rc == 0) {
-               DEBUG(5, ("moved '%s' to '%s'\n", path, dst_path));
-       } else if (errno == ENOENT) {
-               DEBUG(3, ("file '%s' does not exist - so not moved\n", path));
-               rc = 0;
-       } else {
-               DEBUG(3, ("error renaming %s to %s: %s\n", path, dst_path,
-                         strerror(errno)));
-       }
-
-       TALLOC_FREE(dst_path);
-       return rc;
-}
-
-static NTSTATUS migrate_internal(TALLOC_CTX *mem_ctx,
-                                const char *tdb_path,
-                                struct rpc_pipe_client *pipe_hnd)
-{
-       const char *backup_suffix = ".bak";
-       TDB_DATA kbuf, dbuf;
-       TDB_CONTEXT *tdb;
-       NTSTATUS status;
-       int rc;
-
-       tdb = tdb_open_log(tdb_path, 0, TDB_DEFAULT, O_RDONLY, 0600);
-       if (tdb == NULL && errno == ENOENT) {
-               /* if we have no printers database then migration is
-                  considered successful */
-               DEBUG(4, ("No printers database to migrate in %s\n", tdb_path));
-               return NT_STATUS_OK;
-       }
-       if (tdb == NULL) {
-               DEBUG(2, ("Failed to open tdb file: %s\n", tdb_path));
-               return NT_STATUS_NO_SUCH_FILE;
-       }
-
-       for (kbuf = tdb_firstkey_compat(tdb);
-            kbuf.dptr;
-            kbuf = tdb_nextkey_compat(tdb, kbuf))
-       {
-               dbuf = tdb_fetch_compat(tdb, kbuf);
-               if (!dbuf.dptr) {
-                       continue;
-               }
-
-               if (strncmp((const char *) kbuf.dptr, FORMS_PREFIX, 
strlen(FORMS_PREFIX)) == 0) {
-                       status = migrate_form(mem_ctx,
-                                             pipe_hnd,
-                                             (const char *) kbuf.dptr + 
strlen(FORMS_PREFIX),
-                                             dbuf.dptr,
-                                             dbuf.dsize);
-                       SAFE_FREE(dbuf.dptr);
-                       if (!NT_STATUS_IS_OK(status)) {
-                               tdb_close(tdb);
-                               return status;
-                       }
-                       continue;
-               }
-
-               if (strncmp((const char *) kbuf.dptr, DRIVERS_PREFIX, 
strlen(DRIVERS_PREFIX)) == 0) {
-                       status = migrate_driver(mem_ctx,
-                                               pipe_hnd,
-                                               (const char *) kbuf.dptr + 
strlen(DRIVERS_PREFIX),
-                                               dbuf.dptr,
-                                               dbuf.dsize);
-                       SAFE_FREE(dbuf.dptr);
-                       if (!NT_STATUS_IS_OK(status)) {
-                               tdb_close(tdb);
-                               return status;
-                       }
-                       continue;
-               }
-
-               if (strncmp((const char *) kbuf.dptr, PRINTERS_PREFIX, 
strlen(PRINTERS_PREFIX)) == 0) {
-                       const char *printer_name = (const char *)(kbuf.dptr
-                                                   + strlen(PRINTERS_PREFIX));
-                       status = migrate_printer(mem_ctx,
-                                                pipe_hnd,
-                                                printer_name,
-                                                dbuf.dptr,
-                                                dbuf.dsize);
-                       SAFE_FREE(dbuf.dptr);
-                       /* currently no WERR_INVALID_PRINTER_NAME equivalent */
-                       if (NT_STATUS_EQUAL(status,
-                              werror_to_ntstatus(WERR_INVALID_PRINTER_NAME))) {
-                               DEBUG(2, ("Skipping migration for non-existent "
-                                               "printer: %s\n", printer_name));
-                       } else if (!NT_STATUS_IS_OK(status)) {
-                               tdb_close(tdb);
-                               return status;
-                       }
-                       continue;
-               }
-
-               if (strncmp((const char *) kbuf.dptr, SECDESC_PREFIX, 
strlen(SECDESC_PREFIX)) == 0) {
-                       const char *secdesc_name = (const char *)(kbuf.dptr
-                                                   + strlen(SECDESC_PREFIX));
-                       status = migrate_secdesc(mem_ctx,
-                                                pipe_hnd,
-                                                secdesc_name,
-                                                dbuf.dptr,
-                                                dbuf.dsize);
-                       SAFE_FREE(dbuf.dptr);
-                       /* currently no WERR_INVALID_PRINTER_NAME equivalent */
-                       if (NT_STATUS_EQUAL(status,
-                              werror_to_ntstatus(WERR_INVALID_PRINTER_NAME))) {
-                               DEBUG(2, ("Skipping migration for non-existent "
-                                               "secdesc: %s\n", secdesc_name));
-                       } else if (!NT_STATUS_IS_OK(status)) {
-                               tdb_close(tdb);
-                               return status;
-                       }
-                       continue;
-               }
-       }
-
-       tdb_close(tdb);
-
-       rc = rename_file_with_suffix(mem_ctx, tdb_path, backup_suffix);
-       if (rc != 0) {
-               DEBUG(0, ("Error moving tdb to '%s%s'\n",
-                         tdb_path, backup_suffix));
-       }
-
-       return NT_STATUS_OK;
-}
-
-bool nt_printing_tdb_migrate(struct messaging_context *msg_ctx)
-{
-       const char *drivers_path = state_path("ntdrivers.tdb");
-       const char *printers_path = state_path("ntprinters.tdb");
-       const char *forms_path = state_path("ntforms.tdb");
-       bool drivers_exists = file_exist(drivers_path);
-       bool printers_exists = file_exist(printers_path);
-       bool forms_exists = file_exist(forms_path);
-       struct auth_serversupplied_info *session_info;
-       struct rpc_pipe_client *spoolss_pipe = NULL;
-       TALLOC_CTX *tmp_ctx = talloc_stackframe();
-       NTSTATUS status;
-
-       if (!drivers_exists && !printers_exists && !forms_exists) {
-               return true;
-       }
-
-       status = make_session_info_system(tmp_ctx, &session_info);
-       if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(0, ("Couldn't create session_info: %s\n",
-                         nt_errstr(status)));
-               talloc_free(tmp_ctx);
-               return false;
-       }
-
-       status = rpc_pipe_open_interface(tmp_ctx,
-                                       &ndr_table_spoolss.syntax_id,
-                                       session_info,
-                                       NULL,
-                                       msg_ctx,
-                                       &spoolss_pipe);
-       if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(0, ("Couldn't open internal spoolss pipe: %s\n",
-                         nt_errstr(status)));
-               talloc_free(tmp_ctx);
-               return false;
-       }
-
-       if (drivers_exists) {
-               status = migrate_internal(tmp_ctx, drivers_path, spoolss_pipe);
-               if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(0, ("Couldn't migrate drivers tdb file: %s\n",
-                         nt_errstr(status)));
-                       talloc_free(tmp_ctx);
-                       return false;
-               }
-       }
-
-       if (printers_exists) {
-               status = migrate_internal(tmp_ctx, printers_path, spoolss_pipe);
-               if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(0, ("Couldn't migrate printers tdb file: %s\n",
-                                 nt_errstr(status)));
-                       talloc_free(tmp_ctx);
-                       return false;
-               }
-       }
-
-       if (forms_exists) {
-               status = migrate_internal(tmp_ctx, forms_path, spoolss_pipe);
-               if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(0, ("Couldn't migrate forms tdb file: %s\n",
-                                 nt_errstr(status)));
-                       talloc_free(tmp_ctx);
-                       return false;
-               }
-       }
-
-       talloc_free(tmp_ctx);
-       return true;
-}
diff --git a/source3/printing/nt_printing_migrate.h 
b/source3/printing/nt_printing_migrate.h
index 9ab2fa7..4991d06 100644
--- a/source3/printing/nt_printing_migrate.h
+++ b/source3/printing/nt_printing_migrate.h
@@ -21,6 +21,25 @@
 #ifndef _NT_PRINTING_MIGRATE_H_
 #define _NT_PRINTING_MIGRATE_H_
 
-bool nt_printing_tdb_migrate(struct messaging_context *msg_ctx);
+NTSTATUS printing_tdb_migrate_form(TALLOC_CTX *mem_ctx,
+                                  struct rpc_pipe_client *pipe_hnd,
+                                  const char *key_name,
+                                  unsigned char *data,
+                                  size_t length);
+NTSTATUS printing_tdb_migrate_driver(TALLOC_CTX *mem_ctx,
+                                    struct rpc_pipe_client *pipe_hnd,
+                                    const char *key_name,
+                                    unsigned char *data,
+                                    size_t length);
+NTSTATUS printing_tdb_migrate_printer(TALLOC_CTX *mem_ctx,
+                                     struct rpc_pipe_client *pipe_hnd,
+                                     const char *key_name,
+                                     unsigned char *data,
+                                     size_t length);
+NTSTATUS printing_tdb_migrate_secdesc(TALLOC_CTX *mem_ctx,
+                                     struct rpc_pipe_client *pipe_hnd,
+                                     const char *key_name,
+                                     unsigned char *data,
+                                     size_t length);
 
 #endif /* _NT_PRINTING_MIGRATE_H_ */
diff --git a/source3/printing/nt_printing_migrate_internal.c 
b/source3/printing/nt_printing_migrate_internal.c
new file mode 100644
index 0000000..59f6d33
--- /dev/null
+++ b/source3/printing/nt_printing_migrate_internal.c
@@ -0,0 +1,249 @@
+/*
+ *  Unix SMB/CIFS implementation.
+ *  RPC Pipe client / server routines
+ *
+ *  Copyright (c) Andreas Schneider            2010.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "includes.h"
+#include "system/filesys.h"
+#include "printing/nt_printing_migrate.h"
+#include "printing/nt_printing_migrate_internal.h"
+
+#include "rpc_client/rpc_client.h"
+#include "librpc/gen_ndr/ndr_spoolss_c.h"
+#include "rpc_server/rpc_ncacn_np.h"
+#include "auth.h"
+#include "util_tdb.h"
+
+#define FORMS_PREFIX "FORMS/"
+#define DRIVERS_PREFIX "DRIVERS/"
+#define PRINTERS_PREFIX "PRINTERS/"
+#define SECDESC_PREFIX "SECDESC/"
+
+static int rename_file_with_suffix(TALLOC_CTX *mem_ctx,
+                                  const char *path,
+                                  const char *suffix)
+{
+       int rc = -1;
+       char *dst_path;
+
+       dst_path = talloc_asprintf(mem_ctx, "%s%s", path, suffix);
+       if (dst_path == NULL) {
+               DEBUG(3, ("error out of memory\n"));
+               return rc;
+       }
+
+       rc = (rename(path, dst_path) != 0);
+
+       if (rc == 0) {
+               DEBUG(5, ("moved '%s' to '%s'\n", path, dst_path));
+       } else if (errno == ENOENT) {
+               DEBUG(3, ("file '%s' does not exist - so not moved\n", path));
+               rc = 0;
+       } else {
+               DEBUG(3, ("error renaming %s to %s: %s\n", path, dst_path,
+                         strerror(errno)));
+       }
+
+       TALLOC_FREE(dst_path);
+       return rc;
+}
+
+static NTSTATUS migrate_internal(TALLOC_CTX *mem_ctx,
+                                const char *tdb_path,
+                                struct rpc_pipe_client *pipe_hnd)
+{
+       const char *backup_suffix = ".bak";
+       TDB_DATA kbuf, dbuf;
+       TDB_CONTEXT *tdb;
+       NTSTATUS status;
+       int rc;
+
+       tdb = tdb_open_log(tdb_path, 0, TDB_DEFAULT, O_RDONLY, 0600);
+       if (tdb == NULL && errno == ENOENT) {
+               /* if we have no printers database then migration is
+                  considered successful */
+               DEBUG(4, ("No printers database to migrate in %s\n", tdb_path));
+               return NT_STATUS_OK;
+       }
+       if (tdb == NULL) {
+               DEBUG(2, ("Failed to open tdb file: %s\n", tdb_path));
+               return NT_STATUS_NO_SUCH_FILE;
+       }
+
+       for (kbuf = tdb_firstkey_compat(tdb);
+            kbuf.dptr;
+            kbuf = tdb_nextkey_compat(tdb, kbuf))
+       {
+               dbuf = tdb_fetch_compat(tdb, kbuf);
+               if (!dbuf.dptr) {
+                       continue;
+               }
+
+               if (strncmp((const char *) kbuf.dptr, FORMS_PREFIX, 
strlen(FORMS_PREFIX)) == 0) {
+                       status = printing_tdb_migrate_form(mem_ctx,
+                                             pipe_hnd,
+                                             (const char *) kbuf.dptr + 
strlen(FORMS_PREFIX),
+                                             dbuf.dptr,
+                                             dbuf.dsize);
+                       SAFE_FREE(dbuf.dptr);
+                       if (!NT_STATUS_IS_OK(status)) {
+                               tdb_close(tdb);
+                               return status;
+                       }
+                       continue;
+               }
+
+               if (strncmp((const char *) kbuf.dptr, DRIVERS_PREFIX, 
strlen(DRIVERS_PREFIX)) == 0) {
+                       status = printing_tdb_migrate_driver(mem_ctx,
+                                               pipe_hnd,
+                                               (const char *) kbuf.dptr + 
strlen(DRIVERS_PREFIX),
+                                               dbuf.dptr,
+                                               dbuf.dsize);
+                       SAFE_FREE(dbuf.dptr);
+                       if (!NT_STATUS_IS_OK(status)) {
+                               tdb_close(tdb);
+                               return status;
+                       }
+                       continue;
+               }
+
+               if (strncmp((const char *) kbuf.dptr, PRINTERS_PREFIX, 
strlen(PRINTERS_PREFIX)) == 0) {
+                       const char *printer_name = (const char *)(kbuf.dptr
+                                                   + strlen(PRINTERS_PREFIX));
+                       status = printing_tdb_migrate_printer(mem_ctx,
+                                                pipe_hnd,
+                                                printer_name,
+                                                dbuf.dptr,
+                                                dbuf.dsize);
+                       SAFE_FREE(dbuf.dptr);
+                       /* currently no WERR_INVALID_PRINTER_NAME equivalent */
+                       if (NT_STATUS_EQUAL(status,


-- 
Samba Shared Repository

Reply via email to