=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/sendbug/sendbug.c,v retrieving revision 1.11 retrieving revision 1.12 diff -c -r1.11 -r1.12 *** src/usr.bin/sendbug/sendbug.c 2007/03/23 03:43:46 1.11 --- src/usr.bin/sendbug/sendbug.c 2007/03/23 05:08:03 1.12 *************** *** 1,4 **** ! /* $OpenBSD: sendbug.c,v 1.11 2007/03/23 03:43:46 deraadt Exp $ */ /* * Written by Ray Lai . --- 1,4 ---- ! /* $OpenBSD: sendbug.c,v 1.12 2007/03/23 05:08:03 tedu Exp $ */ /* * Written by Ray Lai . *************** *** 25,31 **** #include "atomicio.h" ! int init(void); int prompt(void); int send_file(const char *, int dst); int sendmail(const char *); --- 25,31 ---- #include "atomicio.h" ! void init(void); int prompt(void); int send_file(const char *, int dst); int sendmail(const char *); *************** *** 38,55 **** struct passwd *pw; char os[BUFSIZ], rel[BUFSIZ], mach[BUFSIZ]; char *fullname; ! void usage(void) { fprintf(stderr, "usage: sendbug [-LPV]\n"); } int main(int argc, char *argv[]) { const char *editor, *tmpdir; ! char *argp[] = {"sh", "-c", NULL, NULL}, *tmppath = NULL, *pr_form; int ch, c, fd, ret = 1; struct stat sb; time_t mtime; --- 38,66 ---- struct passwd *pw; char os[BUFSIZ], rel[BUFSIZ], mach[BUFSIZ]; char *fullname; + char *tmppath; + int wantcleanup; ! __dead void usage(void) { fprintf(stderr, "usage: sendbug [-LPV]\n"); + exit(1); } + void + cleanup() + { + if (wantcleanup && tmppath && unlink(tmppath) == -1) + warn("unlink"); + } + + int main(int argc, char *argv[]) { const char *editor, *tmpdir; ! char *argp[] = {"sh", "-c", NULL, NULL}, *pr_form; int ch, c, fd, ret = 1; struct stat sb; time_t mtime; *************** *** 62,69 **** printf("%s\n\n", categories); exit(0); case 'P': ! if (init() == -1) ! exit(1); template(stdout); exit(0); case 'V': --- 73,79 ---- printf("%s\n\n", categories); exit(0); case 'P': ! init(); template(stdout); exit(0); case 'V': *************** *** 71,100 **** exit(0); default: usage(); - exit(1); } if (argc > 1) { usage(); - exit(1); } if ((tmpdir = getenv("TMPDIR")) == NULL || tmpdir[0] == '\0') tmpdir = _PATH_TMP; if (asprintf(&tmppath, "%s%sp.XXXXXXXXXX", tmpdir, tmpdir[strlen(tmpdir) - 1] == '/' ? "" : "/") == -1) { ! warn("asprintf"); ! goto quit; } if ((fd = mkstemp(tmppath)) == -1) err(1, "mkstemp"); if ((fp = fdopen(fd, "w+")) == NULL) { ! warn("fdopen"); ! goto cleanup; } ! if (init() == -1) ! goto cleanup; pr_form = getenv("PR_FORM"); if (pr_form) { --- 81,107 ---- exit(0); default: usage(); } if (argc > 1) { usage(); } if ((tmpdir = getenv("TMPDIR")) == NULL || tmpdir[0] == '\0') tmpdir = _PATH_TMP; if (asprintf(&tmppath, "%s%sp.XXXXXXXXXX", tmpdir, tmpdir[strlen(tmpdir) - 1] == '/' ? "" : "/") == -1) { ! err(1, "asprintf"); } if ((fd = mkstemp(tmppath)) == -1) err(1, "mkstemp"); + wantcleanup = 1; + atexit(cleanup); if ((fp = fdopen(fd, "w+")) == NULL) { ! err(1, "fdopen"); } ! init(); pr_form = getenv("PR_FORM"); if (pr_form) { *************** *** 122,129 **** template(fp); if (fflush(fp) == EOF || fstat(fd, &sb) == -1 || fclose(fp) == EOF) { ! warn("error creating template"); ! goto cleanup; } mtime = sb.st_mtime; --- 129,135 ---- template(fp); if (fflush(fp) == EOF || fstat(fd, &sb) == -1 || fclose(fp) == EOF) { ! err(1, "error creating template"); } mtime = sb.st_mtime; *************** *** 132,140 **** editor = "vi"; switch (fork()) { case -1: ! warn("fork"); ! goto cleanup; case 0: if (asprintf(&argp[2], "%s %s", editor, tmppath) == -1) err(1, "asprintf"); execv(_PATH_BSHELL, argp); --- 138,146 ---- editor = "vi"; switch (fork()) { case -1: ! err(1, "fork"); case 0: + wantcleanup = 0; if (asprintf(&argp[2], "%s %s", editor, tmppath) == -1) err(1, "asprintf"); execv(_PATH_BSHELL, argp); *************** *** 145,156 **** } if (stat(tmppath, &sb) == -1) { ! warn("stat"); ! goto cleanup; } if (mtime == sb.st_mtime) { ! warnx("report unchanged, nothing sent"); ! goto cleanup; } prompt: --- 151,160 ---- } if (stat(tmppath, &sb) == -1) { ! err(1, "stat"); } if (mtime == sb.st_mtime) { ! errx(1, "report unchanged, nothing sent"); } prompt: *************** *** 158,165 **** switch (c) { case 'a': case EOF: ! warnx("unsent report in %s", tmppath); ! goto quit; case 'e': goto edit; case 's': --- 162,169 ---- switch (c) { case 'a': case EOF: ! wantcleanup = 0; ! errx(1, "unsent report in %s", tmppath); case 'e': goto edit; case 's': *************** *** 171,185 **** } ret = 0; ! ! cleanup: ! if (tmppath && unlink(tmppath) == -1) ! warn("unlink"); ! ! quit: return (ret); } int prompt(void) { --- 175,185 ---- } ret = 0; ! quit: return (ret); } + int prompt(void) { *************** *** 239,260 **** return (0); } ! int init(void) { size_t len; int sysname[2]; if ((pw = getpwuid(getuid())) == NULL) { ! warn("getpwuid"); ! return (-1); } /* Get full name. */ len = strcspn(pw->pw_gecos, ","); if ((fullname = malloc(len + 1)) == NULL) { ! warn("malloc"); ! return (-1); } memcpy(fullname, pw->pw_gecos, len); fullname[len] = '\0'; --- 239,258 ---- return (0); } ! void init(void) { size_t len; int sysname[2]; if ((pw = getpwuid(getuid())) == NULL) { ! err(1, "getpwuid"); } /* Get full name. */ len = strcspn(pw->pw_gecos, ","); if ((fullname = malloc(len + 1)) == NULL) { ! err(1, "malloc"); } memcpy(fullname, pw->pw_gecos, len); fullname[len] = '\0'; *************** *** 263,289 **** sysname[1] = KERN_OSTYPE; len = sizeof(os) - 1; if (sysctl(sysname, 2, &os, &len, NULL, 0) == -1) { ! warn("sysctl"); ! return (-1); } sysname[0] = CTL_KERN; sysname[1] = KERN_OSRELEASE; len = sizeof(rel) - 1; if (sysctl(sysname, 2, &rel, &len, NULL, 0) == -1) { ! warn("sysctl"); ! return (-1); } sysname[0] = CTL_HW; sysname[1] = HW_MACHINE; len = sizeof(mach) - 1; if (sysctl(sysname, 2, &mach, &len, NULL, 0) == -1) { ! warn("sysctl"); ! return (-1); } - return (0); } int --- 261,283 ---- sysname[1] = KERN_OSTYPE; len = sizeof(os) - 1; if (sysctl(sysname, 2, &os, &len, NULL, 0) == -1) { ! err(1, "sysctl"); } sysname[0] = CTL_KERN; sysname[1] = KERN_OSRELEASE; len = sizeof(rel) - 1; if (sysctl(sysname, 2, &rel, &len, NULL, 0) == -1) { ! err(1, "sysctl"); } sysname[0] = CTL_HW; sysname[1] = HW_MACHINE; len = sizeof(mach) - 1; if (sysctl(sysname, 2, &mach, &len, NULL, 0) == -1) { ! err(1, "sysctl"); } } int