* utils.c (quit): Also call gdb_flush on standard output and error.
[deliverable/binutils-gdb.git] / gdb / energize.c
index eee9a17436e90badd48fa8039d825c0352f64790..afbfb04b0a43cd05c1c5f50cebe874011fa40161 100644 (file)
@@ -24,6 +24,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "bfd.h"
 #include "symfile.h"
 #include "objfiles.h"
+#include "target.h"
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/param.h>
@@ -44,10 +45,17 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <sys/errno.h>
 #include <termios.h>
 #include <string.h>
+#ifdef NCR486
+#include <sys/stropts.h>
+#endif
 
 /* Non-zero means that we're doing the energize interface. */
 int energize = 0;
 
+/* Non-zero means we are reloading breakpoints, etc from the
+   Energize kernel, and we should suppress various messages */
+static int energize_reloading = 0;
+
 /* Connection block for debugger<=>kernel communications. */
 static Connection *conn = 0;
 
@@ -83,6 +91,8 @@ static int command_line_length = 0;
 #define KERNEL_EVENT 1
 #define PTY_EVENT 2
 
+static void execute_command_1();
+
 \f
 /* This routine redirects the output of fputs_filtered to the kernel so that
    the user can see what's going on in his debugger window. */
@@ -144,14 +154,15 @@ pty_to_kernel()
 
       if (cc == 0
          || (cc < 0
-             && errno == EWOULDBLOCK))
+             && (errno == EWOULDBLOCK
+                 || errno == EAGAIN)))
        break;
 
       if (cc < 0)
        {
          close(inferior_pty);
          inferior_pty = -1;
-         perror("pty read error");
+         perror("pty_to_kernel: pty read error");
          break;
        }
 
@@ -179,7 +190,7 @@ kernel_to_pty(data, len)
        {
          close(inferior_pty);
          inferior_pty = -1;
-         perror("pty write error");
+         perror("kernel_to_pty: pty write error");
          return;
        }
       printf("Couldn't write all the data to the pty, wanted %d, got %d\n",
@@ -200,6 +211,9 @@ full_filename(symtab)
   if (symtab->fullname)
     return savestring(symtab->fullname, strlen(symtab->fullname));
 
+  if (symtab->filename[0] == '/')
+    return savestring(symtab->filename, strlen(symtab->filename));
+
   if (symtab->dirname)
     pathlen = strlen(symtab->dirname);
   else
@@ -220,7 +234,7 @@ full_filename(symtab)
 }
 
 /* Tell the energize kernel how high the stack is so that frame numbers (which
-   are relative to the current stack height) make sense.
+   are relative to the current stack height make sense.
 
    Calculate the number of frames on the stack, and the number of subroutine
    invocations that haven't changed since the last call to this routine.  The
@@ -659,8 +673,8 @@ execute_command_1(va_alist)
   va_list args;
 
   va_start(args);
-
   echo = va_arg(args, int);
+
   queue = va_arg(args, int);
   cmd = va_arg(args, char *);
 
@@ -679,7 +693,7 @@ execute_command_1(va_alist)
 }
 
 #ifdef KERNEL_RECORD
-FILE *kerout;
+GDB_FILE *kerout;
 
 static int
 kernel_record(fd, ptr, num)
@@ -741,7 +755,9 @@ breakpoint_notify(b, action)
   char *filename;
   char *included_in_filename = "";
 
-  if (!energize)
+  if (!energize
+      || energize_reloading)   /* Don't notify energize about breakpoint changes, as it's about to send us
+                                  a new bunch.  */
     return;
 
   if (b->type != bp_breakpoint)
@@ -871,62 +887,68 @@ getpty()
   extern char *ptsname();
   int j, i;
   int n, mfd, sfd;
+  struct stat statbuf; 
   struct termios termios;
 
-  /* Number of pseudo-terms is tuneable(16 - 255). System default is 16. */
-  for (i = 0; i < MAX_PTM_TRY; i++)
+  mfd = open("/dev/ptmx", O_RDWR); /* get the master */
+  if (mfd < 0)
+    error ("getpty: can't locate master\n");
+
+  if (grantpt(mfd) < 0)        /* get a slave */
+    error ("getpty: can't acquire slave");
+
+  unlockpt(mfd);
+
+  slavename = ptsname(mfd); /* get the slave device name */
+  if (!slavename)
+    error ("getpty: can't get a pts\n");
+
+  /* Drop controlling tty, become pgrp master */
+
+  if (setpgid(0, getppid()) == -1)
+    perror("setpgid() failed: ");
+
+  if (setsid() == -1)
+    perror("setsid() failed: ");
+
+  sfd = open(slavename, O_RDWR);
+  if (sfd < 0)
     {
-      mfd = open("/dev/ptmx", O_RDWR); /* get the master */
+      close(mfd);
+      error ("getpty: can't open slave\n");
+    }
 
