diff options
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/sendbug/sendbug.c | 72 |
1 files changed, 47 insertions, 25 deletions
diff --git a/usr.bin/sendbug/sendbug.c b/usr.bin/sendbug/sendbug.c index 13da73fad85..4f476fdcb9f 100644 --- a/usr.bin/sendbug/sendbug.c +++ b/usr.bin/sendbug/sendbug.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sendbug.c,v 1.35 2007/04/06 01:32:39 ray Exp $ */ +/* $OpenBSD: sendbug.c,v 1.36 2007/04/06 03:24:08 ray Exp $ */ /* * Written by Ray Lai <ray@cyth.net>. @@ -29,6 +29,7 @@ #define _PATH_DMESG "/var/run/dmesg.boot" +void dmesg(FILE *); int editit(char *); void init(void); int prompt(void); @@ -133,30 +134,8 @@ main(int argc, char *argv[]) } } else { template(fp); - if (!Dflag) { - char buf[BUFSIZ]; - size_t len; - FILE *dfp; - - dfp = fopen(_PATH_DMESG, "r"); - if (dfp == NULL) { - warn("can't read dmesg"); - } else { - fputs("\n" - "<dmesg is attached.>\n" - "<Feel free to delete or use the -D" - " flag if it contains sensitive " - "information.>\n", fp); - while (!feof(dfp)) { - len = fread(buf, 1, sizeof buf, dfp); - if (len == 0) - break; - if (fwrite(buf, 1, len, fp) != len) - break; - } - fclose(dfp); - } - } + if (!Dflag) + dmesg(fp); } if (fflush(fp) == EOF || fstat(fd, &sb) == -1 || fclose(fp) == EOF) @@ -194,6 +173,49 @@ quit: return (ret); } +void +dmesg(FILE *fp) +{ + char buf[BUFSIZ]; + FILE *dfp; + off_t offset = -1; + + dfp = fopen(_PATH_DMESG, "r"); + if (dfp == NULL) { + warn("can't read dmesg"); + return; + } + + fputs("\n" + "<dmesg is attached.>\n" + "<Feel free to delete or use the -D flag if it contains " + "sensitive information.>\n", fp); + /* Find last line starting with "OpenBSD". */ + for (;;) { + off_t o; + + o = ftello(dfp); + if (fgets(buf, sizeof(buf), dfp) == NULL) + break; + if (!strncmp("OpenBSD ", buf, sizeof("OpenBSD ") - 1)) + offset = o; + } + if (offset != -1) { + size_t len; + + clearerr(dfp); + fseeko(dfp, offset, SEEK_SET); + while (offset != -1 && !feof(dfp)) { + len = fread(buf, 1, sizeof buf, dfp); + if (len == 0) + break; + if (fwrite(buf, 1, len, fp) != len) + break; + } + } + fclose(dfp); +} + int editit(char *tmpfile) { |