Module Name: src Committed By: christos Date: Fri Mar 28 15:00:53 UTC 2014
Modified Files: src/sys/arch/sgimips/stand/sgivol: sgivol.c Log Message: use err To generate a diff of this commit: cvs rdiff -u -r1.20 -r1.21 src/sys/arch/sgimips/stand/sgivol/sgivol.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/sgimips/stand/sgivol/sgivol.c diff -u src/sys/arch/sgimips/stand/sgivol/sgivol.c:1.20 src/sys/arch/sgimips/stand/sgivol/sgivol.c:1.21 --- src/sys/arch/sgimips/stand/sgivol/sgivol.c:1.20 Wed Mar 26 12:16:06 2014 +++ src/sys/arch/sgimips/stand/sgivol/sgivol.c Fri Mar 28 11:00:53 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: sgivol.c,v 1.20 2014/03/26 16:16:06 christos Exp $ */ +/* $NetBSD: sgivol.c,v 1.21 2014/03/28 15:00:53 christos Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -53,6 +53,7 @@ #include <string.h> #include <fcntl.h> #include <util.h> +#include <err.h> #ifndef HAVE_NBTOOL_CONFIG_H #include <sys/endian.h> #endif @@ -80,7 +81,7 @@ struct stat st; struct disklabel lbl; #endif -unsigned char buf[512]; +char buf[512]; const char *sgi_types[] = { "Volume Header", @@ -99,20 +100,18 @@ const char *sgi_types[] = { "XVM" }; -int main(int, char *[]); - void display_vol(void); -void init_volhdr(void); +void init_volhdr(const char *); void read_file(void); -void write_file(void); -void delete_file(void); -void move_file(void); -void modify_partition(void); -void write_volhdr(void); +void write_file(const char *); +void delete_file(const char *); +void move_file(const char *); +void modify_partition(const char *); +void write_volhdr(const char *); int allocate_space(int); void checksum_vol(void); int names_match(int, const char *); -void usage(void); +void usage(void) __dead; int main(int argc, char *argv[]) @@ -201,80 +200,63 @@ main(int argc, char *argv[]) fd = open(argv[0], (opt_i | opt_m | opt_w | opt_d | opt_p) ? O_RDWR : O_RDONLY); - if (fd < 0) { -#if HAVE_NBTOOL_CONFIG_H - perror("File open"); - exit(1); -#else + if (fd == -1) { +#ifndef HAVE_NBTOOL_CONFIG_H snprintf(buf, sizeof(buf), "/dev/r%s%c", argv[0], 'a' + getrawpartition()); - fd = open((char *)buf, (opt_i | opt_w | opt_d | opt_p) - ? O_RDWR : O_RDONLY); - if (fd < 0) { - printf("Error opening device %s: %s\n", - argv[0], strerror(errno)); - exit(1); - } + fd = open(buf, (opt_i | opt_w | opt_d | opt_p) + ? O_RDWR : O_RDONLY); + if (fd == -1) #endif + err(EXIT_FAILURE, "Error opening device `%s'", argv[0]); } - if (read(fd, buf, sizeof(buf)) != sizeof(buf)) { - perror("read volhdr"); - exit(1); - } + + if (read(fd, buf, sizeof(buf)) != sizeof(buf)) + err(EXIT_FAILURE, "Can't read volhdr from `%s'", argv[0]); + #if HAVE_NBTOOL_CONFIG_H - if (fstat(fd, &st) < 0) { - perror("stat error"); - exit(1); - } - if (!S_ISREG(st.st_mode)) { - printf("Must be regular file\n"); - exit(1); - } - if (st.st_size % SGI_BOOT_BLOCK_BLOCKSIZE) { - printf("Size must be multiple of %d\n", + if (fstat(fd, &st) == -1) + err(EXIT_FAILURE, "Can't stat `%s'", argv[0]); + if (!S_ISREG(st.st_mode)) + errx(EXIT_FAILURE, "Not a regular file `%s'", argv[0]); + + if (st.st_size % SGI_BOOT_BLOCK_BLOCKSIZE) + errx(EXIT_FAILURE, "Size must be multiple of %d", SGI_BOOT_BLOCK_BLOCKSIZE); - exit(1); - } - if (st.st_size < (SGIVOL_NBTOOL_NSECS * SGIVOL_NBTOOL_NTRACKS)) { - printf("Minimum size of %d required\n", + if (st.st_size < (SGIVOL_NBTOOL_NSECS * SGIVOL_NBTOOL_NTRACKS)) + errx(EXIT_FAILURE, "Minimum size of %d required", SGIVOL_NBTOOL_NSECS * SGIVOL_NBTOOL_NTRACKS); - exit(1); - } #else - if (ioctl(fd, DIOCGDINFO, &lbl) < 0) { - perror("DIOCGDINFO"); - exit(1); - } + if (ioctl(fd, DIOCGDINFO, &lbl) == -1) + err(EXIT_FAILURE, "ioctl DIOCGDINFO failed"); #endif volhdr = (struct sgi_boot_block *) buf; if (opt_i) { - init_volhdr(); - exit(0); - } - if (be32toh(volhdr->magic) != SGI_BOOT_BLOCK_MAGIC) { - printf("No Volume Header found, magic=%x. Use -i first.\n", - be32toh(volhdr->magic)); - exit(1); + init_volhdr(argv[0]); + return 0; } + if (be32toh(volhdr->magic) != SGI_BOOT_BLOCK_MAGIC) + errx(EXIT_FAILURE, "No Volume Header found, magic=%x. " + "Use -i first.\n", be32toh(volhdr->magic)); if (opt_r) { read_file(); - exit(0); + return 0; } if (opt_w) { - write_file(); - exit(0); + write_file(argv[0]); + return 0; } if (opt_d) { - delete_file(); - exit(0); + delete_file(argv[0]); + return 0; } if (opt_m) { - move_file(); - exit(0); + move_file(argv[0]); + return 0; } if (opt_p) { - modify_partition(); - exit(0); + modify_partition(argv[0]); + return 0; } if (!opt_q) @@ -295,15 +277,14 @@ names_match(int slot, const char *b) { int cmp; - if (slot < 0 || slot >= SGI_BOOT_BLOCK_MAXVOLDIRS) { - printf("Internal error: bad slot in %s()\n", __func__); - exit(1); - } + if (slot < 0 || slot >= SGI_BOOT_BLOCK_MAXVOLDIRS) + errx(EXIT_FAILURE, "Internal error: bad slot in %s()", + __func__); cmp = strncmp(volhdr->voldir[slot].name, b, sizeof(volhdr->voldir[slot].name)); - return (cmp == 0 && strlen(b) <= sizeof(volhdr->voldir[slot].name)); + return cmp == 0 && strlen(b) <= sizeof(volhdr->voldir[slot].name); } void @@ -350,7 +331,7 @@ display_vol(void) } void -init_volhdr(void) +init_volhdr(const char *fname) { memset(buf, 0, sizeof(buf)); volhdr->magic = htobe32(SGI_BOOT_BLOCK_MAGIC); @@ -402,7 +383,7 @@ init_volhdr(void) #endif volhdr->partitions[0].first = htobe32(volhdr_size); volhdr->partitions[0].type = htobe32(SGI_PTYPE_BSD); - write_volhdr(); + write_volhdr(fname); } void @@ -418,23 +399,17 @@ read_file(void) strlen(volhdr->voldir[i].name)) == 0) break; } - if (i >= SGI_BOOT_BLOCK_MAXVOLDIRS) { - printf("File '%s' not found\n", vfilename); - exit(1); - } + if (i >= SGI_BOOT_BLOCK_MAXVOLDIRS) + errx(EXIT_FAILURE, "File `%s' not found", vfilename); /* XXX assumes volume header starts at 0? */ lseek(fd, be32toh(volhdr->voldir[i].block) * 512, SEEK_SET); fp = fopen(ufilename, "w"); - if (fp == NULL) { - perror("open write"); - exit(1); - } + if (fp == NULL) + err(EXIT_FAILURE, "Can't open `%s'", ufilename); i = be32toh(volhdr->voldir[i].bytes); while (i > 0) { - if (read(fd, buf, sizeof(buf)) != sizeof(buf)) { - perror("read file"); - exit(1); - } + if (read(fd, buf, sizeof(buf)) != sizeof(buf)) + err(EXIT_FAILURE, "Error reading from `%s'", ufilename); fwrite(buf, 1, i > sizeof(buf) ? sizeof(buf) : i, fp); i -= i > sizeof(buf) ? sizeof(buf) : i; } @@ -442,23 +417,23 @@ read_file(void) } void -write_file(void) +write_file(const char *fname) { FILE *fp; int slot; size_t namelen; int block, i; + off_t off; struct stat st; char fbuf[512]; if (!opt_q) printf("Writing file %s\n", ufilename); - if (stat(ufilename, &st) < 0) { - perror("stat"); - exit(1); - } + if (stat(ufilename, &st) == -1) + err(EXIT_FAILURE, "Can't stat `%s'", ufilename); if (!opt_q) - printf("File %s has %lld bytes\n", ufilename, st.st_size); + printf("File %s has %ju bytes\n", ufilename, + (uintmax_t)st.st_size); slot = -1; for (i = 0; i < SGI_BOOT_BLOCK_MAXVOLDIRS; ++i) { if (volhdr->voldir[i].name[0] == '\0' && slot < 0) @@ -468,10 +443,8 @@ write_file(void) break; } } - if (slot == -1) { - printf("No directory space for file %s\n", vfilename); - exit(1); - } + if (slot == -1) + errx(EXIT_FAILURE, "No directory space for file %s", vfilename); /* -w can overwrite, -a won't overwrite */ if (be32toh(volhdr->voldir[slot].block) > 0) { if (!opt_q) @@ -481,15 +454,13 @@ write_file(void) volhdr->voldir[slot].block = volhdr->voldir[slot].bytes = 0; } if (st.st_size == 0) { - printf("bad file size\n"); + errx(EXIT_FAILURE, "Empty file `%s'", ufilename); exit(1); } /* XXX assumes volume header starts at 0? */ block = allocate_space((int)st.st_size); - if (block < 0) { - printf("No space for file\n"); - exit(1); - } + if (block < 0) + errx(EXIT_FAILURE, "No space for file `%s'", vfilename); /* * Make sure the name in the volume header is max. 8 chars, @@ -512,29 +483,29 @@ write_file(void) volhdr->voldir[slot].block = htobe32(block); volhdr->voldir[slot].bytes = htobe32(st.st_size); - write_volhdr(); + write_volhdr(fname); /* write the file itself */ - i = lseek(fd, block * 512, SEEK_SET); - if (i < 0) { - perror("lseek write"); - exit(1); - } + off = lseek(fd, block * 512, SEEK_SET); + if (off == -1) + err(EXIT_FAILURE, "Seek failed `%s'", fname); i = st.st_size; fp = fopen(ufilename, "r"); + if (fp == NULL) + err(EXIT_FAILURE, "Can't open `%s'", ufilename); while (i > 0) { - fread(fbuf, 1, i > 512 ? 512 : i, fp); - if (write(fd, fbuf, 512) != 512) { - perror("write file"); - exit(1); - } - i -= i > 512 ? 512 : i; + int j = i > 512 ? 512 : i; + if (fread(fbuf, 1, j, fp) != j) + err(EXIT_FAILURE, "Can't read `%s'", ufilename); + if (write(fd, fbuf, 512) != 512) + err(EXIT_FAILURE, "Can't write `%s'", fname); + i -= j; } fclose(fp); } void -delete_file(void) +delete_file(const char *fname) { int i; @@ -543,19 +514,17 @@ delete_file(void) break; } } - if (i >= SGI_BOOT_BLOCK_MAXVOLDIRS) { - printf("File '%s' not found\n", vfilename); - exit(1); - } + if (i >= SGI_BOOT_BLOCK_MAXVOLDIRS) + errx(EXIT_FAILURE, "File `%s' not found", vfilename); /* XXX: we don't compact the file space, so get fragmentation */ volhdr->voldir[i].name[0] = '\0'; volhdr->voldir[i].block = volhdr->voldir[i].bytes = 0; - write_volhdr(); + write_volhdr(fname); } void -move_file(void) +move_file(const char *fname) { char dstfile[sizeof(volhdr->voldir[0].name) + 1]; size_t namelen; @@ -577,51 +546,45 @@ move_file(void) for (i = 0; i < SGI_BOOT_BLOCK_MAXVOLDIRS; i++) { if (names_match(i, vfilename)) { - if (slot != -1) { - printf("Error: Cannot move '%s' to '%s' - " - "duplicate source files exist!\n", + if (slot != -1) + errx(EXIT_FAILURE, + "Error: Cannot move '%s' to '%s' - " + "duplicate source files exist!", vfilename, dstfile); - exit(1); - } slot = i; } - if (names_match(i, dstfile)) { - printf("Error: Cannot move '%s' to '%s' - " - "destination file already exists!\n", + if (names_match(i, dstfile)) + errx(EXIT_FAILURE, "Error: Cannot move '%s' to '%s' - " + "destination file already exists!", vfilename, dstfile); - exit(1); - } - } - if (slot == -1) { - printf("File '%s' not found\n", vfilename); - exit(1); } + if (slot == -1) + errx(EXIT_FAILURE, "File `%s' not found", vfilename); /* `dstfile' is already padded with NULs */ memcpy(volhdr->voldir[slot].name, dstfile, sizeof(volhdr->voldir[slot].name)); - write_volhdr(); + write_volhdr(fname); } void -modify_partition(void) +modify_partition(const char *fname) { if (!opt_q) printf("Modify partition %d start %d length %d\n", partno, partfirst, partblocks); - if (partno < 0 || partno >= SGI_BOOT_BLOCK_MAXPARTITIONS) { - printf("Invalid partition number: %d\n", partno); - exit(1); - } + if (partno < 0 || partno >= SGI_BOOT_BLOCK_MAXPARTITIONS) + errx(EXIT_FAILURE, "Invalid partition number: %d", partno); + volhdr->partitions[partno].blocks = htobe32(partblocks); volhdr->partitions[partno].first = htobe32(partfirst); volhdr->partitions[partno].type = htobe32(parttype); - write_volhdr(); + write_volhdr(fname); } void -write_volhdr(void) +write_volhdr(const char *fname) { int i; @@ -642,7 +605,7 @@ write_volhdr(void) } i = write(fd, buf, 512); if (i < 0) - perror("write volhdr"); + errx(EXIT_FAILURE, "write volhdr `%s'", fname); } int @@ -702,13 +665,13 @@ checksum_vol(void) void usage(void) { - printf("Usage: sgivol [-qf] -i [-h vhsize] device\n" - " sgivol [-qf] -r vhfilename diskfilename device\n" - " sgivol [-qf] -w vhfilename diskfilename device\n" - " sgivol [-qf] -d vhfilename device\n" - " sgivol [-qf] -m vhfilename vhfilename device\n" - " sgivol [-qf] -p partno partfirst partblocks " - "parttype device\n" - ); + const char *p = getprogname(); + printf("Usage:\t%s [-qf] -i [-h vhsize] device\n" + "\t%s [-qf] -r vhfilename diskfilename device\n" + "\t%s [-qf] -w vhfilename diskfilename device\n" + "\t%s [-qf] -d vhfilename device\n" + "\t%s [-qf] -m vhfilename vhfilename device\n" + "\t%s [-qf] -p partno partfirst partblocks " + "parttype device\n", p, p, p, p, p, p); exit(0); }