From owner-p4-projects@FreeBSD.ORG Thu Apr 15 23:41:59 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5D76716A4D0; Thu, 15 Apr 2004 23:41:59 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 212C216A4CE for ; Thu, 15 Apr 2004 23:41:59 -0700 (PDT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 02E8843D48 for ; Thu, 15 Apr 2004 23:41:59 -0700 (PDT) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.10/8.12.10) with ESMTP id i3G6fwGe043839 for ; Thu, 15 Apr 2004 23:41:58 -0700 (PDT) (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id i3G6fws3043833 for perforce@freebsd.org; Thu, 15 Apr 2004 23:41:58 -0700 (PDT) (envelope-from marcel@freebsd.org) Date: Thu, 15 Apr 2004 23:41:58 -0700 (PDT) Message-Id: <200404160641.i3G6fws3043833@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marcel@freebsd.org using -f From: Marcel Moolenaar To: Perforce Change Reviews Subject: PERFORCE change 51151 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Apr 2004 06:42:00 -0000 http://perforce.freebsd.org/chv.cgi?CH=51151 Change 51151 by marcel@marcel_nfs on 2004/04/15 23:41:38 Call openpty(3) and add a target remote command to the command file. The kgdb shell now also gets the remote protocol packets. While here, move more code into main. I don't know how best to structure the code yet, but I do know I don't like where it was heading... Time to open a core file with kgdb, pass the kernel to gdb and reply to packets... Affected files ... .. //depot/projects/gdb/usr.bin/kgdb/Makefile#3 edit .. //depot/projects/gdb/usr.bin/kgdb/main.c#4 edit Differences ... ==== //depot/projects/gdb/usr.bin/kgdb/Makefile#3 (text+ko) ==== @@ -2,5 +2,10 @@ PROG= kgdb SRCS= main.c + +DPADD= ${LIBUTIL} +LDADD= -lutil + WARNS?= 4 + .include ==== //depot/projects/gdb/usr.bin/kgdb/main.c#4 (text+ko) ==== @@ -28,6 +28,7 @@ __FBSDID("$FreeBSD$"); #include +#include #include #include #include @@ -37,14 +38,22 @@ #include #include #include +#include #include +#include + int gdb_in, gdb_out; pid_t gdb_pid; char *cmdfile_name; int cmdfile_fd; +char *pty_dev; +int pty_master, pty_slave; + +static const char cmd_set_prompt[] = "set prompt (kgdb) \n"; + static void atexit_unlink_cmdfile(void) { @@ -82,7 +91,7 @@ if (gdb_pid == 0) { if (asprintf(&command, "--command=%s", cmdfile_name) < 0) err(1, "asprintf(3)"); - /* Dup stderr last so that err(3) work as long as possible. */ + /* Dup stderr last so that err(3) works as long as possible. */ if (dup2(in, 0) == -1 || dup2(out, 1) == -1 || dup2(out, 2) == -1) err(1, "dup2(2)"); @@ -95,12 +104,16 @@ close(in); close(out); + close(pty_slave); } -static void -mkcmdfile(void) +int +main(int argc __unused, char *argv[] __unused) { - static const char set_prompt[] = "set prompt (kgdb) "; + char buf[256]; + fd_set rfds, wfds, xfds; + ssize_t sz; + int status; cmdfile_name = strdup("/tmp/kgdb.XXXXXXXX"); if (cmdfile_name == NULL) @@ -109,19 +122,18 @@ if (cmdfile_fd == -1) err(1, "mkstemp(3)"); atexit(atexit_unlink_cmdfile); - if (write(cmdfile_fd, set_prompt, sizeof(set_prompt) - 1) < 0) + + if (write(cmdfile_fd, cmd_set_prompt, sizeof(cmd_set_prompt) - 1) < 0) err(1, "write(2)"); -} + + if (openpty(&pty_master, &pty_slave, buf, NULL, NULL) == -1) + err(1, "openpty(3)"); + pty_dev = strdup(buf); -int -main(int argc __unused, char *argv[] __unused) -{ - char buf[128]; - fd_set rfds, wfds, xfds; - ssize_t sz; - int status; + sz = snprintf(buf, sizeof(buf), "target remote %s\n", pty_dev); + if (write(cmdfile_fd, buf, sz) < 0) + err(1, "write(2)"); - mkcmdfile(); launch_gdb(); while (1) { @@ -130,14 +142,17 @@ FD_ZERO(&xfds); FD_SET(0, &rfds); FD_SET(gdb_out, &rfds); + FD_SET(pty_master, &rfds); FD_SET(gdb_in, &xfds); FD_SET(gdb_out, &xfds); + FD_SET(pty_master, &xfds); if (select(gdb_out + 1, &rfds, &wfds, &xfds, NULL) == -1) { if (errno != EINTR) err(1, "select(2)"); continue; } - if (FD_ISSET(gdb_in, &xfds) || FD_ISSET(gdb_out, &xfds)) + if (FD_ISSET(gdb_in, &xfds) || FD_ISSET(gdb_out, &xfds) || + FD_ISSET(pty_master, &xfds)) break; if (FD_ISSET(0, &rfds)) { sz = read(0, buf, sizeof(buf)); @@ -149,10 +164,19 @@ if (sz > 0) sz = write(1, buf, sz); } + if (FD_ISSET(pty_master, &rfds)) { + sz = read(pty_master, buf, sizeof(buf)); + if (sz > 0) { + buf[sz] = 0; + printf("``%s''\n", buf); + write(pty_master, "+", 1); + } + } } close(gdb_in); close(gdb_out); + close(pty_master); wait4(gdb_pid, &status, 0, NULL); return (WEXITSTATUS(status));