1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
14  */
15 
16 /*
17  * smbutil "discon" sub-command to disconnect a session
18  * (mostly for usr/src/test/smbclient-tests)
19  */
20 
21 #include <sys/types.h>
22 #include <errno.h>
23 #include <stdio.h>
24 #include <err.h>
25 #include <unistd.h>
26 #include <strings.h>
27 #include <stdlib.h>
28 #include <sysexits.h>
29 #include <libintl.h>
30 
31 #include <netsmb/smb.h>
32 #include <netsmb/smb_lib.h>
33 #include "common.h"
34 
35 void
discon_usage(void)36 discon_usage(void)
37 {
38 	printf(gettext("usage: smbutil discon [connection options] "
39 	    "//[workgroup;][user@]server\n"));
40 	exit(1);
41 }
42 
43 int
cmd_discon(int argc,char * argv[])44 cmd_discon(int argc, char *argv[])
45 {
46 	struct smb_ctx *ctx;
47 	int error, opt;
48 
49 	if (argc < 2)
50 		discon_usage();
51 
52 	error = smb_ctx_alloc(&ctx);
53 	if (error != 0)
54 		return (error);
55 
56 	error = smb_ctx_scan_argv(ctx, argc, argv,
57 	    SMBL_SERVER, SMBL_SERVER, USE_WILDCARD);
58 	if (error != 0)
59 		goto out;
60 
61 	error = smb_ctx_readrc(ctx);
62 	if (error != 0)
63 		goto out;
64 
65 	while ((opt = getopt(argc, argv, STDPARAM_OPT)) != EOF) {
66 		if (opt == '?')
67 			discon_usage();
68 		error = smb_ctx_opt(ctx, opt, optarg);
69 		if (error != 0)
70 			goto out;
71 	}
72 
73 	/*
74 	 * Resolve the server address,
75 	 * setup derived defaults.
76 	 */
77 	error = smb_ctx_resolve(ctx);
78 	if (error != 0)
79 		goto out;
80 
81 	/*
82 	 * Have server, user, etc. from above:
83 	 * smb_ctx_scan_argv, option settings.
84 	 *
85 	 * Lookup a session without creating.
86 	 * (First part of smb_ctx_get_ssn)
87 	 * If we find the session, kill it.
88 	 */
89 	error = smb_ctx_findvc(ctx);
90 	if (error == ENOENT) {
91 		/* Already gone. We're done. */
92 		if (smb_debug)
93 			fprintf(stderr, "session not found\n");
94 		error = 0;
95 		goto out;
96 	}
97 	if (error == 0) {
98 		/* Found session.  Kill it. */
99 		error = smb_ctx_kill(ctx);
100 	}
101 
102 	if (error != 0) {
103 		smb_error(gettext("//%s: discon failed"),
104 		    error, ctx->ct_fullserver);
105 	}
106 
107 out:
108 	smb_ctx_free(ctx);
109 	return (error);
110 }
111