1258578Shrs/* $NetBSD: main.c,v 1.6 2007/02/21 20:53:59 hubertf Exp $ */ 274462Salfred 374462Salfred/*- 4258578Shrs * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc. 5258578Shrs * All rights reserved. 674462Salfred * 7258578Shrs * This code is derived from software contributed to The NetBSD Foundation 8258578Shrs * by Andrew Doran. 9258578Shrs * 10258578Shrs * Redistribution and use in source and binary forms, with or without 11258578Shrs * modification, are permitted provided that the following conditions 12258578Shrs * are met: 13258578Shrs * 1. Redistributions of source code must retain the above copyright 14258578Shrs * notice, this list of conditions and the following disclaimer. 15258578Shrs * 2. Redistributions in binary form must reproduce the above copyright 16258578Shrs * notice, this list of conditions and the following disclaimer in the 1774462Salfred * documentation and/or other materials provided with the distribution. 18258578Shrs * 19258578Shrs * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20258578Shrs * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21258578Shrs * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22258578Shrs * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23258578Shrs * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24258578Shrs * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25258578Shrs * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26258578Shrs * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27258578Shrs * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28258578Shrs * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2974462Salfred * POSSIBILITY OF SUCH DAMAGE. 3074462Salfred */ 3174462Salfred 3274462Salfred#ifndef lint 3374462Salfred#include <sys/cdefs.h> 3474462Salfred__RCSID("$NetBSD: main.c,v 1.6 2007/02/21 20:53:59 hubertf Exp $"); 3574462Salfred#endif /* not lint */ 3674462Salfred 3774462Salfred#include <sys/types.h> 3874462Salfred#include <sys/ioctl.h> 3974462Salfred#include <sys/queue.h> 4074462Salfred 4174462Salfred#include <dev/ic/mlxreg.h> 4274462Salfred#include <dev/ic/mlxio.h> 4374462Salfred 4474462Salfred#include <err.h> 4574462Salfred#include <fcntl.h> 4674462Salfred#include <stdio.h> 4774462Salfred#include <stdlib.h> 4874462Salfred#include <string.h> 4974462Salfred#include <unistd.h> 5074462Salfred 5174462Salfred#include "extern.h" 5274462Salfred 5374462Salfredconst char *mlxname; 5474462Salfredconst char *memf; 5574462Salfredconst char *nlistf; 5674462Salfredstruct mlx_cinfo ci; 5774462Salfredint mlxfd = -1; 5874462Salfredint verbosity; 5974462Salfred 6074462Salfredstruct cmd { 6174462Salfred const char *label; 6274462Salfred int flags; 6374462Salfred int (*func)(char **); 6474462Salfred}; 6574462Salfred#define CMD_DISKS 0x01 6674462Salfred#define CMD_NOARGS 0x02 6774462Salfred 6874462Salfredstatic const struct cmd cmdtab[] = { 6974462Salfred { "check", CMD_DISKS, cmd_check }, 7074462Salfred { "config", CMD_NOARGS, cmd_config }, 7174462Salfred { "cstatus", CMD_NOARGS, cmd_cstatus }, 7274462Salfred { "detach", CMD_DISKS, cmd_detach }, 7374462Salfred { "rebuild", 0, cmd_rebuild }, 7474462Salfred { "rescan", CMD_NOARGS, cmd_rescan }, 7574462Salfred { "status", CMD_DISKS, cmd_status }, 7674462Salfred}; 7774462Salfred 7874462Salfredint 7974462Salfredmain(int argc, char **argv) 8074462Salfred{ 8174462Salfred const struct cmd *cmd, *maxcmd; 8274462Salfred const char *cmdname, *dv; 8374462Salfred int ch, i, rv, all; 8474462Salfred 8574462Salfred all = 0; 8674462Salfred dv = "/dev/mlx0"; 8774462Salfred mlx_disk_init(); 8874462Salfred 8974462Salfred while ((ch = getopt(argc, argv, "af:v")) != -1) { 9074462Salfred switch (ch) { 9174462Salfred case 'a': 9274462Salfred all = 1; 9374462Salfred break; 9474462Salfred 9574462Salfred case 'f': 9674462Salfred dv = optarg; 9774462Salfred break; 9874462Salfred 9974462Salfred case 'v': 10074462Salfred verbosity++; 10174462Salfred break; 10274462Salfred 10374462Salfred default: 10474462Salfred usage(); 10574462Salfred /* NOTREACHED */ 10674462Salfred } 10774462Salfred } 10874462Salfred 10974462Salfred if ((cmdname = argv[optind++]) == NULL) 11074462Salfred usage(); 11174462Salfred 11274462Salfred for (i = 0; dv[i] != '\0'; i++) 11374462Salfred if (dv[i] == '/') 11474462Salfred mlxname = &dv[i + 1]; 11574462Salfred 11674462Salfred if ((mlxfd = open(dv, O_RDWR)) < 0) 11774462Salfred err(EXIT_FAILURE, "%s", dv); 11874462Salfred 11974462Salfred cmd = &cmdtab[0]; 12074462Salfred maxcmd = &cmdtab[sizeof(cmdtab) / sizeof(cmdtab[0])]; 12174462Salfred while (cmd < maxcmd) { 12274462Salfred if (strcmp(cmdname, cmd->label) == 0) 12374462Salfred break; 12474462Salfred cmd++; 12574462Salfred } 12674462Salfred if (cmd == maxcmd) 12774462Salfred usage(); 12874462Salfred 12974462Salfred if (ioctl(mlxfd, MLX_GET_CINFO, &ci)) 13074462Salfred err(EXIT_FAILURE, "ioctl(MLX_GET_CINFO)"); 13174462Salfred 13274462Salfred if ((cmd->flags & CMD_DISKS) != 0) { 13374462Salfred if (all) 13474462Salfred mlx_disk_add_all(); 13574462Salfred 13674462Salfred while (argv[optind] != NULL) 13774462Salfred mlx_disk_add(argv[optind++]); 13874462Salfred if (mlx_disk_empty()) 13974462Salfred errx(EXIT_FAILURE, 14074462Salfred "no logical drives attached to this controller"); 14174462Salfred } else if ((cmd->flags & CMD_NOARGS) != 0) 14274462Salfred if (argv[optind] != NULL) 14374462Salfred usage(); 14474462Salfred 14574462Salfred rv = (*cmd->func)(&argv[optind]); 14674462Salfred close(mlxfd); 14774462Salfred exit(rv); 14874462Salfred /* NOTREACHED */ 14974462Salfred} 15074462Salfred 15174462Salfredvoid 15274462Salfredusage(void) 15374462Salfred{ 15474462Salfred 15574462Salfred (void)fprintf(stderr, "usage: %s [-f dev] [-av] command [...]\n", 15674462Salfred getprogname()); 15774462Salfred exit(EXIT_FAILURE); 15874462Salfred /* NOTREACHED */ 15974462Salfred} 16074462Salfred