diff options
Diffstat (limited to 'distrib/common/rdsetroot.c')
-rw-r--r-- | distrib/common/rdsetroot.c | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/distrib/common/rdsetroot.c b/distrib/common/rdsetroot.c index 2650d15eb59..8a62cbfe9de 100644 --- a/distrib/common/rdsetroot.c +++ b/distrib/common/rdsetroot.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rdsetroot.c,v 1.17 2008/12/02 01:54:55 weerd Exp $ */ +/* $OpenBSD: rdsetroot.c,v 1.18 2008/12/02 03:20:38 deraadt Exp $ */ /* $NetBSD: rdsetroot.c,v 1.2 1995/10/13 16:38:39 gwr Exp $ */ /* @@ -71,7 +71,8 @@ int debug; int main(int argc, char *argv[]) { - int ch, fd, n, xflag = 0; + int ch, fd, n, xflag = 0, fsd; + char *fs = NULL; int *ip; while ((ch = getopt(argc, argv, "dx")) != -1) { @@ -89,9 +90,13 @@ main(int argc, char *argv[]) argc -= optind; argv += optind; - if (argc != 1) + if (argc == 1) + file = argv[0]; + else if (argc == 2) { + file = argv[0]; + fs = argv[1]; + } else usage(); - file = argv[0]; fd = open(file, xflag ? O_RDONLY : O_RDWR, 0644); if (fd < 0) { @@ -99,6 +104,22 @@ main(int argc, char *argv[]) exit(1); } + if (fs) { + if (xflag) + fsd = open(fs, O_RDWR | O_CREAT | O_TRUNC, 0644); + else + fsd = open(fs, O_RDONLY, 0644); + } else { + if (xflag) + fsd = dup(STDOUT_FILENO); + else + fsd = dup(STDIN_FILENO); + } + if (fsd < 0) { + perror(fs); + exit(1); + } + n = read(fd, &head, sizeof(head)); if (n < sizeof(head)) { fprintf(stderr, "%s: reading header\n", file); @@ -179,7 +200,7 @@ main(int argc, char *argv[]) fprintf(stderr, "copying root image...\n"); if (xflag) { - n = write(STDOUT_FILENO, dataseg + rd_root_image_off, + n = write(fsd, dataseg + rd_root_image_off, rd_root_size_val); if (n != rd_root_size_val) { perror("write"); @@ -188,7 +209,7 @@ main(int argc, char *argv[]) } else { struct stat sstat; - if (fstat(STDIN_FILENO, &sstat) == -1) { + if (fstat(fsd, &sstat) == -1) { perror("fstat"); exit(1); } @@ -197,7 +218,7 @@ main(int argc, char *argv[]) fprintf(stderr, "ramdisk too small\n"); exit(1); } - n = read(STDIN_FILENO, dataseg + rd_root_image_off, + n = read(fsd, dataseg + rd_root_image_off, rd_root_size_val); if (n < 0) { perror("read"); @@ -270,6 +291,6 @@ usage(void) { extern char *__progname; - fprintf(stderr, "usage: %s [-dx] file_name\n", __progname); + fprintf(stderr, "usage: %s [-dx] bsd [fs]\n", __progname); exit(1); } |