[BACK]Return to sendbug.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / sendbug

Diff for /src/usr.bin/sendbug/sendbug.c between version 1.60 and 1.61

version 1.60, 2009/01/28 20:43:24 version 1.61, 2009/06/06 04:46:26
Line 28 
Line 28 
   
 #define _PATH_DMESG "/var/run/dmesg.boot"  #define _PATH_DMESG "/var/run/dmesg.boot"
 #define DMESG_START "OpenBSD "  #define DMESG_START "OpenBSD "
   #define BEGIN64 "begin-base64 "
   #define END64 "===="
   
 int     checkfile(const char *);  int     checkfile(const char *);
   void    debase(void);
 void    dmesg(FILE *);  void    dmesg(FILE *);
 int     editit(const char *);  int     editit(const char *);
   void    hwdump(FILE *);
 void    init(void);  void    init(void);
 int     matchline(const char *, const char *, size_t);  int     matchline(const char *, const char *, size_t);
 int     prompt(void);  int     prompt(void);
Line 52 
Line 56 
   
 struct passwd *pw;  struct passwd *pw;
 char os[BUFSIZ], rel[BUFSIZ], mach[BUFSIZ], details[BUFSIZ];  char os[BUFSIZ], rel[BUFSIZ], mach[BUFSIZ], details[BUFSIZ];
   const char *tmpdir;
 char *fullname, *tmppath;  char *fullname, *tmppath;
 int Dflag, Pflag, wantcleanup;  int Dflag, Pflag, wantcleanup;
   
Line 60 
Line 65 
 {  {
         extern char *__progname;          extern char *__progname;
   
         fprintf(stderr, "usage: %s [-DPV]\n", __progname);          fprintf(stderr, "usage: %s [-DEPV]\n", __progname);
         exit(1);          exit(1);
 }  }
   
Line 76 
Line 81 
 main(int argc, char *argv[])  main(int argc, char *argv[])
 {  {
         int ch, c, fd, ret = 1;          int ch, c, fd, ret = 1;
         const char *tmpdir;  
         struct stat sb;          struct stat sb;
         char *pr_form;          char *pr_form;
         time_t mtime;          time_t mtime;
         FILE *fp;          FILE *fp;
   
         while ((ch = getopt(argc, argv, "DPV")) != -1)          while ((ch = getopt(argc, argv, "DEPV")) != -1)
                 switch (ch) {                  switch (ch) {
                 case 'D':                  case 'D':
                         Dflag = 1;                          Dflag = 1;
                         break;                          break;
                   case 'E':
                           debase();
                           exit(0);
                 case 'P':                  case 'P':
                         Pflag = 1;                          Pflag = 1;
                         break;                          break;
Line 196 
Line 203 
                 return;                  return;
         }          }
   
         fputs("\n"  
             "SENDBUG: dmesg is attached.\n"  
             "SENDBUG: Feel free to delete or use the -D flag if it contains "  
             "sensitive information.\n", fp);  
         /* Find last dmesg. */          /* Find last dmesg. */
         for (;;) {          for (;;) {
                 off_t o;                  off_t o;
Line 577 
Line 580 
         fprintf(fp, ">Fix:\n");          fprintf(fp, ">Fix:\n");
         fprintf(fp, "\t%s\n", comment[4]);          fprintf(fp, "\t%s\n", comment[4]);
   
         if (!Dflag)          if (!Dflag) {
                   int root;
   
                   fprintf(fp, "\n");
                   root = !geteuid();
                   if (!root)
                           fprintf(fp, "SENDBUG: Run sendbug as root "
                               "if this is an ACPI report!\n");
                   fprintf(fp, "SENDBUG: dmesg%s attached.\n"
                       "SENDBUG: Feel free to delete or use the -D flag if it "
                       "contains sensitive information.\n",
                       root ? ", pcidump, and acpidump are" : " is");
                   fputs("\ndmesg:\n", fp);
                 dmesg(fp);                  dmesg(fp);
                   if (root)
                           hwdump(fp);
           }
   }
   
   void
   hwdump(FILE *ofp)
   {
           char buf[BUFSIZ];
           FILE *ifp;
           char *cmd, *acpidir;
           size_t len;
   
           if (gethostname(buf, sizeof(buf)) == -1)
                   err(1, "gethostname");
           buf[strcspn(buf, ".")] = '\0';
   
           if (asprintf(&acpidir, "%s%sp.XXXXXXXXXX", tmpdir,
               tmpdir[strlen(tmpdir) - 1] == '/' ? "" : "/") == -1)
                   err(1, "asprintf");
           if (mkdtemp(acpidir) == NULL)
                   err(1, "mkdtemp");
   
           if (asprintf(&cmd, "echo \"\\npcidump:\"; pcidump -xxv; "
               "echo \"\\nacpidump:\"; cd %s && acpidump -o %s; "
               "for i in *; do b64encode $i $i; done; rm -rf %s",
               acpidir, buf, acpidir) == -1)
                   err(1, "asprintf");
   
           if ((ifp = popen(cmd, "r")) != NULL) {
                   while (!feof(ifp)) {
                           len = fread(buf, 1, sizeof buf, ifp);
                           if (len == 0)
                                   break;
                           if (fwrite(buf, 1, len, ofp) != len)
                                   break;
                   }
                   pclose(ofp);
           }
           free(cmd);
   }
   
   void
   debase(void)
   {
           char buf[BUFSIZ];
           FILE *fp = NULL;
           size_t len;
   
           while (fgets(buf, sizeof(buf), stdin) != NULL) {
                   len = strlen(buf);
                   if (!strncmp(buf, BEGIN64, sizeof(BEGIN64) - 1)) {
                           if (fp)
                                   errx(1, "double begin");
                           fp = popen("b64decode", "w");
                           if (!fp)
                                   errx(1, "popen b64decode");
                   }
                   if (fp && fwrite(buf, 1, len, fp) != len)
                           errx(1, "pipe error");
                   if (!strncmp(buf, END64, sizeof(END64) - 1)) {
                           if (pclose(fp) == -1)
                                   errx(1, "pclose b64decode");
                           fp = NULL;
                   }
           }
 }  }

Legend:
Removed from v.1.60  
changed lines
  Added in v.1.61