From 5f10a19085e8ed5c5397e588549341f005bfaa07 Mon Sep 17 00:00:00 2001 From: Keith Bostic Date: Sat, 18 Jul 1987 04:05:57 -0800 Subject: [PATCH] provide "bad" exit routine; do all processing possible before actually opening target; minor cleanups SCCS-vsn: usr.bin/xinstall/xinstall.c 5.2 --- usr/src/usr.bin/xinstall/xinstall.c | 86 ++++++++++++++++------------- 1 file changed, 47 insertions(+), 39 deletions(-) diff --git a/usr/src/usr.bin/xinstall/xinstall.c b/usr/src/usr.bin/xinstall/xinstall.c index 6a9d102471..43cda1e888 100644 --- a/usr/src/usr.bin/xinstall/xinstall.c +++ b/usr/src/usr.bin/xinstall/xinstall.c @@ -11,7 +11,7 @@ char copyright[] = #endif not lint #ifndef lint -static char sccsid[] = "@(#)xinstall.c 5.1 (Berkeley) %G%"; +static char sccsid[] = "@(#)xinstall.c 5.2 (Berkeley) %G%"; #endif not lint #include @@ -24,13 +24,14 @@ static char sccsid[] = "@(#)xinstall.c 5.1 (Berkeley) %G%"; #include #define YES 1 /* yes/true */ -#define DEF_GROUP "root" /* default group */ -#define DEF_OWNER "staff" /* default owner */ +#define DEF_GROUP "staff" /* default group */ +#define DEF_OWNER "root" /* default owner */ static int docopy, dostrip, mode = 0755; static char *group = DEF_GROUP, - *owner = DEF_OWNER; + *owner = DEF_OWNER, + *path; main(argc, argv) int argc; @@ -43,7 +44,7 @@ main(argc, argv) struct passwd *pp; struct group *gp; int ch; - char *path, pbuf[MAXPATHLEN]; + char pbuf[MAXPATHLEN]; while ((ch = getopt(argc, argv, "cg:m:o:s")) != EOF) switch((char)ch) { @@ -71,6 +72,16 @@ main(argc, argv) if (argc != 2) usage(); + /* get group and owner id's */ + if (!(gp = getgrnam(group))) { + fprintf(stderr, "install: unknown group %s.\n", group); + exit(1); + } + if (!(pp = getpwnam(owner))) { + fprintf(stderr, "install: unknown user %s.\n", owner); + exit(1); + } + /* check source */ if (stat(argv[0], &from_sb)) { fprintf(stderr, "install: fstat: %s: %s\n", argv[0], sys_errlist[errno]); @@ -101,16 +112,6 @@ main(argc, argv) } nocompare: - /* get group and owner id's */ - if (!(gp = getgrnam(group))) { - fprintf(stderr, "install: unknown group %s.\n", group); - exit(1); - } - if (!(pp = getpwnam(owner))) { - fprintf(stderr, "install: unknown user %s.\n", owner); - exit(1); - } - /* open target, set mode, owner, group */ if ((to_fd = open(path, O_CREAT|O_WRONLY|O_TRUNC, 0)) < 0) { fprintf(stderr, "install: %s: %s\n", path, sys_errlist[errno]); @@ -118,13 +119,11 @@ nocompare: } if (fchmod(to_fd, mode)) { fprintf(stderr, "install: fchmod: %s: %s\n", path, sys_errlist[errno]); - (void)unlink(path); - exit(1); + bad(); } if (fchown(to_fd, pp->pw_uid, gp->gr_gid)) { fprintf(stderr, "install: fchown: %s: %s\n", path, sys_errlist[errno]); - (void)unlink(path); - exit(1); + bad(); } if (dostrip) { @@ -156,17 +155,16 @@ copy(from_name, to_fd, to_name) if ((from_fd = open(from_name, O_RDONLY, 0)) < 0) { fprintf(stderr, "install: open: %s: %s\n", from_name, sys_errlist[errno]); - (void)unlink(to_name); - exit(1); + bad(); } while ((n = read(from_fd, buf, sizeof(buf))) > 0) if (write(to_fd, buf, n) != n) { fprintf(stderr, "install: write: %s: %s\n", to_name, sys_errlist[errno]); - (void)unlink(to_name); + bad(); } if (n == -1) { - fprintf(stderr, "install: read: %s: %s\n", to_name, sys_errlist[errno]); - (void)unlink(to_name); + fprintf(stderr, "install: read: %s: %s\n", from_name, sys_errlist[errno]); + bad(); } } @@ -187,13 +185,11 @@ strip(to_fd, from_name, to_name) if ((from_fd = open(from_name, O_RDONLY, 0)) < 0) { fprintf(stderr, "install: open: %s: %s\n", from_name, sys_errlist[errno]); - (void)unlink(to_name); - exit(1); + bad(); } if (read(from_fd, (char *)&head, sizeof(head)) < 0 || N_BADMAG(head)) { fprintf(stderr, "install: %s not in a.out format.\n", from_name); - (void)unlink(to_name); - exit(1); + bad(); } if (head.a_syms || head.a_trsize || head.a_drsize) { size = (long)head.a_text + head.a_data; @@ -202,21 +198,22 @@ strip(to_fd, from_name, to_name) size += getpagesize() - sizeof(EXEC); if (write(to_fd, (char *)&head, sizeof(EXEC)) != sizeof(EXEC)) { fprintf(stderr, "install: write: %s: %s\n", to_name, sys_errlist[errno]); - (void)unlink(to_name); - exit(1); + bad(); } for (; size; size -= n) if ((n = read(from_fd, buf, (int)MIN(size, sizeof(buf)))) <= 0) break; else if (write(to_fd, buf, n) != n) { fprintf(stderr, "install: write: %s: %s\n", to_name, sys_errlist[errno]); - (void)unlink(to_name); - exit(1); + bad(); } + if (size) { + fprintf(stderr, "install: read: %s: premature EOF.\n", from_name); + bad(); + } if (n == -1) { fprintf(stderr, "install: read: %s: %s\n", from_name, sys_errlist[errno]); - (void)unlink(to_name); - exit(1); + bad(); } } } @@ -226,13 +223,13 @@ strip(to_fd, from_name, to_name) * octal string to int */ static -atoo(C) - register char *C; /* argument string */ +atoo(str) + register char *str; { - register int val; /* return value */ + register int val; - for (val = 0; isdigit(*C); ++C) - val = val * 8 + *C - '0'; + for (val = 0; isdigit(*str); ++str) + val = val * 8 + *str - '0'; return(val); } @@ -246,3 +243,14 @@ usage() fputs("usage: install [-cs] [-g group] [-m mode] [-o owner] source destination\n", stderr); exit(1); } + +/* + * bad -- + * remove created target and die + */ +static +bad() +{ + (void)unlink(path); + exit(1); +} -- 2.20.1