-      if (mfd < 0)
-       continue;
 
-      if (grantpt(mfd) < 0)    /* get a slave */
-       for (j = 0; j < MAX_GRANTPT_TRY; j++)
-         if (grantpt(mfd) == 0 )
-           {
-             close(mfd);
-             continue;
-           }
+  if (ioctl(sfd, I_PUSH, "ptem")) perror ("getpty: ioctl I_PUSH fails");
+  if (ioctl(sfd, I_PUSH, "ldterm")) perror ("getpty: ioctl I_PUSH fails");
 
-      if (unlockpt(mfd) < 0)
-       {                       /* unlock the slave so he can be opened */
-         close(mfd);
-         continue;
-       }
+  /* setup mty for non-blocking I/O. */
 
-      slavename = ptsname(mfd); /* get the slave device name */
-      if (!slavename)
-       {
-         close(mfd);
-         continue;
-       }
+  n = fcntl(mfd, F_GETFL);
+  if (n < 0)
+    perror ("getpty: fcntl F_GETFL failed");
 
-      sfd = open(slavename, O_RDWR);
+  if (fcntl(mfd, F_SETFL, n|O_NDELAY) <0)
+    perror("getpty: fcntl F_SETFL failed");
 
-      if (sfd < 0)
-       {
-         close(mfd);
-         continue;
-       }
+  /* set up for async i/o - V.4 will send SIGPOLL when data available */
 
-      /* setup mty for non-blocking I/O.  Also make it give us a SIGIO
-        when there's data availabe. */
-      n = fcntl(mfd, F_GETFL, 0);
-      fcntl(mfd, F_SETFL, n | O_NDELAY | O_SYNC);
-      fcntl(mfd, F_SETOWN,getpid());
-  
-      tcgetattr(sfd, &termios);
-      termios.c_oflag &= ~OPOST;       /* no post-processing */
-      tcsetattr(sfd, TCSANOW, &termios);
+  if (ioctl (mfd,  I_SETSIG, S_INPUT|S_RDNORM) < 0)
+    perror ("getpty: ioctl I_SETSIG failed");
 
-      inferior_pty=mfd;
-      inferior_tty=sfd;
-      return;
-    }
-  error ("getpty: can't get a pts\n");
+  if (tcgetattr(sfd, &termios))
+    perror("getpty: tcgetattr fails");
+  termios.c_oflag &= ~OPOST;   /* no post-processing */
+  if (tcsetattr(sfd, TCSANOW, &termios))
+    perror("getpty: tcsetattr fails");
+
+  inferior_pty=mfd;
+  inferior_tty=sfd;
+
+  return;
 } 
-#endif
+
+#endif /* NCR486 */
 \f
 /* Examine a protocol packet from the driver. */
 
@@ -1078,7 +1100,7 @@ kernel_dispatch(queue)
          }
          break;
        case StopRType:
