Home | History | Annotate | Line # | Download | only in gpt
main.c revision 1.2
      1 /*	$NetBSD: main.c,v 1.2 2015/12/01 09:05:33 christos Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2002 Marcel Moolenaar
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  * 2. Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in the
     15  *    documentation and/or other materials provided with the distribution.
     16  *
     17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  *
     28  * CRC32 code derived from work by Gary S. Brown.
     29  */
     30 
     31 #if HAVE_NBTOOL_CONFIG_H
     32 #include "nbtool_config.h"
     33 #endif
     34 
     35 #include <sys/cdefs.h>
     36 #ifdef __RCSID
     37 __RCSID("$NetBSD: main.c,v 1.2 2015/12/01 09:05:33 christos Exp $");
     38 #endif
     39 
     40 #include <stdio.h>
     41 #include <stdlib.h>
     42 #include <unistd.h>
     43 #include <err.h>
     44 
     45 #include "map.h"
     46 #include "gpt.h"
     47 
     48 static struct {
     49 	int (*fptr)(gpt_t, int, char *[]);
     50 	const char *name;
     51 } cmdsw[] = {
     52 	{ cmd_add, "add" },
     53 #ifndef HAVE_NBTOOL_CONFIG_H
     54 	{ cmd_backup, "backup" },
     55 #endif
     56 	{ cmd_biosboot, "biosboot" },
     57 	{ cmd_create, "create" },
     58 	{ cmd_destroy, "destroy" },
     59 	{ cmd_header, "header" },
     60 	{ NULL, "help" },
     61 	{ cmd_label, "label" },
     62 	{ cmd_migrate, "migrate" },
     63 	{ cmd_recover, "recover" },
     64 	{ cmd_remove, "remove" },
     65 	{ NULL, "rename" },
     66 	{ cmd_resize, "resize" },
     67 	{ cmd_resizedisk, "resizedisk" },
     68 #ifndef HAVE_NBTOOL_CONFIG_H
     69 	{ cmd_restore, "restore" },
     70 #endif
     71 	{ cmd_set, "set" },
     72 	{ cmd_show, "show" },
     73 	{ cmd_type, "type" },
     74 	{ cmd_unset, "unset" },
     75 	{ NULL, "verify" },
     76 	{ NULL, NULL }
     77 };
     78 
     79 __dead static void
     80 usage(void)
     81 {
     82 	extern const char addmsg1[], addmsg2[], biosbootmsg[];
     83 	extern const char createmsg[], destroymsg[], headermsg[], labelmsg1[];
     84 	extern const char labelmsg2[], labelmsg3[], migratemsg[], recovermsg[];
     85 	extern const char removemsg1[], removemsg2[], resizemsg[];
     86 	extern const char resizediskmsg[], setmsg[], showmsg[], typemsg1[];
     87 	extern const char typemsg2[], typemsg3[], unsetmsg[];
     88 #ifndef HAVE_NBTOOL_CONFIG_H
     89 	extern const char backupmsg[], restoremsg[];
     90 #endif
     91 	const char *p = getprogname();
     92 	const char *f =
     93 	    "[-nrqv] [-m <mediasize>] [-s <sectorsize>]";
     94 
     95 	if (strcmp(p, "gpt") == 0)
     96 		fprintf(stderr,
     97 		    "Usage: %s %s <command> [<args>] <device>\n", p, f);
     98 	else
     99 		fprintf(stderr,
    100 		    "Usage: %s %s <device> <command> [<args>]\n", p, f);
    101 	fprintf(stderr,
    102 	    "Commands:\n"
    103 #ifndef HAVE_NBTOOL_CONFIG_H
    104 	    "       %s\n"
    105 	    "       %s\n"
    106 #endif
    107 	    "       %s\n"
    108 	    "       %s\n"
    109 	    "       %s\n"
    110 	    "       %s\n"
    111 	    "       %s\n"
    112 	    "       %s\n"
    113 	    "       %s\n"
    114 	    "       %s\n"
    115 	    "       %s\n"
    116 	    "       %s\n"
    117 	    "       %s\n"
    118 	    "       %s\n"
    119 	    "       %s\n"
    120 	    "       %s\n"
    121 	    "       %s\n"
    122 	    "       %s\n"
    123 	    "       %s\n"
    124 	    "       %s\n"
    125 	    "       %s\n"
    126 	    "       %s\n"
    127 	    "       %s\n",
    128 	    addmsg1, addmsg2,
    129 #ifndef HAVE_NBTOOL_CONFIG_H
    130 	    backupmsg,
    131 #endif
    132 	    biosbootmsg, createmsg, destroymsg,
    133 	    headermsg, labelmsg1, labelmsg2, labelmsg3,
    134 	    migratemsg, recovermsg,
    135 	    removemsg1, removemsg2,
    136 	    resizemsg, resizediskmsg,
    137 #ifndef HAVE_NBTOOL_CONFIG_H
    138 	    restoremsg,
    139 #endif
    140 	    setmsg, showmsg,
    141 	    typemsg1, typemsg2, typemsg3,
    142 	    unsetmsg);
    143 	exit(1);
    144 }
    145 
    146 static void
    147 prefix(const char *cmd)
    148 {
    149 	char *pfx;
    150 
    151 	if (asprintf(&pfx, "%s %s", getprogname(), cmd) < 0)
    152 		pfx = NULL;
    153 	else
    154 		setprogname(pfx);
    155 }
    156 
    157 int
    158 main(int argc, char *argv[])
    159 {
    160 	char *cmd, *p, *dev = NULL;
    161 	int ch, i;
    162 	u_int secsz = 0;
    163 	off_t mediasz = 0;
    164 	int flags = 0;
    165 	int verbose = 0;
    166 	gpt_t gpt;
    167 
    168 	setprogname(argv[0]);
    169 
    170 	if (strcmp(getprogname(), "gpt") == 0) {
    171 		if (argc < 3)
    172 			usage();
    173 		dev = argv[--argc];
    174 	}
    175 
    176 	/* Get the generic options */
    177 	while ((ch = getopt(argc, argv, "m:nqrs:v")) != -1) {
    178 		switch(ch) {
    179 		case 'm':
    180 			if (mediasz > 0)
    181 				usage();
    182 			mediasz = strtoul(optarg, &p, 10);
    183 			if (*p != 0 || mediasz < 1)
    184 				usage();
    185 			break;
    186 		case 'n':
    187 			flags |= GPT_NOSYNC;
    188 			break;
    189 		case 'r':
    190 			flags |= GPT_READONLY;
    191 			break;
    192 		case 'q':
    193 			flags |= GPT_QUIET;
    194 			break;
    195 		case 's':
    196 			if (secsz > 0)
    197 				usage();
    198 			secsz = strtoul(optarg, &p, 10);
    199 			if (*p != 0 || secsz < 1)
    200 				usage();
    201 			break;
    202 		case 'v':
    203 			verbose++;
    204 			break;
    205 		default:
    206 			usage();
    207 		}
    208 	}
    209 
    210 	if (argc == optind)
    211 		usage();
    212 
    213 	if (dev == NULL)
    214 		dev = argv[optind++];
    215 
    216 	if (argc == optind)
    217 		usage();
    218 
    219 	cmd = argv[optind++];
    220 	for (i = 0; cmdsw[i].name != NULL && strcmp(cmd, cmdsw[i].name); i++)
    221 		continue;
    222 
    223 	if (cmdsw[i].fptr == NULL)
    224 		errx(EXIT_FAILURE, "Unknown command: %s", cmd);
    225 
    226 	prefix(cmd);
    227 
    228 	gpt = gpt_open(dev, flags, verbose, mediasz, secsz);
    229 	if (gpt == NULL)
    230 		return EXIT_FAILURE;
    231 
    232 	if ((*cmdsw[i].fptr)(gpt, argc, argv) == -1)
    233 		return EXIT_FAILURE;
    234 
    235 	gpt_close(gpt);
    236 	return EXIT_SUCCESS;
    237 }
    238