Print this page
3328 smbutil view does't work with Win2008 and later
requires 1575 untangle libmlrpc ...

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/fs.d/smbclnt/smbutil/view.c
          +++ new/usr/src/cmd/fs.d/smbclnt/smbutil/view.c
↓ open down ↓ 26 lines elided ↑ open up ↑
  27   27   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  28   28   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  29   29   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30   30   * SUCH DAMAGE.
  31   31   *
  32   32   * $Id: view.c,v 1.9 2004/12/13 00:25:39 lindak Exp $
  33   33   */
  34   34  
  35   35  /*
  36   36   * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
       37 + * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
  37   38   */
  38   39  
  39   40  #include <sys/types.h>
  40   41  #include <errno.h>
  41   42  #include <stdio.h>
  42   43  #include <err.h>
  43   44  #include <unistd.h>
  44   45  #include <strings.h>
  45   46  #include <stdlib.h>
  46   47  #include <sysexits.h>
  47   48  #include <libintl.h>
  48   49  
  49   50  #include <netsmb/smb.h>
  50   51  #include <netsmb/smb_lib.h>
  51      -#include <netsmb/smb_netshareenum.h>
  52      -
  53   52  #include "common.h"
  54   53  
  55      -int enum_shares(smb_ctx_t *);
  56      -void print_shares(int, int, struct share_info *);
       54 +static int use_rap;
  57   55  
  58   56  void
  59   57  view_usage(void)
  60   58  {
  61   59          printf(gettext("usage: smbutil view [connection options] //"
  62   60              "[workgroup;][user[:password]@]server\n"));
  63   61          exit(1);
  64   62  }
  65   63  
  66   64  int
