mirror of
https://github.com/samba-team/samba.git
synced 2025-02-28 01:58:17 +03:00
s3-net: Added a rather trivial "net printing dump" command.
Guenther
This commit is contained in:
parent
f3063d9254
commit
9bbf761bfe
@ -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
|
||||
|
@ -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,
|
||||
|
202
source3/utils/net_printing.c
Normal file
202
source3/utils/net_printing.c
Normal file
@ -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;
|
||||
}
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user