Blame fcoeadm.c

Packit Service bca4e3
/*
Packit Service bca4e3
 * Copyright(c) 2010 Intel Corporation. All rights reserved.
Packit Service bca4e3
 *
Packit Service bca4e3
 * This program is free software; you can redistribute it and/or modify it
Packit Service bca4e3
 * under the terms and conditions of the GNU General Public License,
Packit Service bca4e3
 * version 2, as published by the Free Software Foundation.
Packit Service bca4e3
 *
Packit Service bca4e3
 * This program is distributed in the hope it will be useful, but WITHOUT
Packit Service bca4e3
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
Packit Service bca4e3
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
Packit Service bca4e3
 * more details.
Packit Service bca4e3
 *
Packit Service bca4e3
 * You should have received a copy of the GNU General Public License along with
Packit Service bca4e3
 * this program; if not, write to the Free Software Foundation, Inc.,
Packit Service bca4e3
 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
Packit Service bca4e3
 *
Packit Service bca4e3
 * Maintained at www.Open-FCoE.org
Packit Service bca4e3
 */
Packit Service bca4e3
Packit Service bca4e3
#include <libgen.h>
Packit Service bca4e3
#include <paths.h>
Packit Service bca4e3
#include <net/if.h>
Packit Service bca4e3
#include <sys/un.h>
Packit Service bca4e3
#include <getopt.h>
Packit Service bca4e3
#include <dirent.h>
Packit Service bca4e3
#include <sys/types.h>
Packit Service bca4e3
#include <sys/stat.h>
Packit Service bca4e3
#include <fcntl.h>
Packit Service bca4e3
#include <unistd.h>
Packit Service bca4e3
Packit Service bca4e3
#include "fcoe_utils.h"
Packit Service bca4e3
#include "fcoe_utils_version.h"
Packit Service bca4e3
#include "fcoe_clif.h"
Packit Service bca4e3
#include "fcoeadm_display.h"
Packit Service bca4e3
Packit Service bca4e3
static const char optstring[] = "cdrSiftlm:sbhpv";
Packit Service bca4e3
static const struct option fcoeadm_opts[] = {
Packit Service bca4e3
	{"create", no_argument, 0, 'c'},
Packit Service bca4e3
	{"destroy", no_argument, 0, 'd'},
Packit Service bca4e3
	{"reset", no_argument, 0, 'r'},
Packit Service bca4e3
	{"interface", no_argument, 0, 'i'},
Packit Service bca4e3
	{"Scan", no_argument, 0, 'S'},
Packit Service bca4e3
	{"fcf", no_argument, 0, 'f'},
Packit Service bca4e3
	{"target", no_argument, 0, 't'},
Packit Service bca4e3
	{"lun", no_argument, 0, 'l'},
Packit Service bca4e3
	{"mode", required_argument, 0, 'm'},
Packit Service bca4e3
	{"pid", no_argument, 0, 'p'},
Packit Service bca4e3
	{"stats", no_argument, 0, 's'},
Packit Service bca4e3
	{"lesb", no_argument, 0, 'b'},
Packit Service bca4e3
	{"help", no_argument, 0, 'h'},
Packit Service bca4e3
	{"version", no_argument, 0, 'v'},
Packit Service bca4e3
	{0, 0, 0, 0}
Packit Service bca4e3
};
Packit Service bca4e3
Packit Service bca4e3
char progname[20];
Packit Service bca4e3
Packit Service bca4e3
static void fcoeadm_help(void)
Packit Service bca4e3
{
Packit Service bca4e3
	printf("Version %s\n", FCOE_UTILS_VERSION);
Packit Service bca4e3
	printf("Usage: %s\n"
Packit Service bca4e3
	       "\t [-m|--mode fabric|vn2vn] [-c|--create] <ethX>\n"
Packit Service bca4e3
	       "\t [-d|--destroy] <ethX>\n"
Packit Service bca4e3
	       "\t [-r|--reset] <ethX>\n"
Packit Service bca4e3
	       "\t [-S|--Scan] <ethX>\n"
Packit Service bca4e3
	       "\t [-i|--interface] [<ethX>]\n"
Packit Service bca4e3
	       "\t [-f]--fcf] [<ethX>]\n"
Packit Service bca4e3
	       "\t [-t|--target] [<ethX>]\n"
Packit Service bca4e3
	       "\t [-l|--lun] [<ethX>]\n"
Packit Service bca4e3
	       "\t [-s|--stats] <ethX> [<interval>]\n"
Packit Service bca4e3
	       "\t [-b|--lesb] <ethX> [<interval>]\n"
Packit Service bca4e3
	       "\t [-p|--pid]\n"
Packit Service bca4e3
	       "\t [-v|--version]\n"
Packit Service bca4e3
	       "\t [-h|--help]\n\n", progname);
Packit Service bca4e3
}
Packit Service bca4e3
Packit Service bca4e3
static enum fcoe_status fcoeadm_clif_request(struct clif_sock_info *clif_info,
Packit Service bca4e3
					     const struct clif_data *cmd,
Packit Service bca4e3
					     size_t cmd_len, char *reply,
Packit Service bca4e3
					     size_t *reply_len)
