From owner-p4-projects Sun Feb 9 7:47:44 2003 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 927F537B405; Sun, 9 Feb 2003 07:47:37 -0800 (PST) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 293C437B401 for ; Sun, 9 Feb 2003 07:47:37 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id B625A43F85 for ; Sun, 9 Feb 2003 07:47:36 -0800 (PST) (envelope-from jmallett@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.6/8.12.6) with ESMTP id h19Flabv084757 for ; Sun, 9 Feb 2003 07:47:36 -0800 (PST) (envelope-from jmallett@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.6/8.12.6/Submit) id h19FlabB084754 for perforce@freebsd.org; Sun, 9 Feb 2003 07:47:36 -0800 (PST) Date: Sun, 9 Feb 2003 07:47:36 -0800 (PST) Message-Id: <200302091547.h19FlabB084754@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jmallett@freebsd.org using -f From: Juli Mallett Subject: PERFORCE change 24901 for review To: Perforce Change Reviews Sender: owner-p4-projects@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG http://perforce.freebsd.org/chv.cgi?CH=24901 Change 24901 by jmallett@jmallett_dalek on 2003/02/09 07:47:07 Abstractions and framework to work with the files herein, right now, just provide facility to Get them out. Seems to work for getting the sash images out of an inst CD. Affected files ... .. //depot/projects/mips/sbin/fxlabel/fxlabel.c#3 edit Differences ... ==== //depot/projects/mips/sbin/fxlabel/fxlabel.c#3 (text+ko) ==== @@ -39,19 +39,27 @@ #include struct volhdr label; +struct volpart *vhp = &label.vh_part[FX_VOLHDRPART]; static int needswap; +static int bsize = 512; /* - * Boolean returns here indicate true on error. + * Boolean returns here indicate true on error. Some just error to prevent + * programmers from shooting off feet. */ +static void addfile(struct volhdr *, int, const char *); +static void defrag(struct volhdr *, int); +static void deletefile(struct volhdr *, int, const char *); static int dkopen(const char *, int); static void dirlist(struct volhdr *); +static void getfile(struct volhdr *, int, const char *); static bool goodlabel(struct volhdr *, const char **); static void newlabel(struct volhdr *); static void printlabel(struct volhdr *); static bool readlabel(int); static void sumlabel(struct volhdr *); static void swaplabel(struct volhdr *); +static int startdisk(const char *, int); static bool writelabel(int); static void usage(void); @@ -66,16 +74,26 @@ int main(int argc, char *argv[]) { - const char *disk, *error; + const char *aflag, *dflag, *disk, *gflag; bool pflag, wflag; int ch; int fd; + aflag = dflag = gflag = NULL; pflag = wflag = false; needswap = be16toh(0x1234) != 0x1234; - while ((ch = getopt(argc, argv, "pw")) != -1) { + while ((ch = getopt(argc, argv, "a:d:g:pw")) != -1) { switch (ch) { + case 'a': + aflag = optarg; + break; + case 'd': + dflag = optarg; + break; + case 'g': + gflag = optarg; + break; case 'p': if (wflag) usage(); @@ -94,19 +112,40 @@ argc -= optind; argv += optind; - if (!pflag && !wflag) + if (aflag == NULL && dflag == NULL && gflag == NULL && !pflag && !wflag) pflag = true; while ((disk = *argv++) != NULL) { + if (aflag != NULL) { + fd = startdisk(disk, O_RDWR); + defrag(&label, fd); + addfile(&label, fd, aflag); + sumlabel(&label); + swaplabel(&label); + if (writelabel(fd)) + err(1, "%s (label write)", disk); + close(fd); + continue; + } + if (dflag != NULL) { + fd = startdisk(disk, O_RDWR); + deletefile(&label, fd, dflag); + defrag(&label, fd); + sumlabel(&label); + swaplabel(&label); + if (writelabel(fd)) + err(1, "%s (label write)", disk); + close(fd); + continue; + } + if (gflag != NULL) { + fd = startdisk(disk, O_RDONLY); + getfile(&label, fd, gflag); + close(fd); + continue; + } if (pflag) { - fd = dkopen(disk, O_RDONLY); - if (fd == -1) - err(1, "%s (open)", disk); - if (readlabel(fd)) - err(1, "%s (label read)", disk); - if (goodlabel(&label, &error)) - errx(1, "%s (label check): %s", disk, error); - swaplabel(&label); + fd = startdisk(disk, O_RDONLY); printlabel(&label); close(fd); continue; @@ -128,6 +167,24 @@ return (0); } +static void +addfile(struct volhdr *vp, int fd, const char *file) +{ + errx(1, "adding of files is unimplemented"); +} + +static void +defrag(struct volhdr *vp, int fd) +{ + errx(1, "defragmenting of the free space is unimplemented"); +} + +static void +deletefile(struct volhdr *vp, int fd, const char *file) +{ + errx(1, "deletion of files is unimplemented"); +} + static int dkopen(const char *disk, int flags) { @@ -160,6 +217,39 @@ } } +static void +getfile(struct volhdr *vp, int fd, const char *file) +{ + struct voldir *dp; + ssize_t cnt; + char *buf; + int ofd; + int i; + + for (i = 0; i < FX_DIRSIZE; i++) { + dp = &vp->vh_dir[i]; + if (!dp->vd_size) + continue; + if (strncmp(file, dp->vd_name, FX_NAMELEN) != 0) + continue; + ofd = open(file, O_CREAT | O_WRONLY, 0644); + if (ofd == -1) + err(1, "%s (file get)", file); + buf = malloc(dp->vd_size); + if (buf == NULL) + errx(1, "malloc failed"); + cnt = pread(fd, buf, dp->vd_size, dp->vd_addr * bsize); + if (cnt != dp->vd_size) + err(1, "%s (file read)", file); + cnt = write(ofd, buf, dp->vd_size); + if (cnt != dp->vd_size) + err(1, "%s (file write)", file); + close(ofd); + return; + } + errx(1, "could not find %s", file); +} + static bool goodlabel(struct volhdr *vp, const char **errorp) { @@ -240,9 +330,24 @@ } } -/* - * This takes a new label which is already converted to big endian. - */ +static int +startdisk(const char *disk, int flags) +{ + const char *error; + int fd; + + fd = dkopen(disk, flags); + if (fd == -1) + err(1, "%s (open)", disk); + if (readlabel(fd)) + err(1, "%s (label read)", disk); + if (goodlabel(&label, &error)) + errx(1, "%s (label check): %s", disk, error); + swaplabel(&label); + + return (fd); +} + static void sumlabel(struct volhdr *vp) { @@ -310,7 +415,10 @@ usage(void) { fprintf(stderr, -"usage: fxlabel [-p] disk [...]\n" -"usage: fxlabel [-w] disk [...]\n"); +"usage: fxlabel [-a file] disk [...]\n" +" fxlabel [-d file] disk [...]\n" +" fxlabel [-g file] disk [...]\n" +" fxlabel [-p] disk [...]\n" +" fxlabel [-w] disk [...]\n"); exit(-1); } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message