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