-         killpg(pgrp_inferior, SIGINT);
+         kill(-pgrp_inferior, SIGINT);
          break;
        case UserInputRType:
          {
@@ -1095,7 +1117,7 @@ kernel_dispatch(queue)
 
            while (*text == ' ' || *text == '\t') text++;
 
-           if (strcmp(text, "]*[") == 0) /* XXX - What does this mean??? */
+           if (STREQ(text, "]*[")) /* XXX - What does this mean??? */
              break;
 
            if (*text != '\000')
@@ -1256,8 +1278,20 @@ kernel_dispatch(queue)
            switch (req->dynamicLoad.request->action)
              {
              case CDynamicLoadUpdateSymtab:
+               energize_reloading = 1;
+               execute_command_1(1, queue, "set confirm no");
+               execute_command_1(1, queue, "delete");
+/*             execute_command_1(1, queue, "set $bpnum=1");*/ /* Use this to reset breakpoint #s */
                execute_command_1(1, queue, "exec-file %s", filename);
                execute_command_1(1, queue, "symbol-file %s", filename);
+               execute_command_1(1, queue, "set confirm yes");
+               energize_reloading = 0;
+               break;
+             case CDynamicLoadRestoreStart:
+               break;
+             case CDynamicLoadRestoreEnd: /* Not used anymore??? */
+               printf_filtered("\n[Target has changed, automatic restoration of state has been done.]\n");
+               print_prompt();
                break;
              default:
                printf_filtered("DynamicLoadRType: unknown action=%d, filename=%s\n",
@@ -1300,8 +1334,9 @@ wait_for_events(poll)
   do
     {
       FD_SET(kerfd, &readfds);
-      if (inferior_pty > 0)
-       FD_SET(inferior_pty, &readfds);
+
+      FD_SET(inferior_pty, &readfds);
+
       if (poll)
        numfds = select(sizeof(readfds)*8, &readfds, 0, 0, &tv);
       else
@@ -1309,6 +1344,9 @@ wait_for_events(poll)
     }
   while (numfds <= 0 && !poll);
 
+  if (numfds == 0)
+    return 0;
+
   if (FD_ISSET(inferior_pty, &readfds))
     eventmask |= PTY_EVENT;
 
@@ -1428,12 +1466,16 @@ energize_initialize(energize_id, execarg)
 
   /* Setup for I/O interrupts when appropriate. */
 
+  signal(SIGIO, SIG_IGN);
+
+#ifdef NCR486
+  if (ioctl (kerfd,  I_SETSIG, S_INPUT|S_RDNORM) < 0)
+    perror ("getpty: ioctl I_SETSIG failed");
+#else
   n = fcntl(kerfd, F_GETFL, 0);
-#ifdef NCR486...
-  O_SYNC
-#endif
   fcntl(kerfd, F_SETFL, n|FASYNC);
-  fcntl(kerfd, F_SETOWN, getpid());
+  fcntl(kerfd, F_SETOWN, getpid()); 
+#endif
 
   /* Setup connection buffering. */
 
@@ -1473,7 +1515,7 @@ energize_initialize(energize_id, execarg)
 
   req = CWriteTtyRequest (conn, RunningProgramRType);
   req->runningprogram.argc = 8;
-  getwd (pathname);
+  getcwd (pathname, MAXPATHLEN);
   CWriteVstring0 (conn, pathname);
 
   CWriteVstring0 (conn, "0");
@@ -1498,9 +1540,11 @@ energize_initialize(energize_id, execarg)
   /* Tell the rest of the world that Energize is now set up. */
   energize = 1;
 
-  setsid();                    /* Drop controlling tty, become pgrp master */
   getpty();                    /* Setup the pty */
-  dup2(inferior_tty, 0);       /* Attach all GDB I/O to the pty */
+
+  /* Attach all GDB I/O to the pty */
+
+  dup2(inferior_tty, 0);
   dup2(inferior_tty, 1);
   dup2(inferior_tty, 2);
 }
@@ -1532,9 +1576,9 @@ energize_call_command(cmdblk, arg, from_tty)
   else
     (*cmdblk->function.cfunc)(arg, from_tty);
 
-  if (strcmp(cmdblk->name, "up") == 0
-      || strcmp(cmdblk->name, "down") == 0
-      || strcmp(cmdblk->name, "frame") == 0)
+  if (STREQ(cmdblk->name, "up")
+      || STREQ(cmdblk->name, "down")
+      || STREQ(cmdblk->name, "frame"))
     send_location(get_frame_info(selected_frame)->pc,
                  selected_frame_level);
   print_prompt();
@@ -1572,15 +1616,50 @@ energize_wait(status)
      int *status;
 {
   int pid;
+  struct sigaction action;
+  static sigset_t nullsigmask = {0};
+
+  if (!energize)
+    return target_wait(status);
+
+#ifdef NCR486
+  action.sa_handler = iosig;
+  action.sa_mask = nullsigmask;
+  action.sa_flags = SA_RESTART;
+  sigaction(SIGIO, &action, NULL);
+#else
+  signal(SIGIO, iosig);
+#endif
+
+  pid = target_wait(status);
+
+  signal(SIGIO, SIG_IGN);
+  return pid;
+}
+
+int
+energize_shell_wait(status)
+     int *status;
+{
+  int pid;
+  struct sigaction action;
+  static sigset_t nullsigmask = {0};
 
   if (!energize)
     return wait(status);
 
+#ifdef NCR486
+  action.sa_handler = iosig;
+  action.sa_mask = nullsigmask;
+  action.sa_flags = SA_RESTART;
+  sigaction(SIGIO, &action, NULL);
+#else
   signal(SIGIO, iosig);
+#endif
 
   pid = wait(status);
 
-  signal(SIGIO, SIG_DFL);
+  signal(SIGIO, SIG_IGN);
   return pid;
 }
 
This page took 0.029041 seconds and 4 git commands to generate.