diff options
author | Günther Deschner <gd@samba.org> | 2010-05-13 00:05:40 +0200 |
---|---|---|
committer | Günther Deschner <gd@samba.org> | 2010-05-18 15:06:17 +0200 |
commit | 9bbf761bfe64b708144fb44b3f726c85efc58238 (patch) | |
tree | 0d5a8cb576ca2886fc1ef8be7d90429d1a9e1e2f /source3/utils | |
parent | f3063d925494b78407e5f694150e5174d0a5d7c4 (diff) | |
download | samba-9bbf761bfe64b708144fb44b3f726c85efc58238.tar.gz samba-9bbf761bfe64b708144fb44b3f726c85efc58238.tar.bz2 samba-9bbf761bfe64b708144fb44b3f726c85efc58238.zip |
s3-net: Added a rather trivial "net printing dump" command.
Guenther
Diffstat (limited to 'source3/utils')
-rw-r--r-- | source3/utils/net.c | 8 | ||||
-rw-r--r-- | source3/utils/net_printing.c | 202 | ||||
-rw-r--r-- | source3/utils/net_proto.h | 4 |
3 files changed, 214 insertions, 0 deletions
diff --git a/source3/utils/net.c b/source3/utils/net.c index e19e0fe1c4..85ef1ec407 100644 --- a/source3/utils/net.c +++ b/source3/utils/net.c @@ -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 index 0000000000..a04601fa80 --- /dev/null +++ b/source3/utils/net_printing.c @@ -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; +} diff --git a/source3/utils/net_proto.h b/source3/utils/net_proto.h index ab8a29731f..4cfd148309 100644 --- a/source3/utils/net_proto.h +++ b/source3/utils/net_proto.h @@ -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); |