↓ open down ↓ 5 lines elided ↑ open up ↑
  72   70          if (argc < 2)
  73   71                  view_usage();
  74   72  
  75   73          error = smb_ctx_alloc(&ctx);
  76   74          if (error)
  77   75                  return (error);
  78   76  
  79   77          error = smb_ctx_scan_argv(ctx, argc, argv,
  80   78              SMBL_SERVER, SMBL_SERVER, USE_WILDCARD);
  81   79          if (error)
  82      -                return (error);
       80 +                goto out;
  83   81  
  84   82          error = smb_ctx_readrc(ctx);
  85   83          if (error)
  86      -                return (error);
       84 +                goto out;
  87   85  
  88   86          while ((opt = getopt(argc, argv, STDPARAM_OPT)) != EOF) {
  89   87                  if (opt == '?')
  90   88                          view_usage();
       89 +                /*
       90 +                 * This is an undocumented option, just for testing.
       91 +                 * Use the old LanMan Remote API Protocol (RAP) for
       92 +                 * enumerating shares.
       93 +                 */
       94 +                if (opt == 'B') {
       95 +                        use_rap++;
       96 +                        continue;
       97 +                }
  91   98                  error = smb_ctx_opt(ctx, opt, optarg);
  92   99                  if (error)
  93      -                        return (error);
      100 +                        goto out;
  94  101          }
  95  102  
  96  103          smb_ctx_setshare(ctx, "IPC$", USE_IPC);
  97  104  
  98  105          /*
  99  106           * Resolve the server address,
 100  107           * setup derived defaults.
 101  108           */
 102  109          error = smb_ctx_resolve(ctx);
 103  110          if (error)
 104      -                return (error);
      111 +                goto out;
 105  112  
 106  113          /*
 107  114           * Have server, share, etc. from above:
 108  115           * smb_ctx_scan_argv, option settings.
 109  116           * Get the session and tree.
 110  117           */
 111  118  again:
 112  119          error = smb_ctx_get_ssn(ctx);
 113  120          if (error == EAUTH) {
 114  121                  err2 = smb_get_authentication(ctx);
 115  122                  if (err2 == 0)
 116  123                          goto again;
 117  124          }
 118  125          if (error) {
 119  126                  smb_error(gettext("//%s: login failed"),
 120  127                      error, ctx->ct_fullserver);
 121      -                return (error);
      128 +                goto out;
 122  129          }
 123  130  
 124  131          error = smb_ctx_get_tree(ctx);
 125  132          if (error) {
 126  133                  smb_error(gettext("//%s/%s: tree connect failed"),
 127  134                      error, ctx->ct_fullserver, ctx->ct_origshare);
 128      -                return (error);
      135 +                goto out;
 129  136          }
 130  137  
 131  138          /*
 132  139           * Have IPC$ tcon, now list shares.
 133      -         * This prints its own errors.
      140 +         * Try RPC; if that fails, do RAP.
 134  141           */
 135      -        error = enum_shares(ctx);
 136      -        if (error)
 137      -                return (error);
      142 +        if (!use_rap)
      143 +                error = share_enum_rpc(ctx, ctx->ct_fullserver);
      144 +        if (error || use_rap)
      145 +                error = share_enum_rap(ctx);
 138  146  
      147 +out:
 139  148          smb_ctx_free(ctx);
 140  149          return (0);
 141  150  }
 142  151  
 143  152  #ifdef I18N     /* not defined, put here so xgettext(1) can find strings */
 144  153  static char *shtype[] = {
 145  154          gettext("disk"),
 146  155          gettext("printer"),
 147  156          gettext("device"),      /* Communications device */
 148  157          gettext("IPC"),         /* Inter process communication */
↓ open down ↓ 2 lines elided ↑ open up ↑
 151  160  #else
 152  161  static char *shtype[] = {
 153  162          "disk",
 154  163          "printer",
 155  164          "device",               /* Communications device */
 156  165          "IPC",                  /* IPC Inter process communication */
 157  166          "unknown"
 158  167  };
 159  168  #endif
 160  169  
 161      -int
 162      -enum_shares(smb_ctx_t *ctx)
      170 +/*
      171 + * Print one line of the share list, or
      172 + * if SHARE is null, print the header line.
      173 + */
      174 +void
      175 +view_print_share(char *share, int type, char *comment)
 163  176  {
 164      -        struct share_info *share_info;
 165      -        int error, entries, total;
      177 +        char *stname;
      178 +        int stindex;
 166  179  
 167      -        /*
 168      -         * XXX: Later, try RPC first,
 169      -         * then fall back to RAP...
 170      -         */
 171      -        error = smb_netshareenum(ctx, &entries, &total, &share_info);
 172      -        if (error) {
 173      -                smb_error(gettext("//%s failed to list shares"),
 174      -                    error, ctx->ct_fullserver);
 175      -                return (error);
      180 +        if (share == NULL) {
      181 +                printf(gettext("Share        Type       Comment\n"));
      182 +                printf("-------------------------------\n");
      183 +                return;
 176  184          }
 177      -        print_shares(entries, total, share_info);
 178      -        return (0);
 179      -}
 180  185  
 181      -void
 182      -print_shares(int entries, int total,
 183      -        struct share_info *share_info)
 184      -{
 185      -        struct share_info *ep;
 186      -        int i;
      186 +        stindex = type & STYPE_MASK;
      187 +        if (stindex > STYPE_UNKNOWN)
      188 +                stindex = STYPE_UNKNOWN;
      189 +        stname = gettext(shtype[stindex]);
 187  190  
 188      -        printf(gettext("Share        Type       Comment\n"));
 189      -        printf("-------------------------------\n");
      191 +        if (comment == NULL)
      192 +                comment = "";
 190  193  
 191      -        for (ep = share_info, i = 0; i < entries; i++, ep++) {
 192      -                int sti = ep->type & STYPE_MASK;
 193      -                if (sti > STYPE_UNKNOWN)
 194      -                        sti = STYPE_UNKNOWN;
 195      -                printf("%-12s %-10s %s\n", ep->netname,
 196      -                    gettext(shtype[sti]),
 197      -                    ep->remark ? ep->remark : "");
 198      -                free(ep->netname);
 199      -                free(ep->remark);
 200      -        }
 201      -        printf(gettext("\n%d shares listed from %d available\n"),
 202      -            entries, total);
 203      -
 204      -        free(share_info);
      194 +        printf("%-12s %-10s %s\n", share, stname, comment);
 205  195  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX