1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2023-2024 Chelsio Communications, Inc.
5 * Written by: John Baldwin <jhb@FreeBSD.org>
6 */
7
8 #include <err.h>
9 #include <libnvmf.h>
10 #include <stdlib.h>
11 #include <sysexits.h>
12 #include <unistd.h>
13
14 #include "nvmecontrol.h"
15
16 static struct options {
17 const char *dev;
18 } opt = {
19 .dev = NULL
20 };
21
22 static const struct args args[] = {
23 { arg_string, &opt.dev, "controller-id|namespace-id|SubNQN" },
24 { arg_none, NULL, NULL },
25 };
26
27 static void
disconnect(const struct cmd * f,int argc,char * argv[])28 disconnect(const struct cmd *f, int argc, char *argv[])
29 {
30 int error, fd;
31 char *path;
32
33 if (arg_parse(argc, argv, f))
34 return;
35 if (nvmf_nqn_valid(opt.dev)) {
36 error = nvmf_disconnect_host(opt.dev);
37 if (error != 0)
38 errc(EX_IOERR, error, "failed to disconnect from %s",
39 opt.dev);
40 } else {
41 open_dev(opt.dev, &fd, 1, 1);
42 get_nsid(fd, &path, NULL);
43 close(fd);
44
45 error = nvmf_disconnect_host(path);
46 if (error != 0)
47 errc(EX_IOERR, error, "failed to disconnect from %s",
48 path);
49 }
50
51 exit(0);
52 }
53
54 static void
disconnect_all(const struct cmd * f __unused,int argc __unused,char * argv[]__unused)55 disconnect_all(const struct cmd *f __unused, int argc __unused,
56 char *argv[] __unused)
57 {
58 int error;
59
60 error = nvmf_disconnect_all();
61 if (error != 0)
62 errc(EX_IOERR, error,
63 "failed to disconnect from remote controllers");
64
65 exit(0);
66 }
67
68 static struct cmd disconnect_cmd = {
69 .name = "disconnect",
70 .fn = disconnect,
71 .descr = "Disconnect from a fabrics controller",
72 .args = args,
73 };
74
75 static struct cmd disconnect_all_cmd = {
76 .name = "disconnect-all",
77 .fn = disconnect_all,
78 .descr = "Disconnect from all fabrics controllers",
79 };
80
81 CMD_COMMAND(disconnect_cmd);
82 CMD_COMMAND(disconnect_all_cmd);
83