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
  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
  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 }