s3-net: Added a rather trivial "net printing dump" command.
authorGünther Deschner <gd@samba.org>
Wed, 12 May 2010 22:05:40 +0000 (00:05 +0200)
committerGünther Deschner <gd@samba.org>
Tue, 18 May 2010 13:06:17 +0000 (15:06 +0200)
Guenther

source3/Makefile.in
source3/utils/net.c
source3/utils/net_printing.c [new file with mode: 0644]
source3/utils/net_proto.h

index 3d47384fc7a1f7747cda12ce079641eec3b8ba22..f644c282c2154e11e5fd28b9a293140ac5f45cb5 100644 (file)
@@ -1020,7 +1020,10 @@ NET_OBJ1 = utils/net.o utils/net_ads.o utils/net_help.o \
           auth/token_util.o utils/net_dom.o utils/net_share.o \
           utils/net_g_lock.o \
           utils/net_serverid.o \
-          utils/net_eventlog.o
+          utils/net_eventlog.o \
+          utils/net_printing.o \
+          librpc/gen_ndr/ndr_ntprinting.o \
+          ../librpc/ndr/ndr_ntprinting.o
 
 # these are not processed by make proto
 NET_OBJ2 = utils/net_registry_util.o utils/net_help_common.o
index e19e0fe1c42884b9b89958c9d40e4c357722cd7c..85ef1ec407c49f8be14291c4bfec9199336d3765 100644 (file)
@@ -719,6 +719,14 @@ static struct functable net_func[] = {
                N_("  Use 'net help eventlog' to get more information about "
                   "'net eventlog' commands.")
        },
