diff options
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/edlabel/Makefile | 17 | ||||
-rw-r--r-- | sbin/edlabel/edlabel.c | 549 |
2 files changed, 0 insertions, 566 deletions
diff --git a/sbin/edlabel/Makefile b/sbin/edlabel/Makefile deleted file mode 100644 index da81b4889d3..00000000000 --- a/sbin/edlabel/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -# $OpenBSD: Makefile,v 1.6 2000/05/18 13:49:52 espie Exp $ - -.if ${MACHINE} == "sun3" || ${MACHINE} == "atari" || ${MACHINE} == "sparc" -PROG= edlabel -CFLAGS+= -Wall -LDADD+= -lutil -DPADD+= ${LIBUTIL} - -all: ${PROG} -.else -NOPROG=yes -.endif - -NOMAN= -MANSUBDIR=sun3 sparc #atari - -.include <bsd.prog.mk> diff --git a/sbin/edlabel/edlabel.c b/sbin/edlabel/edlabel.c deleted file mode 100644 index b9110dcf7cb..00000000000 --- a/sbin/edlabel/edlabel.c +++ /dev/null @@ -1,549 +0,0 @@ -/* $OpenBSD: edlabel.c,v 1.6 2001/06/04 14:59:48 mickey Exp $ */ -/* $NetBSD: edlabel.c,v 1.1.1.1 1995/10/08 22:39:09 gwr Exp $ */ - -/* - * Copyright (c) 1995 Gordon W. Ross - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * 4. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Gordon W. Ross - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/types.h> -#include <sys/param.h> -#include <sys/ioctl.h> -#define DKTYPENAMES -#include <sys/disklabel.h> - -#include <fcntl.h> -#include <stdio.h> -#include <ctype.h> -#include <string.h> -#include <errno.h> -#include <unistd.h> -#include <util.h> - -/* - * Machine dependend constants you want to retrieve only once... - */ -int rawpartition, maxpartitions; - -/* - * This is a data-driven program - */ -struct field { - char *f_name; - int f_offset; - int f_type; /* 1:char, 2:short, 4:int, >4:string */ -}; - -/* Table describing fields in the head of a disklabel. */ -#define dloff(f) (int)(&((struct disklabel *)0)->f) -struct field label_head[] = { - { " type_num", dloff(d_type), 2 }, - { " sub_type", dloff(d_subtype), 2 }, - { " type_name", dloff(d_typename), 16 }, - { " pack_name", dloff(d_packname), 16 }, - { " bytes/sector", dloff(d_secsize), 4 }, - { " sectors/track", dloff(d_nsectors), 4 }, - { " tracks/cylinder", dloff(d_ntracks), 4 }, - { " cylinders", dloff(d_ncylinders), 4 }, - { "sectors/cylinder", dloff(d_secpercyl), 4 }, - /* Don't care about the others until later... */ - { 0 }, -}; -#undef dloff - -char tmpbuf[64]; - -void -edit_head_field(v, f, modify) - void *v; - struct field *f; - int modify; /* also modify */ -{ - u_int8_t *cp; - u_int tmp; - - cp = v; - cp += f->f_offset; - - printf("%s: ", f->f_name); - - /* Print current value... */ - switch (f->f_type) { - case 1: - tmp = *cp; - printf("%d", tmp); - break; - case 2: - tmp = *((u_int16_t *)cp); - printf("%d", tmp); - break; - case 4: - tmp = *((u_int32_t *)cp); - printf("%d", tmp); - break; - - default: - /* must be a string. */ - strncpy(tmpbuf, (char*)cp, sizeof(tmpbuf)); - printf("%s", tmpbuf); - break; - } - - if (modify == 0) { - printf("\n"); - return; - } - printf(" ? "); - fflush(stdout); - - tmpbuf[0] = '\0'; - if (fgets(tmpbuf, sizeof(tmpbuf), stdin) == NULL) - return; - if ((tmpbuf[0] == '\0') || (tmpbuf[0] == '\n')) { - /* no new value supplied. */ - return; - } - - /* store new value */ - if (f->f_type <= 4) - if (sscanf(tmpbuf, "%d", &tmp) != 1) - return; - - switch (f->f_type) { - case 1: - *cp = tmp; - break; - case 2: - *((u_int16_t *)cp) = tmp; - break; - case 4: - *((u_int32_t *)cp) = tmp; - break; - default: - /* Get rid of the trailing newline. */ - tmp = strlen(tmpbuf); - if (tmp < 1) - break; - if (tmpbuf[tmp-1] == '\n') - tmpbuf[tmp-1] = '\0'; - strncpy((char*)cp, tmpbuf, f->f_type); - break; - } -} - -void -edit_head_all(d, modify) - struct disklabel *d; - int modify; -{ - struct field *f; - - /* Edit head stuff. */ - for (f = label_head; f->f_name; f++) - edit_head_field(d, f, modify); -} - -void -edit_geo(d) - struct disklabel *d; -{ - int nsect, ntrack, ncyl, spc; - - nsect = ntrack = ncyl = spc = 0; - - printf("Sectors/track: "); - fflush(stdout); - if (fgets(tmpbuf, sizeof(tmpbuf), stdin) == NULL) - return; - if (sscanf(tmpbuf, "%d", &nsect) != 1) - nsect = d->d_nsectors; - printf("Track/cyl: "); - fflush(stdout); - if (fgets(tmpbuf, sizeof(tmpbuf), stdin) == NULL) - return; - if (sscanf(tmpbuf, "%d", &ntrack) != 1) - ntrack = d->d_ntracks; - if (!nsect || !ntrack) - return; - spc = nsect * ntrack; - if (!(ncyl = d->d_secperunit / spc)) - return; - d->d_nsectors = nsect; - d->d_ntracks = ntrack; - d->d_ncylinders = ncyl; - d->d_secpercyl = spc; -} - -void -print_val_cts(d, val) - struct disklabel *d; - u_long val; -{ - int sects, trks, cyls; - char marker; - char buf[80]; - - marker = (val % d->d_secpercyl) ? '*' : ' '; - sects = val % d->d_nsectors; - cyls = val / d->d_nsectors; - trks = cyls % d->d_ntracks; - cyls /= d->d_ntracks; - sprintf(buf, "(%d/%02d/%02d)%c", cyls, trks, sects, marker); - printf(" %9ld %16s", val, buf); -} - -void -get_val_cts(d, buf, result) - struct disklabel *d; - char *buf; - u_int32_t *result; -{ - u_long tmp; - int cyls, trks, sects; - - tmp = sscanf(buf, "%d/%d/%d", &cyls, &trks, §s); - if (tmp == 1) - *result = cyls; /* really nblks! */ - if (tmp == 3) { - tmp = cyls; - tmp *= d->d_ntracks; - tmp += trks; - tmp *= d->d_nsectors; - tmp += sects; - *result = tmp; - } -} - -void -get_fstype(tmpbuf, fstype) - char *tmpbuf; - u_int8_t *fstype; -{ - int i, len; - - /* An empty response retains previous value */ - if (tmpbuf[0] == '\n') - return; - for (i = 0, len = strlen(tmpbuf) - 1; i < FSMAXTYPES; i++) { - if (!strncasecmp(tmpbuf, fstypenames[i], len)) { - *fstype = i; - return; - } - } -} - -void -edit_partition(d, idx, modify) - struct disklabel *d; - int idx; -{ - struct partition *p; - char letter, *comment; - - if ((idx < 0) || (idx >= maxpartitions)) { - printf("bad partition index\n"); - return; - } - - p = &d->d_partitions[idx]; - letter = 'a' + idx; - - /* Set hint about partition type */ - if (idx == rawpartition) - comment = "disk"; - else { - comment = "user"; - switch(idx) { - case 0: - comment = "root"; - break; - case 1: - comment = "swap"; - break; - } - } - - /* Print current value... */ - printf(" %c (%s) ", letter, comment); - print_val_cts(d, p->p_offset); - print_val_cts(d, p->p_size); - printf(" %s\n", fstypenames[p->p_fstype]); - - if (modify == 0) - return; - - /* starting block, or cyls/trks/sects */ - printf("start as <blkno> or <cyls/trks/sects> : "); - fflush(stdout); - if (fgets(tmpbuf, sizeof(tmpbuf), stdin) == NULL) - return; - get_val_cts(d, tmpbuf, &p->p_offset); - - /* number of blocks, or cyls/trks/sects */ - printf("length as <nblks> or <cyls/trks/sects> : "); - fflush(stdout); - if (fgets(tmpbuf, sizeof(tmpbuf), stdin) == NULL) - return; - get_val_cts(d, tmpbuf, &p->p_size); - /* partition type */ - printf("type: "); - fflush(stdout); - if (fgets(tmpbuf, sizeof(tmpbuf), stdin) == NULL) - return; - get_fstype(tmpbuf, &p->p_fstype); -} - -/*****************************************************************/ - -void -check_divisors(d) - struct disklabel *d; -{ - if (d->d_nsectors == 0) { - d->d_nsectors = 1; - printf("bad sect/trk, set to 1\n"); - } - if (d->d_ntracks == 0) { - d->d_ntracks = 1; - printf("bad trks/cyl, set to 1\n"); - } - if (d->d_ncylinders == 0) { - d->d_ncylinders = 1; - printf("bad cyls, set to 1\n"); - } - if (d->d_secpercyl == 0) { - d->d_secpercyl = (d->d_nsectors * d->d_ntracks); - printf("bad sect/cyl, set to %d\n", d->d_secpercyl); - } - -} - -u_short -dkcksum(d) - struct disklabel *d; -{ - u_short *start, *end; - u_short sum = 0; - - start = (u_short *)d; - end = (u_short *)&d->d_partitions[d->d_npartitions]; - while (start < end) - sum ^= *start++; - return (sum); -} - -void -label_write(d, dn) - struct disklabel *d; - char *dn; -{ - int fd; - - d->d_magic = DISKMAGIC; - d->d_magic2 = DISKMAGIC; - d->d_checksum = 0; - d->d_checksum = dkcksum(d); - - fd = open(dn, O_RDWR, 0); - if (fd < 0) { - perror(dn); - return; - } - if (ioctl(fd, DIOCWDINFO, d) < 0) { - perror("ioctl DIOCWDINFO"); - } - close(fd); -} - -void -label_read(dl, dn) - struct disklabel *dl; - char *dn; -{ - int fd; - - fd = open(dn, O_RDONLY, 0); - if (fd < 0) { - perror(dn); - exit(1); - } - if (ioctl(fd, DIOCGDINFO, dl) < 0) { - if (errno == ESRCH) - fprintf(stderr, "edlabel: No disk label on disk\n"); - else perror("ioctl DIOCGDINFO"); - exit(1); - } - - /* Make sure divisors are non-zero. */ - check_divisors(dl); - - close(fd); -} - -/*****************************************************************/ - -void -label_print(dl, dn) - struct disklabel *dl; - char *dn; -{ - int i; - - /* Print out head stuff. */ - edit_head_all(dl, 0); - - /* And the partition header. */ - printf("partition%6sstart%9s(c/t/s)%6snblks%9s(c/t/s) type\n\n" - "", "", "", "", ""); - for (i = 0; i < dl->d_npartitions; i++) - edit_partition(dl, i, 0); -} - -char modify_cmds[] = "modify subcommands:\n\ - @ : modify disk parameters\n\ - a-%c : modify partition\n%s\ - q : quit this subcommand\n"; - -void -label_modify(dl, dn) - struct disklabel *dl; - char *dn; -{ - int c, i; - int scsi_fict = 0; - - if (!strcmp(dl->d_typename, "SCSI disk") - && !strcmp(dl->d_packname, "fictitious")) - scsi_fict = 1; - - printf(modify_cmds, 'a' + maxpartitions, - scsi_fict ? " s : standardize geometry\n" : ""); - for (;;) { - printf("edlabel/modify> "); - fflush(stdout); - if (fgets(tmpbuf, sizeof(tmpbuf), stdin) == NULL) - break; - c = tmpbuf[0]; - if ((c == '\0') || (c == '\n')) - continue; /* blank line */ - if (c == 'q') - break; - if (c == '@') { - edit_head_all(dl, 1); - check_divisors(dl); - continue; - } - if ((c == 's') && scsi_fict) { - edit_geo(dl); - continue; - } - if ((c < 'a') || (c > 'q')) { - printf("bad input. "); - printf(modify_cmds, 'a' + maxpartitions, - scsi_fict ? " s : standardize geometry\n" : ""); - continue; - } - edit_partition(dl, c - 'a', 1); - } - /* Set the d_npartitions field correctly */ - for (i = 0; i < maxpartitions; i++) { - if (dl->d_partitions[i].p_size) - dl->d_npartitions = i + 1; - } - -} - -void -label_quit() -{ - exit(0); -} - -struct cmd { - void (*cmd_func)(); - char *cmd_name; - char *cmd_descr; -} cmds[] = { - { label_print, "print", "display the current disk label" }, - { label_modify, "modify", "prompt for changes to the label" }, - { label_write, "write", "write the new label to disk" }, - { label_quit, "quit", "terminate program" }, - { 0 }, -}; - -void -menu() -{ - struct cmd *cmd; - - printf("edlabel menu:\n"); - for (cmd = cmds; cmd->cmd_func; cmd++) - printf("%s\t- %s\n", cmd->cmd_name, cmd->cmd_descr); -} - -int -main(argc, argv) - int argc; - char **argv; -{ - struct disklabel dl; - struct cmd *cmd; - char *devname; - - if (argc != 2) { - fprintf(stderr, "usage: edlabel RAWDISK\n"); - return (1); - } - devname = argv[1]; - - rawpartition = getrawpartition(); - maxpartitions = getmaxpartitions(); - - label_read(&dl, devname); - - menu(); - - for (;;) { - printf("edlabel> "); - fflush(stdout); - if (fgets(tmpbuf, sizeof(tmpbuf), stdin) == NULL) - break; - for (cmd = cmds; cmd->cmd_func; cmd++) - if (cmd->cmd_name[0] == tmpbuf[0]) - goto found; - printf("Invalid command. "); - menu(); - continue; - - found: - cmd->cmd_func(&dl, devname); - } - - return (0); -} - |