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
1 1 /*
2 2 * Copyright (c) 2000, Boris Popov
3 3 * All rights reserved.
4 4 *
5 5 * Redistribution and use in source and binary forms, with or without
6 6 * modification, are permitted provided that the following conditions
7 7 * are met:
8 8 * 1. Redistributions of source code must retain the above copyright
9 9 * notice, this list of conditions and the following disclaimer.
10 10 * 2. Redistributions in binary form must reproduce the above copyright
11 11 * notice, this list of conditions and the following disclaimer in the
12 12 * documentation and/or other materials provided with the distribution.
13 13 * 3. All advertising materials mentioning features or use of this software
14 14 * must display the following acknowledgement:
15 15 * This product includes software developed by Boris Popov.
16 16 * 4. Neither the name of the author nor the names of any co-contributors
17 17 * may be used to endorse or promote products derived from this software
18 18 * without specific prior written permission.
19 19 *
20 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
↓ 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
67 65 cmd_view(int argc, char *argv[])
68 66 {
69 67 struct smb_ctx *ctx;
70 68 int error, err2, opt;
71 69
↓ 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 */
149 158 gettext("unknown")
150 159 };
↓ 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