1/* $NetBSD: main.c,v 1.6 2007/02/21 20:53:59 hubertf Exp $ */ 2 3/*- 4 * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Andrew Doran. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32#ifndef lint 33#include <sys/cdefs.h> 34__RCSID("$NetBSD: main.c,v 1.6 2007/02/21 20:53:59 hubertf Exp $"); 35#endif /* not lint */ 36 37#include <sys/types.h> 38#include <sys/ioctl.h> 39#include <sys/queue.h> 40 41#include <dev/ic/mlxreg.h> 42#include <dev/ic/mlxio.h> 43 44#include <err.h> 45#include <fcntl.h> 46#include <stdio.h> 47#include <stdlib.h> 48#include <string.h> 49#include <unistd.h> 50 51#include "extern.h" 52 53const char *mlxname; 54const char *memf; 55const char *nlistf; 56struct mlx_cinfo ci; 57int mlxfd = -1; 58int verbosity; 59 60struct cmd { 61 const char *label; 62 int flags; 63 int (*func)(char **); 64}; 65#define CMD_DISKS 0x01 66#define CMD_NOARGS 0x02 67 68static const struct cmd cmdtab[] = { 69 { "check", CMD_DISKS, cmd_check }, 70 { "config", CMD_NOARGS, cmd_config }, 71 { "cstatus", CMD_NOARGS, cmd_cstatus }, 72 { "detach", CMD_DISKS, cmd_detach }, 73 { "rebuild", 0, cmd_rebuild }, 74 { "rescan", CMD_NOARGS, cmd_rescan }, 75 { "status", CMD_DISKS, cmd_status }, 76}; 77 78int 79main(int argc, char **argv) 80{ 81 const struct cmd *cmd, *maxcmd; 82 const char *cmdname, *dv; 83 int ch, i, rv, all; 84 85 all = 0; 86 dv = "/dev/mlx0"; 87 mlx_disk_init(); 88 89 while ((ch = getopt(argc, argv, "af:v")) != -1) { 90 switch (ch) { 91 case 'a': 92 all = 1; 93 break; 94 95 case 'f': 96 dv = optarg; 97 break; 98 99 case 'v': 100 verbosity++; 101 break; 102 103 default: 104 usage(); 105 /* NOTREACHED */ 106 } 107 } 108 109 if ((cmdname = argv[optind++]) == NULL) 110 usage(); 111 112 for (i = 0; dv[i] != '\0'; i++) 113 if (dv[i] == '/') 114 mlxname = &dv[i + 1]; 115 116 if ((mlxfd = open(dv, O_RDWR)) < 0) 117 err(EXIT_FAILURE, "%s", dv); 118 119 cmd = &cmdtab[0]; 120 maxcmd = &cmdtab[sizeof(cmdtab) / sizeof(cmdtab[0])]; 121 while (cmd < maxcmd) { 122 if (strcmp(cmdname, cmd->label) == 0) 123 break; 124 cmd++; 125 } 126 if (cmd == maxcmd) 127 usage(); 128 129 if (ioctl(mlxfd, MLX_GET_CINFO, &ci)) 130 err(EXIT_FAILURE, "ioctl(MLX_GET_CINFO)"); 131 132 if ((cmd->flags & CMD_DISKS) != 0) { 133 if (all) 134 mlx_disk_add_all(); 135 136 while (argv[optind] != NULL) 137 mlx_disk_add(argv[optind++]); 138 if (mlx_disk_empty()) 139 errx(EXIT_FAILURE, 140 "no logical drives attached to this controller"); 141 } else if ((cmd->flags & CMD_NOARGS) != 0) 142 if (argv[optind] != NULL) 143 usage(); 144 145 rv = (*cmd->func)(&argv[optind]); 146 close(mlxfd); 147 exit(rv); 148 /* NOTREACHED */ 149} 150 151void 152usage(void) 153{ 154 155 (void)fprintf(stderr, "usage: %s [-f dev] [-av] command [...]\n", 156 getprogname()); 157 exit(EXIT_FAILURE); 158 /* NOTREACHED */ 159} 160