+       {       "printing",
+               net_printing,
+               NET_TRANSPORT_LOCAL,
+               N_("Process tdb printer files"),
+               N_("  Use 'net help printing' to get more information about "
+                  "'net printing' commands.")
+       },
+
        {       "serverid",
                net_serverid,
                NET_TRANSPORT_LOCAL,
diff --git a/source3/utils/net_printing.c b/source3/utils/net_printing.c
new file mode 100644 (file)
index 0000000..a04601f
--- /dev/null
@@ -0,0 +1,202 @@
+/*
+   Samba Unix/Linux SMB client library
+   Distributed SMB/CIFS Server Management Utility
+   Local printing tdb migration interface
+
+   Copyright (C) Guenther Deschner 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 "utils/net.h"
+#include "librpc/gen_ndr/ndr_ntprinting.h"
+
+#define FORMS_PREFIX "FORMS/"
+#define DRIVERS_PREFIX "DRIVERS/"
+#define PRINTERS_PREFIX "PRINTERS/"
+
+static void dump_form(TALLOC_CTX *mem_ctx,
+                     const char *key_name,
+                     unsigned char *data,
+                     size_t length)
+{
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       char *s;
+       struct ntprinting_form r;
+
+       printf("found form: %s\n", key_name);
+
+       blob = data_blob_const(data, length);
+
+       ZERO_STRUCT(r);
+
+       ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &r,
+                  (ndr_pull_flags_fn_t)ndr_pull_ntprinting_form);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               d_fprintf(stderr, _("form pull failed: %s\n"),
+                         ndr_errstr(ndr_err));
+               return;
+       }
+
+       s = NDR_PRINT_STRUCT_STRING(mem_ctx, ntprinting_form, &r);
+       if (s) {
+               printf("%s\n", s);
+       }
+}
+
+static void dump_driver(TALLOC_CTX *mem_ctx,
+                       const char *key_name,
+                       unsigned char *data,
+                       size_t length)
+{
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       char *s;
+       struct ntprinting_driver r;
+
+       printf("found driver: %s\n", key_name);
+
+       blob = data_blob_const(data, length);
+
+       ZERO_STRUCT(r);
+
+       ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &r,
+                  (ndr_pull_flags_fn_t)ndr_pull_ntprinting_driver);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               d_fprintf(stderr, _("driver pull failed: %s\n"),
+                         ndr_errstr(ndr_err));
+               return;
+       }
+
+       s = NDR_PRINT_STRUCT_STRING(mem_ctx, ntprinting_driver, &r);
+       if (s) {
+               printf("%s\n", s);
+       }
+}
+
+static void dump_printer(TALLOC_CTX *mem_ctx,
+                        const char *key_name,
+                        unsigned char *data,
+                        size_t length)
+{
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       char *s;
+       struct ntprinting_printer r;
+
+       printf("found printer: %s\n", key_name);
+
+       blob = data_blob_const(data, length);
+
+       ZERO_STRUCT(r);
+
+       ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &r,
+                  (ndr_pull_flags_fn_t)ndr_pull_ntprinting_printer);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               d_fprintf(stderr, _("printer pull failed: %s\n"),
+                         ndr_errstr(ndr_err));
+               return;
+       }
+
+       s = NDR_PRINT_STRUCT_STRING(mem_ctx, ntprinting_printer, &r);
+       if (s) {
+               printf("%s\n", s);
+       }
+}
+
+static int net_printing_dump(struct net_context *c, int argc,
+                            const char **argv)
+{
+       int ret = -1;
+       TALLOC_CTX *ctx = talloc_stackframe();
+       TDB_CONTEXT *tdb;
+       TDB_DATA kbuf, newkey, dbuf;
+
+       if (argc < 1 || c->display_usage) {
+               d_fprintf(stderr, "%s\nnet printing dump <file.tdb>\n",
+                         _("Usage:"));
+               goto done;
+       }
+
+       tdb = tdb_open_log(argv[0], 0, TDB_DEFAULT, O_RDONLY, 0600);
+       if (!tdb) {
+               d_fprintf(stderr, _("failed to open tdb file: %s\n"), argv[0]);
+               goto done;
+       }
+
+       for (kbuf = tdb_firstkey(tdb);
+            kbuf.dptr;
+            newkey = tdb_nextkey(tdb, kbuf), free(kbuf.dptr), kbuf=newkey)
+       {
+               dbuf = tdb_fetch(tdb, kbuf);
+               if (!dbuf.dptr) {
+                       continue;
+               }
+
+               if (strncmp((const char *)kbuf.dptr, FORMS_PREFIX, strlen(FORMS_PREFIX)) == 0) {
+                       dump_form(ctx, (const char *)kbuf.dptr+strlen(FORMS_PREFIX), dbuf.dptr, dbuf.dsize);
+                       SAFE_FREE(dbuf.dptr);
+                       continue;
+               }
+
+               if (strncmp((const char *)kbuf.dptr, DRIVERS_PREFIX, strlen(DRIVERS_PREFIX)) == 0) {
+                       dump_driver(ctx, (const char *)kbuf.dptr+strlen(DRIVERS_PREFIX), dbuf.dptr, dbuf.dsize);
+                       SAFE_FREE(dbuf.dptr);
+                       continue;
+               }
+
+               if (strncmp((const char *)kbuf.dptr, PRINTERS_PREFIX, strlen(PRINTERS_PREFIX)) == 0) {
+                       dump_printer(ctx, (const char *)kbuf.dptr+strlen(PRINTERS_PREFIX), dbuf.dptr, dbuf.dsize);
+                       SAFE_FREE(dbuf.dptr);
+                       continue;
+               }
+       }
+
+       ret = 0;
+
+ done:
+       talloc_free(ctx);
+       return ret;
+}
+
+/**
+ * 'net printing' entrypoint.
+ * @param argc  Standard main() style argc.
+ * @param argv  Standard main() style argv. Initial components are already
+ *              stripped.
+ **/
+
+int net_printing(struct net_context *c, int argc, const char **argv)
+{
+       int ret = -1;
+
+       struct functable func[] = {
+               {
+                       "dump",
+                       net_printing_dump,
+                       NET_TRANSPORT_LOCAL,
+                       N_("Dump eventlog"),
+                       N_("net printing dump\n"
+                          "    Dump tdb printing file")
+               },
+
+       { NULL, NULL, 0, NULL, NULL }
+       };
+
+       ret = net_run_function(c, argc, argv, "net printing", func);
+
+       return ret;
+}
index ab8a29731ff62b399b55e89f7afca10a3cbaefd6..4cfd14830941512c6838881afa0eadc55f5e57eb 100644 (file)
@@ -427,6 +427,10 @@ int net_usershare(struct net_context *c, int argc, const char **argv);
 
 int net_eventlog(struct net_context *c, int argc, const char **argv);
 
+/* The following definitions come from utils/net_printing.c  */
+
+int net_printing(struct net_context *c, int argc, const char **argv);
+
 /* The following definitions come from utils/net_serverid.c  */
 
 int net_serverid(struct net_context *c, int argc, const char **argv);