kgdb: Add TUI mode as an option
[dragonfly.git] / gnu / usr.bin / gdb / kgdb / kgdb.c
index 77ad5c5..48fa27a 100644 (file)
@@ -83,7 +83,7 @@ usage(void)
 {
 
        fprintf(stderr,
-           "usage: %s [-afqv] [-d crashdir] [-c core | -n dumpnr | -r device]\n"
+           "usage: %s [-afqtv] [-d crashdir] [-c core | -n dumpnr | -r device]\n"
            "\t[kernel [core]]\n", getprogname());
        exit(1);
 }
@@ -99,18 +99,18 @@ kernel_from_dumpnr(int nr)
 
        /*
         * If there's a kernel image right here in the crash directory, then
-        * use it.  The kernel image is either called kernel.<nr> or is in a
-        * subdirectory kernel.<nr> and called kernel.  The latter allows us
+        * use it.  The kernel image is either called kern.<nr> or is in a
+        * subdirectory kern.<nr> and called kernel.  The latter allows us
         * to collect the modules in the same place.
         */
-       snprintf(path, sizeof(path), "%s/kernel.%d", crashdir, nr);
+       snprintf(path, sizeof(path), "%s/kern.%d", crashdir, nr);
        if (stat(path, &st) == 0) {
                if (S_ISREG(st.st_mode)) {
                        kernel = strdup(path);
                        return;
                }
                if (S_ISDIR(st.st_mode)) {
-                       snprintf(path, sizeof(path), "%s/kernel.%d/kernel",
+                       snprintf(path, sizeof(path), "%s/kern.%d/kernel",
                            crashdir, nr);
                        if (stat(path, &st) == 0 && S_ISREG(st.st_mode)) {
                                kernel = strdup(path);
@@ -129,7 +129,7 @@ kernel_from_dumpnr(int nr)
        snprintf(path, sizeof(path), "%s/info.%d", crashdir, nr);
        info = fopen(path, "r");
        if (info == NULL) {
-               warn(path);
+               warn("%s", path);
                return;
        }
        while (fgets(path, sizeof(path), info) != NULL) {
@@ -226,11 +226,13 @@ kgdb_dmesg(void)
                return;
        bufp = kgdb_parse("msgbufp->msg_ptr");
        size = (int)kgdb_parse("msgbufp->msg_size");
+       if (bufp == 0 || size == 0)
+               return;
        rseq = (int)kgdb_parse("msgbufp->msg_bufr");
        wseq = (int)kgdb_parse("msgbufp->msg_bufx");
        rseq = MSGBUF_SEQ_TO_POS(size, rseq);
        wseq = MSGBUF_SEQ_TO_POS(size, wseq);
-       if (bufp == 0 || size == 0 || rseq == wseq)
+       if (rseq == wseq)
                return;
 
        printf("\nUnread portion of the kernel message buffer:\n");
@@ -324,6 +326,8 @@ main(int argc, char *argv[])
                                argv[a] = "-q";
                        else if (strcmp(s, "fullname") == 0)
                                argv[a] = "-f";
+                       else if (strcmp(s, "tui-mode") == 0)
+                               argv[a] = "-t";
                }
        }
 
@@ -333,8 +337,9 @@ main(int argc, char *argv[])
        args.interpreter_p = INTERP_CONSOLE;
        args.argv = malloc(sizeof(char *));
        args.argv[0] = argv[0];
+       add_arg(&args, "--kernel");
 
-       while ((ch = getopt(argc, argv, "ac:d:fn:qr:vw")) != -1) {
+       while ((ch = getopt(argc, argv, "ac:d:fn:qr:tvw")) != -1) {
                switch (ch) {
                case 'a':
                        annotation_level++;
@@ -376,6 +381,12 @@ main(int argc, char *argv[])
                        }
                        remote = strdup(optarg);
                        break;
+               case 't':
+                       args.interpreter_p = INTERP_TUI;
+                       add_arg(&args, "-tui");
+                       quiet = 1;
+                       add_arg(&args, "-q");
+                       break;
                case 'v':       /* increase verbosity. */
                        verbose++;
                        break;
@@ -409,7 +420,7 @@ main(int argc, char *argv[])
        if (dumpnr >= 0) {
                snprintf(path, sizeof(path), "%s/vmcore.%d", crashdir, dumpnr);
                if (stat(path, &st) == -1)
-                       err(1, path);
+                       err(1, "%s", path);
                if (!S_ISREG(st.st_mode))
                        errx(1, "%s: not a regular file", path);
                vmcore = strdup(path);