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
16static struct options {
17	const char *dev;
18} opt = {
19	.dev = NULL
20};
21
22static const struct args args[] = {
23	{ arg_string, &opt.dev, "controller-id|namespace-id|SubNQN" },
24	{ arg_none, NULL, NULL },
25};
26
27static void
28disconnect(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
54static void
55disconnect_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
68static struct cmd disconnect_cmd = {
69	.name = "disconnect",
70	.fn = disconnect,
71	.descr = "Disconnect from a fabrics controller",
72	.args = args,
73};
74
75static struct cmd disconnect_all_cmd = {
76	.name = "disconnect-all",
77	.fn = disconnect_all,
78	.descr = "Disconnect from all fabrics controllers",
79};
80
81CMD_COMMAND(disconnect_cmd);
82CMD_COMMAND(disconnect_all_cmd);
83