Ignore:
Timestamp:
May 13, 2014, 11:39:04 AM (11 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update trunk to 3.6.23

Location:
trunk/server
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/server

  • trunk/server/source3/utils/net_printing.c

    r745 r862  
    3838#define SECDESC_PREFIX "SECDESC/"
    3939
     40#define ARG_ENCODING "encoding="
     41
     42struct printing_opts {
     43        const char *encoding;
     44        const char *tdb;
     45};
     46
     47static NTSTATUS printing_parse_args(TALLOC_CTX *mem_ctx,
     48                                    struct printing_opts **popts,
     49                                    int argc, const char **argv)
     50{
     51        size_t c;
     52        struct printing_opts *o;
     53
     54        if (argc == 0) {
     55                return NT_STATUS_INVALID_PARAMETER;
     56        }
     57
     58        o = talloc_zero(mem_ctx, struct printing_opts);
     59        if (o == NULL) {
     60                return NT_STATUS_INVALID_PARAMETER;
     61        }
     62
     63        for (c = 0; c < argc; c++) {
     64                if (strnequal(argv[c], ARG_ENCODING, sizeof(ARG_ENCODING) - 1)) {
     65                        o->encoding = talloc_strdup(o,
     66                                        argv[c] + sizeof(ARG_ENCODING) - 1);
     67                        if (o->encoding == NULL) {
     68                                return NT_STATUS_NO_MEMORY;
     69                        }
     70                } else {
     71                        o->tdb = talloc_strdup(o, argv[c]);
     72                        if (o->tdb == NULL) {
     73                                return NT_STATUS_NO_MEMORY;
     74                        }
     75                }
     76        }
     77
     78        *popts = o;
     79        return NT_STATUS_OK;
     80}
     81
    4082static void dump_form(TALLOC_CTX *mem_ctx,
    4183                      const char *key_name,
     
    71113                        const char *key_name,
    72114                        unsigned char *data,
    73                         size_t length)
     115                        size_t length,
     116                        bool do_string_conversion)
    74117{
    75118        enum ndr_err_code ndr_err;
     
    83126
    84127        ZERO_STRUCT(r);
     128
     129        if (do_string_conversion) {
     130                r.string_flags = LIBNDR_FLAG_STR_ASCII;
     131        }
    85132
    86133        ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &r,
     
    101148                         const char *key_name,
    102149                         unsigned char *data,
    103                          size_t length)
     150                         size_t length,
     151                         bool do_string_conversion)
    104152{
    105153        enum ndr_err_code ndr_err;
     
    113161
    114162        ZERO_STRUCT(r);
     163
     164        if (do_string_conversion) {
     165                r.info.string_flags = LIBNDR_FLAG_STR_ASCII;
     166        }
    115167
    116168        ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &r,
     
    166218        TDB_CONTEXT *tdb;
    167219        TDB_DATA kbuf, newkey, dbuf;
     220        struct printing_opts *o;
     221        const char *save_dos_charset = lp_dos_charset();
     222        bool do_string_conversion = false;
     223        NTSTATUS status;
    168224
    169225        if (argc < 1 || c->display_usage) {
    170                 d_fprintf(stderr, "%s\nnet printing dump <file.tdb>\n",
    171                           _("Usage:"));
     226                d_printf(  "%s\n"
     227                           "net printing dump [options] <file.tdb>\n"
     228                           "    %s\n",
     229                         _("Usage:"),
     230                         _("Dump formated printer information of the tdb."));
     231                d_printf(_("Valid options:\n"));
     232                d_printf(_("    encoding=<CP>   Set the Code Page of the tdb file.\n"
     233                           "                    See iconv -l for the list of CP values\n"
     234                           "                    (CP1252 is Western latin1, CP1251 is Cyrillic).\n"));
    172235                goto done;
    173236        }
    174237
    175         tdb = tdb_open_log(argv[0], 0, TDB_DEFAULT, O_RDONLY, 0600);
     238        status = printing_parse_args(ctx, &o, argc, argv);
     239        if (!NT_STATUS_IS_OK(status)) {
     240                d_fprintf(stderr, _("failed to parse arguments\n"));
     241                goto done;
     242        }
     243
     244        tdb = tdb_open_log(o->tdb, 0, TDB_DEFAULT, O_RDONLY, 0600);
    176245        if (!tdb) {
    177                 d_fprintf(stderr, _("failed to open tdb file: %s\n"), argv[0]);
     246                d_fprintf(stderr, _("failed to open tdb file: %s\n"), o->tdb);
    178247                goto done;
     248        }
     249
     250        if (o->encoding != NULL) {
     251                lp_set_cmdline("dos charset", o->encoding);
     252                d_fprintf(stderr, _("do string conversion from %s to %s\n"),
     253                                    lp_dos_charset(), lp_unix_charset());
     254                do_string_conversion = true;
    179255        }
    180256
     
    195271
    196272                if (strncmp((const char *)kbuf.dptr, DRIVERS_PREFIX, strlen(DRIVERS_PREFIX)) == 0) {
    197                         dump_driver(ctx, (const char *)kbuf.dptr+strlen(DRIVERS_PREFIX), dbuf.dptr, dbuf.dsize);
     273                        dump_driver(ctx,
     274                                    (const char *)kbuf.dptr+strlen(DRIVERS_PREFIX),
     275                                    dbuf.dptr,
     276                                    dbuf.dsize,
     277                                    do_string_conversion);
    198278                        SAFE_FREE(dbuf.dptr);
    199279                        continue;
     
    201281
    202282                if (strncmp((const char *)kbuf.dptr, PRINTERS_PREFIX, strlen(PRINTERS_PREFIX)) == 0) {
    203                         dump_printer(ctx, (const char *)kbuf.dptr+strlen(PRINTERS_PREFIX), dbuf.dptr, dbuf.dsize);
     283                        dump_printer(ctx,
     284                                     (const char *)kbuf.dptr+strlen(PRINTERS_PREFIX),
     285                                     dbuf.dptr,
     286                                     dbuf.dsize,
     287                                     do_string_conversion);
    204288                        SAFE_FREE(dbuf.dptr);
    205289                        continue;
     
    217301
    218302 done:
     303        lp_set_cmdline("dos charset", save_dos_charset);
    219304        talloc_free(ctx);
    220305        return ret;
     
    230315                                          const char **argv)
    231316{
     317        struct printing_opts *o;
    232318        TALLOC_CTX *tmp_ctx;
    233319        TDB_CONTEXT *tdb;
    234320        TDB_DATA kbuf, newkey, dbuf;
    235321        NTSTATUS status;
     322        const char *save_dos_charset = lp_dos_charset();
     323        bool do_string_conversion = false;
    236324
    237325        tmp_ctx = talloc_new(mem_ctx);
     
    240328        }
    241329
    242         tdb = tdb_open_log(argv[0], 0, TDB_DEFAULT, O_RDONLY, 0600);
     330        status = printing_parse_args(tmp_ctx, &o, argc, argv);
     331        if (!NT_STATUS_IS_OK(status)) {
     332                d_fprintf(stderr, _("failed to parse arguments\n"));
     333                goto done;
     334        }
     335
     336        tdb = tdb_open_log(o->tdb, 0, TDB_DEFAULT, O_RDONLY, 0600);
    243337        if (tdb == NULL) {
    244                 d_fprintf(stderr, _("failed to open tdb file: %s\n"), argv[0]);
     338                d_fprintf(stderr, _("failed to open tdb file: %s\n"), o->tdb);
    245339                status = NT_STATUS_NO_SUCH_FILE;
    246340                goto done;
     341        }
     342
     343        if (o->encoding != NULL) {
     344                lp_set_cmdline("dos charset", o->encoding);
     345                d_fprintf(stderr, _("do string conversion from %s to %s\n"),
     346                                    lp_dos_charset(), lp_unix_charset());
     347                do_string_conversion = true;
    247348        }
    248349
     
    271372                                       (const char *) kbuf.dptr + strlen(DRIVERS_PREFIX),
    272373                                       dbuf.dptr,
    273                                        dbuf.dsize);
     374                                       dbuf.dsize,
     375                                       do_string_conversion);
    274376                        SAFE_FREE(dbuf.dptr);
    275377                        continue;
     
    281383                                        (const char *) kbuf.dptr + strlen(PRINTERS_PREFIX),
    282384                                        dbuf.dptr,
    283                                         dbuf.dsize);
     385                                        dbuf.dsize,
     386                                        do_string_conversion);
    284387                        SAFE_FREE(dbuf.dptr);
    285388                        continue;
     
    313416
    314417 done:
     418        lp_set_cmdline("dos charset", save_dos_charset);
    315419        talloc_free(tmp_ctx);
    316420        return status;
     
    323427        if (argc < 1 || c->display_usage) {
    324428                d_printf(  "%s\n"
    325                            "net printing migrate <file.tdb>\n"
     429                           "net printing migrate [options] <file.tdb>\n"
    326430                           "    %s\n",
    327431                         _("Usage:"),
    328432                         _("Migrate tdb printing files to new storage"));
     433                d_printf(_("Valid options:\n"));
     434                d_printf(_("    encoding=<CP>   Set the Code Page of the tdb file.\n"
     435                           "                    See iconv -l for the list of CP values\n"
     436                           "                    (CP1252 is Western latin1, CP1251 is Cyrillic).\n"));
    329437                return 0;
    330438        }
Note: See TracChangeset for help on using the changeset viewer.