Packit Service bca4e3
{
Packit Service bca4e3
	struct timeval tv;
Packit Service bca4e3
	int ret;
Packit Service bca4e3
	fd_set rfds;
Packit Service bca4e3
Packit Service bca4e3
	if (send(clif_info->socket_fd, cmd, cmd_len, 0) < 0)
Packit Service bca4e3
		return ENOMONCONN;
Packit Service bca4e3
Packit Service bca4e3
	tv.tv_sec = CLIF_CMD_RESPONSE_TIMEOUT;
Packit Service bca4e3
	tv.tv_usec = 0;
Packit Service bca4e3
	FD_ZERO(&rfds);
Packit Service bca4e3
	FD_SET(clif_info->socket_fd, &rfds);
Packit Service bca4e3
	ret = select(clif_info->socket_fd + 1, &rfds, NULL, NULL, &tv;;
Packit Service bca4e3
	if (FD_ISSET(clif_info->socket_fd, &rfds)) {
Packit Service bca4e3
		ret = recv(clif_info->socket_fd, reply, *reply_len, 0);
Packit Service bca4e3
		if (ret < 0)
Packit Service bca4e3
			return EINTERR;
Packit Service bca4e3
		*reply_len = ret;
Packit Service bca4e3
		return SUCCESS;
Packit Service bca4e3
	} else {
Packit Service bca4e3
		return EINTERR;
Packit Service bca4e3
	}
Packit Service bca4e3
}
Packit Service bca4e3
Packit Service bca4e3
static int fcoeadm_request(struct clif_sock_info *clif_info,
Packit Service bca4e3
					struct clif_data *data)
Packit Service bca4e3
{
Packit Service bca4e3
	char rbuf[MAX_MSGBUF];
Packit Service bca4e3
	size_t len;
Packit Service bca4e3
	int rc = SUCCESS;
Packit Service bca4e3
Packit Service bca4e3
	/*
Packit Service bca4e3
	 * TODO: This is odd that we read the response code back as a
Packit Service bca4e3
	 * string. We should just write the error code into a member
Packit Service bca4e3
	 * of clif_data and then just read it directly.
Packit Service bca4e3
	 */
Packit Service bca4e3
Packit Service bca4e3
	len = MAX_MSGBUF - 1;
Packit Service bca4e3
	rc = fcoeadm_clif_request(clif_info, data, sizeof(struct clif_data),
Packit Service bca4e3
				  rbuf, &len;;
Packit Service bca4e3
Packit Service bca4e3
	if (!rc) {
Packit Service bca4e3
		rbuf[len] = '\0';
Packit Service bca4e3
		rc = atoi(rbuf);
Packit Service bca4e3
	}
Packit Service bca4e3
Packit Service bca4e3
	return rc;
Packit Service bca4e3
}
Packit Service bca4e3
Packit Service bca4e3
static inline void fcoeadm_close_cli(struct clif_sock_info *clif_info)
Packit Service bca4e3
{
Packit Service bca4e3
	close(clif_info->socket_fd);
Packit Service bca4e3
}
Packit Service bca4e3
Packit Service bca4e3
/*
Packit Service bca4e3
 * Create fcoeadm client interface
Packit Service bca4e3
 */
Packit Service bca4e3
static enum fcoe_status fcoeadm_open_cli(struct clif_sock_info *clif_info)
Packit Service bca4e3
{
Packit Service bca4e3
	enum fcoe_status rc = SUCCESS;
Packit Service bca4e3
	struct sockaddr_un *lp;
Packit Service bca4e3
	socklen_t addrlen;
Packit Service bca4e3
Packit Service bca4e3
	clif_info->socket_fd = socket(AF_LOCAL, SOCK_DGRAM, 0);
Packit Service bca4e3
	if (clif_info->socket_fd < 0)
Packit Service bca4e3
		return ENOMONCONN;
Packit Service bca4e3
Packit Service bca4e3
	lp = &clif_info->local;
Packit Service bca4e3
	memset(lp, 0, sizeof(*lp));
Packit Service bca4e3
	lp->sun_family = AF_LOCAL;
Packit Service bca4e3
	lp->sun_path[0] = '\0';
Packit Service bca4e3
	snprintf(&lp->sun_path[1], sizeof(lp->sun_path) - 1,
Packit Service bca4e3
		 "%s/%lu", CLIF_IFNAME, (unsigned long int)getpid);
Packit Service bca4e3
	addrlen = sizeof(sa_family_t) + strlen(lp->sun_path + 1) + 1;
Packit Service bca4e3
	if (bind(clif_info->socket_fd, (struct sockaddr *)lp, addrlen) < 0) {
Packit Service bca4e3
		rc = ENOMONCONN;
Packit Service bca4e3
		goto err_close;
Packit Service bca4e3
	}
Packit Service bca4e3
Packit Service bca4e3
	clif_info->dest.sun_family = AF_LOCAL;
Packit Service bca4e3
	clif_info->dest.sun_path[0] = '\0';
Packit Service bca4e3
	snprintf(&clif_info->dest.sun_path[1],
Packit Service bca4e3
		 sizeof(clif_info->dest.sun_path) - 1,
Packit Service bca4e3
		 "%s", CLIF_IFNAME);
Packit Service bca4e3
	addrlen = sizeof(sa_family_t) + strlen(clif_info->dest.sun_path + 1) + 1;
Packit Service bca4e3
	if (connect(clif_info->socket_fd, (struct sockaddr *)&clif_info->dest,
Packit Service bca4e3
		    addrlen) < 0) {
Packit Service bca4e3
		rc = ENOMONCONN;
Packit Service bca4e3
		goto err_close;
Packit Service bca4e3
	}
Packit Service bca4e3
Packit Service bca4e3
	return rc;
Packit Service bca4e3
Packit Service bca4e3
err_close:
Packit Service bca4e3
	close(clif_info->socket_fd);
Packit Service bca4e3
	return rc;
Packit Service bca4e3
}
Packit Service bca4e3
Packit Service bca4e3
/*
Packit Service bca4e3
 * Send request to fcoemon
Packit Service bca4e3
 */
Packit Service bca4e3
static enum fcoe_status
Packit Service bca4e3
fcoeadm_action(enum clif_action cmd, char *ifname, enum clif_flags flags)
Packit Service bca4e3
{
Packit Service bca4e3
	struct clif_data data;
Packit Service bca4e3
	struct clif_sock_info clif_info;
Packit Service bca4e3
	int rc;
Packit Service bca4e3
Packit Service bca4e3
	if (ifname) {
Packit Service bca4e3
		strncpy(data.ifname, ifname, IFNAMSIZ);
Packit Service bca4e3
		data.ifname[IFNAMSIZ - 1] = '\0';
Packit Service bca4e3
	} else
Packit Service bca4e3
		data.ifname[0] = '\0';
Packit Service bca4e3
	data.cmd = cmd;
Packit Service bca4e3
	data.flags = flags;
Packit Service bca4e3
Packit Service bca4e3
	rc = fcoeadm_open_cli(&clif_info);
Packit Service bca4e3
	if (!rc) {
Packit Service bca4e3
		rc = fcoeadm_request(&clif_info, &data);
Packit Service bca4e3
		if (rc > 0 && cmd == CLIF_PID_CMD) {
Packit Service bca4e3
			printf("%d\n", rc);
Packit Service bca4e3
			rc = 0;
Packit Service bca4e3
		}
Packit Service bca4e3
		fcoeadm_close_cli(&clif_info);
Packit Service bca4e3
	}
Packit Service bca4e3
Packit Service bca4e3
	return rc;
Packit Service bca4e3
}
Packit Service bca4e3
Packit Service bca4e3
#define MAX_ARG_LEN 32
Packit Service bca4e3
Packit Service bca4e3
/*
Packit Service bca4e3
 * getopts_long(3) does not handle optional arguments
Packit Service bca4e3
 * correctly. It will not allow a ' ' between the option
Packit Service bca4e3
 * and its argument. For required arguments the user can
Packit Service bca4e3
 * specify, '-i X' or '-iX' but with optional arguments
Packit Service bca4e3
 * only the first style is valid.
Packit Service bca4e3
 *
Packit Service bca4e3
 * This is being worked around by making '-i/-t/-l' have
Packit Service bca4e3
 * no arguments, but then process any following argv
Packit Service bca4e3
 * elements.
Packit Service bca4e3
 */
Packit Service bca4e3
int main(int argc, char *argv[])
Packit Service bca4e3
{
Packit Service bca4e3
	enum clif_action cmd = CLIF_NONE;
Packit Service bca4e3
	enum fcoe_status rc = SUCCESS;
Packit Service bca4e3
	enum clif_flags flags = CLIF_FLAGS_NONE;
Packit Service bca4e3
	int opt, stat_interval;
Packit Service bca4e3
	int op = -1;
Packit Service bca4e3
	char *ifname = NULL;
Packit Service bca4e3
Packit Service bca4e3
	/*
Packit Service bca4e3
	 * This has to be first because the error print macro
Packit Service bca4e3
	 * expects progname to be valid.
Packit Service bca4e3
	 */
Packit Service bca4e3
	strncpy(progname, basename(argv[0]), sizeof(progname));
Packit Service bca4e3
	progname[sizeof(progname) - 1] = '\0';
Packit Service bca4e3
Packit Service bca4e3
	/* check if we have sysfs */
Packit Service bca4e3
	if (fcoe_checkdir(SYSFS_MOUNT)) {
Packit Service bca4e3
		rc = ENOSYSFS;
Packit Service bca4e3
		goto err;
Packit Service bca4e3
	}
Packit Service bca4e3
Packit Service bca4e3
	for (;;) {
Packit Service bca4e3
		opt = getopt_long(argc, argv, optstring, fcoeadm_opts, NULL);
Packit Service bca4e3
		if (opt < 0)
Packit Service bca4e3
			break;
Packit Service bca4e3
		switch (opt) {
Packit Service bca4e3
		case 'm':
Packit Service bca4e3
			if (strcasecmp(optarg, "vn2vn") == 0) {
Packit Service bca4e3
				flags &= ~CLIF_FLAGS_MODE_MASK;
Packit Service bca4e3
				flags |= CLIF_FLAGS_VN2VN;
Packit Service bca4e3
			} else if (strcasecmp(optarg, "fabric") == 0) {
Packit Service bca4e3
				flags &= ~CLIF_FLAGS_MODE_MASK;
Packit Service bca4e3
			} else {
Packit Service bca4e3
				rc = EINVALARG;
Packit Service bca4e3
			}
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		default:
Packit Service bca4e3
			if (op == -1)
Packit Service bca4e3
				op = opt;
Packit Service bca4e3
			else
Packit Service bca4e3
				rc = EINVALARG;
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case '?':
Packit Service bca4e3
			rc = EIGNORE;
Packit Service bca4e3
			break;
Packit Service bca4e3
		}
Packit Service bca4e3
	}
Packit Service bca4e3
Packit Service bca4e3
	if (op == -1)
Packit Service bca4e3
		fcoeadm_help();
Packit Service bca4e3
	else if (rc == SUCCESS) {
Packit Service bca4e3
		switch (op) {
Packit Service bca4e3
		case 'd':
Packit Service bca4e3
			cmd = CLIF_DESTROY_CMD;
Packit Service bca4e3
			flags = 0;	/* No flags allowed on destroy yet */
Packit Service bca4e3
			/* fall through */
Packit Service bca4e3
		case 'c':
Packit Service bca4e3
			if (cmd == CLIF_NONE)
Packit Service bca4e3
				cmd = CLIF_CREATE_CMD;
Packit Service bca4e3
Packit Service bca4e3
			if (argc - optind != 1) {
Packit Service bca4e3
				rc = EBADNUMARGS;
Packit Service bca4e3
				break;
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			ifname = argv[optind];
Packit Service bca4e3
			rc = fcoeadm_action(cmd, ifname, flags);
Packit Service bca4e3
			break;
Packit Service bca4e3
		case 'r':
Packit Service bca4e3
			cmd = CLIF_RESET_CMD;
Packit Service bca4e3
			/* fall through */
Packit Service bca4e3
		case 'S':
Packit Service bca4e3
			if (cmd == CLIF_NONE)
Packit Service bca4e3
				cmd = CLIF_SCAN_CMD;
Packit Service bca4e3
Packit Service bca4e3
			if (argc - optind != 1) {
Packit Service bca4e3
				rc = EBADNUMARGS;
Packit Service bca4e3
				break;
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			ifname = argv[optind];
Packit Service bca4e3
			rc = fcoe_validate_fcoe_conn(ifname);
Packit Service bca4e3
			if (!rc)
Packit Service bca4e3
				rc = fcoeadm_action(cmd, ifname, flags);
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case 'i':
Packit Service bca4e3
			if (argc - optind > 1) {
Packit Service bca4e3
				rc = EBADNUMARGS;
Packit Service bca4e3
				break;
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			/*
Packit Service bca4e3
			 * If there's an additional argument
Packit Service bca4e3
			 * treat it as the interface name.
Packit Service bca4e3
			 */
Packit Service bca4e3
			if (optind != argc) {
Packit Service bca4e3
				ifname = argv[optind];
Packit Service bca4e3
				rc = fcoe_validate_fcoe_conn(ifname);
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			if (!rc)
Packit Service bca4e3
				rc = display_adapter_info(ifname);
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case 'f':
Packit Service bca4e3
			if (argc - optind > 1) {
Packit Service bca4e3
				rc = EBADNUMARGS;
Packit Service bca4e3
				break;
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			/*
Packit Service bca4e3
			 * If there's an aditional argument
Packit Service bca4e3
			 * treat it as the interface name.
Packit Service bca4e3
			 */
Packit Service bca4e3
			if (optind != argc) {
Packit Service bca4e3
				ifname = argv[optind];
Packit Service bca4e3
				rc = fcoe_validate_fcoe_conn(ifname);
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			if (!rc)
Packit Service bca4e3
				rc = display_fcf_info(ifname);
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case 't':
Packit Service bca4e3
			if (argc - optind > 1) {
Packit Service bca4e3
				rc = EBADNUMARGS;
Packit Service bca4e3
				break;
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			/*
Packit Service bca4e3
			 * If there's an aditional argument
Packit Service bca4e3
			 * treat it as the interface name.
Packit Service bca4e3
			 */
Packit Service bca4e3
			if (optind != argc) {
Packit Service bca4e3
				ifname = argv[optind];
Packit Service bca4e3
				rc = fcoe_validate_fcoe_conn(ifname);
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			if (!rc)
Packit Service bca4e3
				rc = display_target_info(ifname, DISP_TARG);
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case 'l':
Packit Service bca4e3
			if (argc - optind > 1) {
Packit Service bca4e3
				rc = EBADNUMARGS;
Packit Service bca4e3
				break;
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			/*
Packit Service bca4e3
			 * If there's an aditional argument
Packit Service bca4e3
			 * treat it as the interface name.
Packit Service bca4e3
			 */
Packit Service bca4e3
			if (optind != argc) {
Packit Service bca4e3
				ifname = argv[optind];
Packit Service bca4e3
				rc = fcoe_validate_fcoe_conn(ifname);
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			if (!rc)
Packit Service bca4e3
				rc = display_target_info(ifname, DISP_LUN);
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case 's':
Packit Service bca4e3
			if (argc - optind > 2) {
Packit Service bca4e3
				rc = EBADNUMARGS;
Packit Service bca4e3
				break;
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			if (optind != argc) {
Packit Service bca4e3
				ifname = argv[optind];
Packit Service bca4e3
				rc = fcoe_validate_fcoe_conn(ifname);
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			if (!rc && ++optind != argc) {
Packit Service bca4e3
				stat_interval = atoi(argv[optind]);
Packit Service bca4e3
				if (stat_interval <= 0)
Packit Service bca4e3
					rc = EINVALARG;
Packit Service bca4e3
			} else if (!rc && optind == argc)
Packit Service bca4e3
				stat_interval = DEFAULT_STATS_INTERVAL;
Packit Service bca4e3
Packit Service bca4e3
			if (!rc)
Packit Service bca4e3
				rc = display_port_stats(ifname, stat_interval);
Packit Service bca4e3
			break;
Packit Service bca4e3
		case 'p':
Packit Service bca4e3
			rc = fcoeadm_action(CLIF_PID_CMD, NULL, flags);
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case 'b':
Packit Service bca4e3
			if (argc - optind > 2) {
Packit Service bca4e3
				rc = EBADNUMARGS;
Packit Service bca4e3
				break;
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			if (optind != argc) {
Packit Service bca4e3
				ifname = argv[optind];
Packit Service bca4e3
				rc = fcoe_validate_fcoe_conn(ifname);
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			if (!rc && ++optind != argc) {
Packit Service bca4e3
				stat_interval = atoi(argv[optind]);
Packit Service bca4e3
				if (stat_interval <= 0)
Packit Service bca4e3
					rc = EINVALARG;
Packit Service bca4e3
			} else if (!rc && optind == argc)
Packit Service bca4e3
				stat_interval = DEFAULT_STATS_INTERVAL;
Packit Service bca4e3
Packit Service bca4e3
			if (!rc)
Packit Service bca4e3
				rc = display_port_lesb_stats(ifname,
Packit Service bca4e3
							     stat_interval);
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case 'v':
Packit Service bca4e3
			if (argc - optind != 0) {
Packit Service bca4e3
				rc = EBADNUMARGS;
Packit Service bca4e3
				break;
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			printf("%s\n", FCOE_UTILS_VERSION);
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case 'h':
Packit Service bca4e3
			if (argc - optind != 0) {
Packit Service bca4e3
				rc = EBADNUMARGS;
Packit Service bca4e3
				break;
Packit Service bca4e3
			}
Packit Service bca4e3
Packit Service bca4e3
			fcoeadm_help();
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case '?':
Packit Service bca4e3
			rc = EIGNORE;
Packit Service bca4e3
			break;
Packit Service bca4e3
		}
Packit Service bca4e3
	}
Packit Service bca4e3
Packit Service bca4e3
err:
Packit Service bca4e3
	if (rc) {
Packit Service bca4e3
		switch (rc) {
Packit Service bca4e3
		case EFAIL:
Packit Service bca4e3
			FCOE_LOG_ERR("Command failed\n");
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case ENOACTION:
Packit Service bca4e3
			FCOE_LOG_ERR("No action was taken\n");
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case EFCOECONN:
Packit Service bca4e3
			FCOE_LOG_ERR("Connection already created on "
Packit Service bca4e3
				     "interface %s\n", ifname);
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case ENOFCOECONN:
Packit Service bca4e3
		case ENOFCHOST:
Packit Service bca4e3
			FCOE_LOG_ERR("No connection created on "
Packit Service bca4e3
				     "interface %s\n", ifname);
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case EINVALARG:
Packit Service bca4e3
			FCOE_LOG_ERR("Invalid argument\n");
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case EBADNUMARGS:
Packit Service bca4e3
			/*
Packit Service bca4e3
			 * Overloading E2BIG for too many argumets
Packit Service bca4e3
			 * and too few arguments.
Packit Service bca4e3
			 */
Packit Service bca4e3
			FCOE_LOG_ERR("Incorrect number of arguments\n");
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case EIGNORE:
Packit Service bca4e3
			/*
Packit Service bca4e3
			 * getopt_long will print the initial error, just break
Packit Service bca4e3
			 * through to get the --help suggestion.
Packit Service bca4e3
			 */
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case ENOETHDEV:
Packit Service bca4e3
			FCOE_LOG_ERR("Invalid interface name %s\n", ifname);
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case ENOSYSFS:
Packit Service bca4e3
			FCOE_LOG_ERR("sysfs not mounted\n");
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case ENOMONCONN:
Packit Service bca4e3
			FCOE_LOG_ERR("Could not connect to fcoemon\n");
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case ECONNTMOUT:
Packit Service bca4e3
			FCOE_LOG_ERR("Connection to fcoemon timed out\n");
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case EHBAAPIERR:
Packit Service bca4e3
			FCOE_LOG_ERR("libHBAAPI or libhbalinux error\n");
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case EINTERR:
Packit Service bca4e3
			FCOE_LOG_ERR("Internal error\n");
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		case EBADCLIFMSG:
Packit Service bca4e3
			FCOE_LOG_ERR("Messaging error\n");
Packit Service bca4e3
			break;
Packit Service bca4e3
Packit Service bca4e3
		default:
Packit Service bca4e3
			/*
Packit Service bca4e3
			 * This will catch EOPNOTSUPP which should never happen
Packit Service bca4e3
			 */
Packit Service bca4e3
			FCOE_LOG_ERR("Unknown error code %d\n", rc);
Packit Service bca4e3
			break;
Packit Service bca4e3
		}
Packit Service bca4e3
Packit Service bca4e3
		fprintf(stderr, "Try \'%s --help\' for more information.\n",
Packit Service bca4e3
			progname);
Packit Service bca4e3
	}
Packit Service bca4e3
Packit Service bca4e3
	return rc;
Packit Service bca4e3
}