1*85e6b674SGordon Ross /*
2*85e6b674SGordon Ross * CDDL HEADER START
3*85e6b674SGordon Ross *
4*85e6b674SGordon Ross * The contents of this file are subject to the terms of the
5*85e6b674SGordon Ross * Common Development and Distribution License (the "License").
6*85e6b674SGordon Ross * You may not use this file except in compliance with the License.
7*85e6b674SGordon Ross *
8*85e6b674SGordon Ross * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*85e6b674SGordon Ross * or http://www.opensolaris.org/os/licensing.
10*85e6b674SGordon Ross * See the License for the specific language governing permissions
11*85e6b674SGordon Ross * and limitations under the License.
12*85e6b674SGordon Ross *
13*85e6b674SGordon Ross * When distributing Covered Code, include this CDDL HEADER in each
14*85e6b674SGordon Ross * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*85e6b674SGordon Ross * If applicable, add the following below this CDDL HEADER, with the
16*85e6b674SGordon Ross * fields enclosed by brackets "[]" replaced with your own identifying
17*85e6b674SGordon Ross * information: Portions Copyright [yyyy] [name of copyright owner]
18*85e6b674SGordon Ross *
19*85e6b674SGordon Ross * CDDL HEADER END
20*85e6b674SGordon Ross */
21*85e6b674SGordon Ross
22*85e6b674SGordon Ross /*
23*85e6b674SGordon Ross * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24*85e6b674SGordon Ross * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
25*85e6b674SGordon Ross */
26*85e6b674SGordon Ross
27*85e6b674SGordon Ross /*
28*85e6b674SGordon Ross * Test program for opening an SMB connection directly.
29*85e6b674SGordon Ross */
30*85e6b674SGordon Ross
31*85e6b674SGordon Ross #include <sys/types.h>
32*85e6b674SGordon Ross #include <errno.h>
33*85e6b674SGordon Ross #include <fcntl.h>
34*85e6b674SGordon Ross #include <stdio.h>
35*85e6b674SGordon Ross #include <stdlib.h>
36*85e6b674SGordon Ross #include <string.h>
37*85e6b674SGordon Ross #include <unistd.h>
38*85e6b674SGordon Ross #include <netdb.h>
39*85e6b674SGordon Ross #include <libintl.h>
40*85e6b674SGordon Ross
41*85e6b674SGordon Ross #include <netsmb/smb_lib.h>
42*85e6b674SGordon Ross
43*85e6b674SGordon Ross extern char *optarg;
44*85e6b674SGordon Ross extern int optind, opterr, optopt;
45*85e6b674SGordon Ross extern int smb_iod_connect(struct smb_ctx *);
46*85e6b674SGordon Ross
47*85e6b674SGordon Ross static char *server;
48*85e6b674SGordon Ross
49*85e6b674SGordon Ross static void
tconn_usage(void)50*85e6b674SGordon Ross tconn_usage(void)
51*85e6b674SGordon Ross {
52*85e6b674SGordon Ross printf("usage: tconn [-d domain][-u user][-p passwd] server\n");
53*85e6b674SGordon Ross exit(1);
54*85e6b674SGordon Ross }
55*85e6b674SGordon Ross
56*85e6b674SGordon Ross int
main(int argc,char * argv[])57*85e6b674SGordon Ross main(int argc, char *argv[])
58*85e6b674SGordon Ross {
59*85e6b674SGordon Ross int c, error, aflags;
60*85e6b674SGordon Ross struct smb_ctx *ctx = NULL;
61*85e6b674SGordon Ross char *dom = NULL;
62*85e6b674SGordon Ross char *usr = NULL;
63*85e6b674SGordon Ross char *pw = NULL;
64*85e6b674SGordon Ross char *secopt = NULL;
65*85e6b674SGordon Ross struct addrinfo *ai;
66*85e6b674SGordon Ross
67*85e6b674SGordon Ross while ((c = getopt(argc, argv, "vd:p:s:u:")) != -1) {
68*85e6b674SGordon Ross switch (c) {
69*85e6b674SGordon Ross case 'v':
70*85e6b674SGordon Ross smb_debug = 1;
71*85e6b674SGordon Ross smb_verbose = 1;
72*85e6b674SGordon Ross break;
73*85e6b674SGordon Ross
74*85e6b674SGordon Ross case 'd':
75*85e6b674SGordon Ross dom = optarg;
76*85e6b674SGordon Ross break;
77*85e6b674SGordon Ross case 'u':
78*85e6b674SGordon Ross usr = optarg;
79*85e6b674SGordon Ross break;
80*85e6b674SGordon Ross case 'p':
81*85e6b674SGordon Ross pw = optarg;
82*85e6b674SGordon Ross break;
83*85e6b674SGordon Ross case 's':
84*85e6b674SGordon Ross secopt = optarg;
85*85e6b674SGordon Ross break;
86*85e6b674SGordon Ross case '?':
87*85e6b674SGordon Ross tconn_usage();
88*85e6b674SGordon Ross break;
89*85e6b674SGordon Ross }
90*85e6b674SGordon Ross }
91*85e6b674SGordon Ross if (optind >= argc)
92*85e6b674SGordon Ross tconn_usage();
93*85e6b674SGordon Ross server = argv[optind];
94*85e6b674SGordon Ross
95*85e6b674SGordon Ross if (pw != NULL && (dom == NULL || usr == NULL)) {
96*85e6b674SGordon Ross fprintf(stderr, "%s: -p arg requires -d dom -u usr\n",
97*85e6b674SGordon Ross argv[0]);
98*85e6b674SGordon Ross tconn_usage();
99*85e6b674SGordon Ross }
100*85e6b674SGordon Ross
101*85e6b674SGordon Ross /*
102*85e6b674SGordon Ross * This section is intended to demonstrate how an
103*85e6b674SGordon Ross * RPC client library might use this interface.
104*85e6b674SGordon Ross */
105*85e6b674SGordon Ross error = smb_ctx_alloc(&ctx);
106*85e6b674SGordon Ross if (error) {
107*85e6b674SGordon Ross fprintf(stderr, "%s: smb_ctx_alloc failed\n", argv[0]);
108*85e6b674SGordon Ross goto out;
109*85e6b674SGordon Ross }
110*85e6b674SGordon Ross
111*85e6b674SGordon Ross /*
112*85e6b674SGordon Ross * Set server, share, domain, user
113*85e6b674SGordon Ross * (in the ctx handle).
114*85e6b674SGordon Ross */
115*85e6b674SGordon Ross smb_ctx_setfullserver(ctx, server);
116*85e6b674SGordon Ross smb_ctx_setshare(ctx, "IPC$", USE_IPC);
117*85e6b674SGordon Ross if (dom)
118*85e6b674SGordon Ross smb_ctx_setdomain(ctx, dom, B_TRUE);
119*85e6b674SGordon Ross if (usr)
120*85e6b674SGordon Ross smb_ctx_setuser(ctx, usr, B_TRUE);
121*85e6b674SGordon Ross if (pw)
122*85e6b674SGordon Ross smb_ctx_setpassword(ctx, pw, NULL);
123*85e6b674SGordon Ross
124*85e6b674SGordon Ross /*
125*85e6b674SGordon Ross * Hackish option to override the Authentication Type flags.
126*85e6b674SGordon Ross * Sorry about exposing the flag values here, but this is
127*85e6b674SGordon Ross * really a programmer's test tool. See smbfs_api.h for
128*85e6b674SGordon Ross * the SMB_AT_... flag values.
129*85e6b674SGordon Ross */
130*85e6b674SGordon Ross if (secopt != NULL) {
131*85e6b674SGordon Ross aflags = atoi(secopt);
132*85e6b674SGordon Ross if (aflags < 1 || aflags > 0x1f) {
133*85e6b674SGordon Ross fprintf(stderr, "%s: -s {0..31}\n", argv[0]);
134*85e6b674SGordon Ross tconn_usage();
135*85e6b674SGordon Ross }
136*85e6b674SGordon Ross smb_ctx_setauthflags(ctx, aflags);
137*85e6b674SGordon Ross }
138*85e6b674SGordon Ross
139*85e6b674SGordon Ross /*
140*85e6b674SGordon Ross * Resolve the server address,
141*85e6b674SGordon Ross * setup derived defaults.
142*85e6b674SGordon Ross */
143*85e6b674SGordon Ross error = smb_ctx_resolve(ctx);
144*85e6b674SGordon Ross if (error) {
145*85e6b674SGordon Ross fprintf(stderr, "%s: smb_ctx_resolve failed\n", argv[0]);
146*85e6b674SGordon Ross goto out;
147*85e6b674SGordon Ross }
148*85e6b674SGordon Ross
149*85e6b674SGordon Ross if ((ai = ctx->ct_addrinfo) == NULL) {
150*85e6b674SGordon Ross fprintf(stderr, "%s: no ct_addrinfo\n", argv[0]);
151*85e6b674SGordon Ross goto out;
152*85e6b674SGordon Ross }
153*85e6b674SGordon Ross memcpy(&ctx->ct_srvaddr, ai->ai_addr, ai->ai_addrlen);
154*85e6b674SGordon Ross
155*85e6b674SGordon Ross /*
156*85e6b674SGordon Ross * If this code were in smbutil or mount_smbfs, it would
157*85e6b674SGordon Ross * get system and $HOME/.nsmbrc settings here, like this:
158*85e6b674SGordon Ross */
159*85e6b674SGordon Ross error = smb_iod_connect(ctx);
160*85e6b674SGordon Ross if (error) {
161*85e6b674SGordon Ross fprintf(stderr, "%s: smb_iod_connect failed\n", argv[0]);
162*85e6b674SGordon Ross goto out;
163*85e6b674SGordon Ross }
164*85e6b674SGordon Ross
165*85e6b674SGordon Ross printf("Yea, we connected!\n");
166*85e6b674SGordon Ross
167*85e6b674SGordon Ross out:
168*85e6b674SGordon Ross smb_ctx_free(ctx);
169*85e6b674SGordon Ross
170*85e6b674SGordon Ross return ((error) ? 1 : 0);
171*85e6b674SGordon Ross }
172