1/*--------------------------------------------------------------------*/
2/*--- Relay between gdb and gdbserver embedded in valgrind  vgdb.c ---*/
3/*--------------------------------------------------------------------*/
4
5/*
6   This file is part of Valgrind, a dynamic binary instrumentation
7   framework.
8
9   Copyright (C) 2011-2013 Philippe Waroquiers
10
11   This program is free software; you can redistribute it and/or
12   modify it under the terms of the GNU General Public License as
13   published by the Free Software Foundation; either version 2 of the
14   License, or (at your option) any later version.
15
16   This program is distributed in the hope that it will be useful, but
17   WITHOUT ANY WARRANTY; without even the implied warranty of
18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19   General Public License for more details.
20
21   You should have received a copy of the GNU General Public License
22   along with this program; if not, write to the Free Software
23   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24   02111-1307, USA.
25
26   The GNU General Public License is contained in the file COPYING.
27*/
28
29#include "vgdb.h"
30
31#include "config.h"
32
33#include <assert.h>
34#include <dirent.h>
35#include <errno.h>
36#include <fcntl.h>
37#include <limits.h>
38#include <poll.h>
39#include <pthread.h>
40#include <signal.h>
41#include <stdlib.h>
42#include <stdio.h>
43#include <string.h>
44#include <unistd.h>
45#include <netinet/in.h>
46#include <sys/mman.h>
47#include <sys/socket.h>
48#include <sys/stat.h>
49#include <sys/time.h>
50
51/* vgdb has two usages:
52   1. relay application between gdb and the gdbserver embedded in valgrind.
53   2. standalone to send monitor commands to a running valgrind-ified process
54
55   It is made of a main program which reads arguments.  If no
56   arguments are given or only --pid and --vgdb-prefix, then usage 1 is
57   assumed.
58
59   As relay application, vgdb reads bytes from gdb on stdin and
60   writes these bytes to valgrind.  Bytes read from valgrind are
61   written to gdb on stdout.  Read/Write from/to valgrind is done
62   using FIFOs.  There is one thread reading from stdin, writing to
63   valgrind on a FIFO.  There is one thread reading from valgrind on a
64   FIFO, writing to gdb on stdout
65
66   As a standalone utility, vgdb builds command packets to write to valgrind,
67   sends it and reads the reply. The same two threads are used to write/read.
68   Once all the commands are sent and their replies received, vgdb will exit.
69*/
70
71int debuglevel;
72struct timeval dbgtv;
73static char *vgdb_prefix = NULL;
74
75/* Will be set to True when any condition indicating we have to shutdown
76   is encountered. */
77Bool shutting_down = False;
78
79VgdbShared32 *shared32;
80VgdbShared64 *shared64;
81#define VS_written_by_vgdb (shared32 != NULL ?        \
82                            shared32->written_by_vgdb \
83                            : shared64->written_by_vgdb)
84#define VS_seen_by_valgrind (shared32 != NULL ?         \
85                             shared32->seen_by_valgrind \
86                             : shared64->seen_by_valgrind)
87
88#define VS_vgdb_pid (shared32 != NULL ? shared32->vgdb_pid : shared64->vgdb_pid)
89
90void *vmalloc(size_t size)
91{
92   void * mem = malloc(size);
93   if (mem == NULL)
94      XERROR (errno, "can't allocate memory\n");
95   return mem;
96}
97
98void *vrealloc(void *ptr,size_t size)
99{
100   void * mem = realloc(ptr, size);
101   if (mem == NULL)
102      XERROR (errno, "can't reallocate memory\n");
103   return mem;
104}
105
106/* Return the name of a directory for temporary files. */
107static
108const char *vgdb_tmpdir(void)
109{
110   const char *tmpdir;
111
112   tmpdir = getenv("TMPDIR");
113   if (tmpdir == NULL || *tmpdir == '\0')
114     tmpdir = VG_TMPDIR;
115   if (tmpdir == NULL || *tmpdir == '\0')
116     tmpdir = "/tmp";    /* fallback */
117
118   return tmpdir;
119}
120
121/* Return the default path prefix for the named pipes (FIFOs) used by vgdb/gdb
122   to communicate with valgrind */
123static
124char *vgdb_prefix_default(void)
125{
126   static HChar *prefix;
127
128   if (prefix == NULL) {
129      const char *tmpdir = vgdb_tmpdir();
130      prefix = vmalloc(strlen(tmpdir) + strlen("/vgdb-pipe") + 1);
131      strcpy(prefix, tmpdir);
132      strcat(prefix, "/vgdb-pipe");
133   }
134   return prefix;
135}
136
137/* add nrw to the written_by_vgdb field of shared32 or shared64 */
138static
139void add_written(int nrw)
140{
141   if (shared32 != NULL)
142      shared32->written_by_vgdb += nrw;
143   else if (shared64 != NULL)
144      shared64->written_by_vgdb += nrw;
145   else
146      assert(0);
147}
148
149static int shared_mem_fd = -1;
150static
151void map_vgdbshared (char* shared_mem)
152{
153   struct stat fdstat;
154   void **s;
155   shared_mem_fd = open(shared_mem, O_RDWR);
156   /* shared_mem_fd will not be closed till vgdb exits. */
157
158   if (shared_mem_fd == -1)
159      XERROR (errno, "error opening %s shared memory file\n", shared_mem);
160
161   if (fstat(shared_mem_fd, &fdstat) != 0)
162      XERROR (errno, "fstat");
163
164   if (fdstat.st_size == sizeof(VgdbShared64))
165      s = (void*) &shared64;
166   else if (fdstat.st_size == sizeof(VgdbShared32))
167      s = (void*) &shared32;
168   else
169#if VEX_HOST_WORDSIZE == 8
170      XERROR (0,
171              "error size shared memory file %s.\n"
172              "expecting size %d (64bits) or %d (32bits) got %ld.\n",
173              shared_mem,
174              (int) sizeof(VgdbShared64), (int) sizeof(VgdbShared32),
175              (long int)fdstat.st_size);
176#elif VEX_HOST_WORDSIZE == 4
177      XERROR (0,
178              "error size shared memory file %s.\n"
179              "expecting size %d (32bits) got %ld.\n",
180              shared_mem,
181              (int) sizeof(VgdbShared32),
182              fdstat.st_size);
183#else
184# error "unexpected wordsize"
185#endif
186
187#if VEX_HOST_WORDSIZE == 4
188   if (shared64 != NULL)
189      XERROR (0, "cannot use 32 bits vgdb with a 64bits valgrind process\n");
190   /* But we can use a 64 bits vgdb with a 32 bits valgrind */
191#endif
192
193   *s = (void*) mmap (NULL, fdstat.st_size,
194                      PROT_READ|PROT_WRITE, MAP_SHARED,
195                      shared_mem_fd, 0);
196
197   if (*s == (void *) -1)
198      XERROR (errno, "error mmap shared memory file %s\n", shared_mem);
199
200}
201
202/* This function loops till shutting_down becomes true.  In this loop,
203   it verifies if valgrind process is reading the characters written
204   by vgdb.  The verification is done every max_invoke_ms ms.  If
205   valgrind is not reading characters, it will use invoker_invoke_gdbserver
206   to ensure that the gdbserver code is called soon by valgrind. */
207static int max_invoke_ms = 100;
208#define NEVER 99999999
209static int cmd_time_out = NEVER;
210static
211void *invoke_gdbserver_in_valgrind(void *v_pid)
212{
213   struct timeval cmd_max_end_time;
214   Bool cmd_started = False;
215   struct timeval invoke_time;
216
217   int pid = *(int *)v_pid;
218   int written_by_vgdb_before_sleep;
219   int seen_by_valgrind_before_sleep;
220
221   int invoked_written = -1;
222   unsigned int usecs;
223
224   pthread_cleanup_push(invoker_cleanup_restore_and_detach, v_pid);
225
226   while (!shutting_down) {
227      written_by_vgdb_before_sleep = VS_written_by_vgdb;
228      seen_by_valgrind_before_sleep = VS_seen_by_valgrind;
229      DEBUG(3,
230            "written_by_vgdb_before_sleep %d "
231            "seen_by_valgrind_before_sleep %d\n",
232            written_by_vgdb_before_sleep,
233            seen_by_valgrind_before_sleep);
234      if (cmd_time_out != NEVER
235          && !cmd_started
236          && written_by_vgdb_before_sleep > seen_by_valgrind_before_sleep) {
237         /* A command was started. Record the time at which it was started. */
238         DEBUG(1, "IO for command started\n");
239         gettimeofday(&cmd_max_end_time, NULL);
240         cmd_max_end_time.tv_sec += cmd_time_out;
241         cmd_started = True;
242      }
243      if (max_invoke_ms > 0) {
244         usecs = 1000 * max_invoke_ms;
245         gettimeofday(&invoke_time, NULL);
246         invoke_time.tv_sec += max_invoke_ms / 1000;
247         invoke_time.tv_usec += 1000 * (max_invoke_ms % 1000);
248         invoke_time.tv_sec += invoke_time.tv_usec / (1000 * 1000);
249         invoke_time.tv_usec = invoke_time.tv_usec % (1000 * 1000);
250      } else {
251         usecs = 0;
252      }
253      if (cmd_started) {
254         // 0 usecs here means the thread just has to check gdbserver eats
255         // the characters in <= cmd_time_out seconds.
256         // We will just wait by 1 second max at a time.
257         if (usecs == 0 || usecs > 1000 * 1000)
258            usecs = 1000 * 1000;
259      }
260      usleep(usecs);
261
262      /* If nothing happened during our sleep, let's try to wake up valgrind
263         or check for cmd time out. */
264      if (written_by_vgdb_before_sleep == VS_written_by_vgdb
265          && seen_by_valgrind_before_sleep == VS_seen_by_valgrind
266          && VS_written_by_vgdb > VS_seen_by_valgrind) {
267         struct timeval now;
268         gettimeofday(&now, NULL);
269         DEBUG(2,
270               "after sleep "
271               "written_by_vgdb %d "
272               "seen_by_valgrind %d "
273               "invoked_written %d\n",
274               VS_written_by_vgdb,
275               VS_seen_by_valgrind,
276               invoked_written);
277         /* if the pid does not exist anymore, we better stop */
278         if (kill(pid, 0) != 0)
279           XERROR (errno,
280                   "invoke_gdbserver_in_valgrind: "
281                   "check for pid %d existence failed\n", pid);
282         if (cmd_started) {
283            if (timercmp (&now, &cmd_max_end_time, >))
284               XERROR (0,
285                       "pid %d did not handle a command in %d seconds\n",
286                       pid, cmd_time_out);
287         }
288         if (max_invoke_ms > 0 && timercmp (&now, &invoke_time, >=)) {
289            /* only need to wake up if the nr written has changed since
290               last invoke. */
291            if (invoked_written != written_by_vgdb_before_sleep) {
292               if (invoker_invoke_gdbserver(pid)) {
293                  /* If invoke succesful, no need to invoke again
294                     for the same value of written_by_vgdb_before_sleep. */
295                  invoked_written = written_by_vgdb_before_sleep;
296               }
297            }
298         }
299      } else {
300         // Something happened => restart timer check.
301         if (cmd_time_out != NEVER) {
302            DEBUG(2, "some IO was done => restart command\n");
303            cmd_started = False;
304         }
305      }
306   }
307   pthread_cleanup_pop(0);
308   return NULL;
309}
310
311static
312int open_fifo (const char* name, int flags, const char* desc)
313{
314   int fd;
315   DEBUG(1, "opening %s %s\n", name, desc);
316   fd = open(name, flags);
317   if (fd == -1)
318      XERROR (errno, "error opening %s %s\n", name, desc);
319
320   DEBUG(1, "opened %s %s fd %d\n", name, desc, fd);
321   return fd;
322}
323
324/* acquire a lock on the first byte of the given fd. If not successful,
325   exits with error.
326   This allows to avoid having two vgdb speaking with the same Valgrind
327   gdbserver as this causes serious headaches to the protocol. */
328static
329void acquire_lock (int fd, int valgrind_pid)
330{
331   struct flock fl;
332   fl.l_type = F_WRLCK;
333   fl.l_whence = SEEK_SET;
334   fl.l_start = 0;
335   fl.l_len = 1;
336   if (fcntl(fd, F_SETLK, &fl) < 0) {
337      if (errno == EAGAIN || errno == EACCES) {
338         XERROR(errno,
339                "Cannot acquire lock.\n"
340                "Probably vgdb pid %d already speaks with Valgrind pid %d\n",
341                VS_vgdb_pid,
342                valgrind_pid);
343      } else {
344         XERROR(errno, "cannot acquire lock.\n");
345      }
346   }
347
348   /* Here, we have the lock. It will be released when fd will be closed. */
349   /* We indicate our pid to Valgrind gdbserver */
350   if (shared32 != NULL)
351      shared32->vgdb_pid = getpid();
352   else if (shared64 != NULL)
353      shared64->vgdb_pid = getpid();
354   else
355      assert(0);
356}
357
358#define PBUFSIZ 16384 /* keep in sync with server.h */
359
360/* read some characters from fd.
361   Returns the nr of characters read, -1 if error.
362   desc is a string used in tracing */
363static
364int read_buf (int fd, char* buf, const char* desc)
365{
366   int nrread;
367   DEBUG(2, "reading %s\n", desc);
368   nrread = read(fd, buf, PBUFSIZ);
369   if (nrread == -1) {
370      ERROR (errno, "error reading %s\n", desc);
371      return -1;
372   }
373   buf[nrread] = '\0';
374   DEBUG(2, "read %s %s\n", desc, buf);
375   return nrread;
376}
377
378/* write size bytes from buf to fd.
379   desc is a description of the action for which the write is done.
380   If notify, then add size to the shared cntr indicating to the
381   valgrind process that there is new data.
382   Returns True if write is ok, False if there was a problem. */
383static
384Bool write_buf(int fd, char* buf, int size, const char* desc, Bool notify)
385{
386   int nrwritten;
387   int nrw;
388   DEBUG(2, "writing %s len %d %.*s notify: %d\n", desc, size,
389         size, buf, notify);
390   nrwritten = 0;
391   while (nrwritten < size) {
392      nrw = write (fd, buf+nrwritten, size - nrwritten);
393      if (nrw == -1) {
394         ERROR(errno, "error write %s\n", desc);
395         return False;
396      }
397      nrwritten = nrwritten + nrw;
398      if (notify)
399         add_written(nrw);
400   }
401   return True;
402}
403
404typedef enum {
405   FROM_GDB,
406   TO_GDB,
407   FROM_PID,
408   TO_PID } ConnectionKind;
409static const int NumConnectionKind = TO_PID+1;
410static
411const char *ppConnectionKind (ConnectionKind con)
412{
413   switch (con) {
414   case FROM_GDB: return "FROM_GDB";
415   case TO_GDB:   return "TO_GDB";
416   case FROM_PID: return "FROM_PID";
417   case TO_PID:   return "TO_PID";
418   default:       return "invalid connection kind";
419   }
420}
421
422static char *shared_mem;
423
424static int from_gdb = 0; /* stdin by default, changed if --port is given. */
425static char *from_gdb_to_pid; /* fifo name to write gdb command to pid */
426/* Returns True in case read/write operations were done properly.
427   Returns False in case of error.
428   to_pid is the file descriptor to write to the process pid. */
429static
430Bool read_from_gdb_write_to_pid(int to_pid)
431{
432   char buf[PBUFSIZ+1]; // +1 for trailing \0
433   int nrread;
434
435   nrread = read_buf(from_gdb, buf, "from gdb on stdin");
436   if (nrread <= 0) {
437      if (nrread == 0)
438         DEBUG(1, "read 0 bytes from gdb => assume exit\n");
439      else
440         DEBUG(1, "error reading bytes from gdb\n");
441      close (from_gdb);
442      shutting_down = True;
443      return False;
444   }
445   return write_buf(to_pid, buf, nrread, "to_pid", /* notify */ True);
446}
447
448static int to_gdb = 1; /* stdout by default, changed if --port is given. */
449static char *to_gdb_from_pid; /* fifo name to read pid replies */
450/* Returns True in case read/write operations were done properly.
451   Returns False in case of error.
452   from_pid is the file descriptor to read data from the process pid. */
453static
454Bool read_from_pid_write_to_gdb(int from_pid)
455{
456   char buf[PBUFSIZ+1]; // +1 for trailing \0
457   int nrread;
458
459   nrread = read_buf(from_pid, buf, "from pid");
460   if (nrread <= 0) {
461      if (nrread == 0)
462         DEBUG(1, "read 0 bytes from pid => assume exit\n");
463      else
464         DEBUG(1, "error reading bytes from pid\n");
465      close (from_pid);
466      shutting_down = True;
467      return False;
468   }
469   return write_buf(to_gdb, buf, nrread, "to_gdb", /* notify */ False);
470}
471
472static
473void wait_for_gdb_connect (int in_port)
474{
475   struct sockaddr_in addr;
476
477   int listen_gdb = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
478   int gdb_connect;
479
480   if (-1 == listen_gdb) {
481      XERROR(errno, "cannot create socket");
482   }
483
484    memset(&addr, 0, sizeof(addr));
485
486    addr.sin_family = AF_INET;
487    addr.sin_port = htons((unsigned short int)in_port);
488    addr.sin_addr.s_addr = INADDR_ANY;
489
490    if (-1 == bind(listen_gdb,(struct sockaddr *)&addr, sizeof(addr))) {
491      XERROR(errno, "bind failed");
492    }
493    fprintf(stderr, "listening on port %d ...", in_port);
494    fflush(stderr);
495    if (-1 == listen(listen_gdb, 1)) {
496      XERROR(errno, "error listen failed");
497    }
498
499    gdb_connect = accept(listen_gdb, NULL, NULL);
500    if (gdb_connect < 0) {
501        XERROR(errno, "accept failed");
502    }
503    fprintf(stderr, "connected.\n");
504    fflush(stderr);
505    close(listen_gdb);
506    from_gdb = gdb_connect;
507    to_gdb = gdb_connect;
508}
509
510/* prepares the FIFOs filenames, map the shared memory. */
511static
512void prepare_fifos_and_shared_mem(int pid)
513{
514   const HChar *user, *host;
515   unsigned len;
516
517   user = getenv("LOGNAME");
518   if (user == NULL) user = getenv("USER");
519   if (user == NULL) user = "???";
520
521   host = getenv("HOST");
522   if (host == NULL) host = getenv("HOSTNAME");
523   if (host == NULL) host = "???";
524
525   len = strlen(vgdb_prefix) + strlen(user) + strlen(host) + 40;
526   from_gdb_to_pid = vmalloc (len);
527   to_gdb_from_pid = vmalloc (len);
528   shared_mem      = vmalloc (len);
529   /* below 3 lines must match the equivalent in remote-utils.c */
530   sprintf(from_gdb_to_pid, "%s-from-vgdb-to-%d-by-%s-on-%s",    vgdb_prefix,
531           pid, user, host);
532   sprintf(to_gdb_from_pid, "%s-to-vgdb-from-%d-by-%s-on-%s",    vgdb_prefix,
533           pid, user, host);
534   sprintf(shared_mem,      "%s-shared-mem-vgdb-%d-by-%s-on-%s", vgdb_prefix,
535           pid, user, host);
536   DEBUG (1, "vgdb: using %s %s %s\n",
537          from_gdb_to_pid, to_gdb_from_pid, shared_mem);
538
539   map_vgdbshared(shared_mem);
540}
541
542/* Convert hex digit A to a number.  */
543
544static int
545fromhex (int a)
546{
547   if (a >= '0' && a <= '9')
548      return a - '0';
549   else if (a >= 'a' && a <= 'f')
550      return a - 'a' + 10;
551   else
552      XERROR(0, "Reply contains invalid hex digit %c\n", a);
553  return 0;
554}
555
556/* Returns next char from fd.  -1 if error, -2 if EOF.
557   NB: must always call it with the same fd */
558static int
559readchar (int fd)
560{
561  static char buf[PBUFSIZ+1]; // +1 for trailing \0
562  static int bufcnt = 0;
563  static unsigned char *bufp;
564  // unsigned bufp to e.g. avoid having 255 converted to int -1
565
566  if (bufcnt-- > 0)
567     return *bufp++;
568
569  bufcnt = read_buf (fd, buf, "static buf readchar");
570
571  if (bufcnt <= 0) {
572     if (bufcnt == 0) {
573        fprintf (stderr, "readchar: Got EOF\n");
574        return -2;
575     } else {
576        ERROR (errno, "readchar\n");
577        return -1;
578     }
579  }
580
581  bufp = (unsigned char *)buf;
582  bufcnt--;
583  return *bufp++;
584}
585
586/* Read a packet from fromfd, with error checking,
587   and store it in BUF.
588   Returns length of packet, or -1 if error or -2 if EOF.
589   Writes ack on ackfd */
590
591static int
592getpkt (char *buf, int fromfd, int ackfd)
593{
594  char *bp;
595  unsigned char csum, c1, c2;
596  int c;
597
598  while (1) {
599     csum = 0;
600
601     while (1) {
602        c = readchar (fromfd);
603        if (c == '$')
604           break;
605        DEBUG(2, "[getpkt: discarding char '%c']\n", c);
606        if (c < 0)
607           return c;
608     }
609
610     bp = buf;
611     while (1) {
612        c = readchar (fromfd);
613        if (c < 0)
614           return c;
615        if (c == '#')
616           break;
617        if (c == '*') {
618           int repeat;
619           int r;
620           int prev;
621           prev = *(bp-1);
622           csum += c;
623           repeat = readchar (fromfd);
624           csum += repeat;
625           for (r = 0; r < repeat - 29; r ++)
626              *bp++ = prev;
627        } else {
628           *bp++ = c;
629           csum += c;
630        }
631     }
632     *bp = 0;
633
634     c1 = fromhex (readchar (fromfd));
635     c2 = fromhex (readchar (fromfd));
636
637     if (csum == (c1 << 4) + c2)
638	break;
639
640     fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
641              (c1 << 4) + c2, csum, buf);
642     if (write (ackfd, "-", 1) != 1)
643        ERROR(0, "error when writing - (nack)\n");
644     else
645        add_written(1);
646  }
647
648  DEBUG(2, "getpkt (\"%s\");  [sending ack] \n", buf);
649  if (write (ackfd, "+", 1) != 1)
650     ERROR(0, "error when writing + (ack)\n");
651  else
652     add_written(1);
653  return bp - buf;
654}
655
656static int sigint = 0;
657static int sigterm = 0;
658static int sigpipe = 0;
659static int sighup = 0;
660static int sigusr1 = 0;
661static int sigalrm = 0;
662static int sigusr1_fd = -1;
663static pthread_t invoke_gdbserver_in_valgrind_thread;
664
665static
666void received_signal (int signum)
667{
668   if (signum == SIGINT)
669      sigint++;
670   else if (signum == SIGUSR1) {
671      sigusr1++;
672      if (sigusr1_fd >= 0) {
673         char control_c = '\003';
674         write_buf(sigusr1_fd, &control_c, 1,
675                   "write \\003 on SIGUSR1", /* notify */ True);
676      }
677   }
678   else if (signum == SIGTERM) {
679      shutting_down = True;
680      sigterm++;
681   } else if (signum == SIGHUP) {
682      shutting_down = True;
683      sighup++;
684   } else if (signum == SIGPIPE) {
685      sigpipe++;
686   } else if (signum == SIGALRM) {
687      sigalrm++;
688#if defined(VGPV_arm_linux_android) || defined(VGPV_x86_linux_android) \
689    || defined(VGPV_mips32_linux_android)
690      /* Android has no pthread_cancel. As it also does not have
691         an invoker implementation, there is no need for cleanup action.
692         So, we just do nothing. */
693      DEBUG(1, "sigalrm received, no action on android\n");
694#else
695      /* Note: we cannot directly invoke restore_and_detach : this must
696         be done by the thread that has attached.
697         We have in this thread pushed a cleanup handler that will
698         cleanup what is needed. */
699      DEBUG(1, "pthread_cancel invoke_gdbserver_in_valgrind_thread\n");
700      pthread_cancel(invoke_gdbserver_in_valgrind_thread);
701#endif
702   } else {
703      ERROR(0, "unexpected signal %d\n", signum);
704   }
705}
706
707/* install the signal handlers allowing e.g. vgdb to cleanup in
708   case of termination. */
709static
710void install_handlers(void)
711{
712   struct sigaction action, oldaction;
713
714   action.sa_handler = received_signal;
715   sigemptyset (&action.sa_mask);
716   action.sa_flags = 0;
717
718   /* SIGINT: when user types C-c in gdb, this sends
719      a SIGINT to vgdb + causes a character to be sent to remote gdbserver.
720      The later is enough to wakeup the valgrind process. */
721   if (sigaction (SIGINT, &action, &oldaction) != 0)
722      XERROR (errno, "vgdb error sigaction SIGINT\n");
723   /* We might do something more intelligent than just
724      reporting this SIGINT E.g. behave similarly to the gdb: two
725      control-C without feedback from the debugged process would
726      mean to stop debugging it. */
727
728   /* SIGUSR1: this is used to facilitate automatic testing.  When
729      vgdb receives this signal, it will simulate the user typing C-c. */
730   if (sigaction (SIGUSR1, &action, &oldaction) != 0)
731      XERROR (errno, "vgdb error sigaction SIGUSR1\n");
732
733
734   /* SIGTERM: can receive this signal (e.g. from gdb) to terminate vgdb
735      when detaching or similar. A clean shutdown will be done as both
736      the read and write side will detect an end of file. */
737   if (sigaction (SIGTERM, &action, &oldaction) != 0)
738      XERROR (errno, "vgdb error sigaction SIGTERM\n");
739
740   /* SIGPIPE: can receive this signal when gdb detaches or kill the
741      process debugged: gdb will close its pipes to vgdb. vgdb
742      must resist to this signal to allow a clean shutdown. */
743   if (sigaction (SIGPIPE, &action, &oldaction) != 0)
744      XERROR (errno, "vgdb error sigaction SIGPIPE\n");
745
746   /* SIGALRM: in case invoke thread is blocked, alarm is used
747      to cleanup.  */
748   if (sigaction (SIGALRM, &action, &oldaction) != 0)
749      XERROR (errno, "vgdb error sigaction SIGALRM\n");
750}
751
752/* close the FIFOs provided connections, terminate the invoker thread.  */
753static
754void close_connection(int to_pid, int from_pid)
755{
756   DEBUG(1, "nr received signals: sigint %d sigterm %d sighup %d sigpipe %d\n",
757         sigint, sigterm, sighup, sigpipe);
758   /* Note that we do not forward sigterm to the valgrind process:
759      a sigterm signal is (probably) received from gdb if the user wants to
760      kill the debugged process. The kill instruction has been given to
761      the valgrind process, which should execute a clean exit. */
762
763   /* We first close the connection to pid. The pid will then
764      terminates its gdbserver work. We keep the from pid
765      fifo opened till the invoker thread is finished.
766      This allows the gdbserver to finish sending its last reply. */
767   if (close(to_pid) != 0)
768      ERROR(errno, "close to_pid\n");
769
770   /* if there is a task that was busy trying to wake up valgrind
771      process, we wait for it to be terminated otherwise threads
772      in the valgrind process can stay stopped if vgdb main
773      exits before the invoke thread had time to detach from
774      all valgrind threads. */
775   if (max_invoke_ms > 0 || cmd_time_out != NEVER) {
776      int join;
777
778      /* It is surprisingly complex to properly shutdown or exit the
779         valgrind process in which gdbserver has been invoked through
780         ptrace.  In the normal case (gdb detaches from the process,
781         or process is continued), the valgrind process will reach the
782         breakpoint place.  Using ptrace, vgdb will ensure the
783         previous activity of the process is resumed (e.g. restart a
784         blocking system call).  The special case is when gdb asks the
785         valgrind process to exit (using either the "kill" command or
786         "monitor exit").  In such a case, the valgrind process will
787         call exit.  But a ptraced process will be blocked in exit,
788         waiting for the ptracing process to detach or die. vgdb
789         cannot detach unconditionally as otherwise, in the normal
790         case, the valgrind process would stop abnormally with SIGSTOP
791         (as vgdb would not be there to catch it). vgdb can also not
792         die unconditionally otherwise again, similar problem.  So, we
793         assume that most of the time, we arrive here in the normal
794         case, and so, the breakpoint has been encountered by the
795         valgrind process, so the invoker thread will exit and the
796         join will succeed.  For the "kill" case, we cause an alarm
797         signal to be sent after a few seconds. This means that in the
798         normal case, the gdbserver code in valgrind process must have
799         returned the control in less than the alarm nr of seconds,
800         otherwise, valgrind will stop abnormally with SIGSTOP. */
801      (void) alarm (3);
802
803      DEBUG(1, "joining with invoke_gdbserver_in_valgrind_thread\n");
804      join = pthread_join(invoke_gdbserver_in_valgrind_thread, NULL);
805      if (join != 0)
806         XERROR
807            (join,
808             "vgdb error pthread_join invoke_gdbserver_in_valgrind_thread\n");
809   }
810   if (close(from_pid) != 0)
811      ERROR(errno, "close from_pid\n");
812}
813
814/* Relay data between gdb and Valgrind gdbserver, till EOF or an
815   error is encountered. */
816static
817void gdb_relay (int pid)
818{
819   int from_pid = -1; /* fd to read from pid */
820   int to_pid = -1; /* fd to write to pid */
821
822   int shutdown_loop = 0;
823   fprintf (stderr, "relaying data between gdb and process %d\n", pid);
824   fflush (stderr);
825
826   if (max_invoke_ms > 0)
827      pthread_create(&invoke_gdbserver_in_valgrind_thread, NULL,
828                     invoke_gdbserver_in_valgrind, (void *) &pid);
829   to_pid = open_fifo(from_gdb_to_pid, O_WRONLY, "write to pid");
830   acquire_lock (shared_mem_fd, pid);
831
832   from_pid = open_fifo (to_gdb_from_pid, O_RDONLY|O_NONBLOCK,
833                         "read mode from pid");
834
835   sigusr1_fd = to_pid; /* allow simulating user typing control-c */
836
837   while (1) {
838      ConnectionKind ck;
839      int ret;
840      struct pollfd pollfds[NumConnectionKind];
841
842      /* watch data written by gdb, watch POLLERR on both gdb fd */
843      pollfds[FROM_GDB].fd = from_gdb;
844      pollfds[FROM_GDB].events = POLLIN;
845      pollfds[FROM_GDB].revents = 0;
846      pollfds[TO_GDB].fd = to_gdb;
847      pollfds[TO_GDB].events = 0;
848      pollfds[TO_GDB].revents = 0;
849
850      /* watch data written by pid, watch POLLERR on both pid fd */
851      pollfds[FROM_PID].fd = from_pid;
852      pollfds[FROM_PID].events = POLLIN;
853      pollfds[FROM_PID].revents = 0;
854      pollfds[TO_PID].fd = to_pid;
855      pollfds[TO_PID].events = 0;
856      pollfds[TO_PID].revents = 0;
857
858      ret = poll(pollfds,
859                 NumConnectionKind,
860                 (shutting_down ?
861                  1 /* one second */
862                  : -1 /* infinite */));
863      DEBUG(2, "poll ret %d errno %d\n", ret, errno);
864
865      /* check for unexpected error */
866      if (ret <= 0 && errno != EINTR) {
867         ERROR (errno, "unexpected poll ret %d\n", ret);
868         shutting_down = True;
869         break;
870      }
871
872      /* check for data to read */
873      for (ck = 0; ck < NumConnectionKind; ck ++) {
874         if (pollfds[ck].revents & POLLIN) {
875            switch (ck) {
876            case FROM_GDB:
877               if (!read_from_gdb_write_to_pid(to_pid))
878                  shutting_down = True;
879               break;
880            case FROM_PID:
881               if (!read_from_pid_write_to_gdb(from_pid))
882                  shutting_down = True;
883               break;
884            default: XERROR(0, "unexpected POLLIN on %s\n",
885                               ppConnectionKind(ck));
886            }
887         }
888      }
889
890      /* check for an fd being in error condition */
891      for (ck = 0; ck < NumConnectionKind; ck ++) {
892         if (pollfds[ck].revents & POLLERR) {
893            DEBUG(1, "connection %s fd %d POLLERR error condition\n",
894                     ppConnectionKind(ck), pollfds[ck].fd);
895            invoker_valgrind_dying();
896            shutting_down = True;
897         }
898         if (pollfds[ck].revents & POLLHUP) {
899            DEBUG(1, "connection %s fd %d POLLHUP error condition\n",
900                  ppConnectionKind(ck), pollfds[ck].fd);
901            invoker_valgrind_dying();
902            shutting_down = True;
903         }
904         if (pollfds[ck].revents & POLLNVAL) {
905            DEBUG(1, "connection %s fd %d POLLNVAL error condition\n",
906                  ppConnectionKind(ck), pollfds[ck].fd);
907            invoker_valgrind_dying();
908            shutting_down = True;
909         }
910      }
911
912      if (shutting_down) {
913         /* we let some time to the final packets to be transferred */
914         shutdown_loop++;
915         if (shutdown_loop > 3)
916            break;
917      }
918   }
919   close_connection(to_pid, from_pid);
920}
921
922static int packet_len_for_command(char *cmd)
923{
924   /* cmd will be send as a packet $qRcmd,xxxx....................xx#cc      */
925   return                          7+     2*strlen(cmd)             +3  + 1;
926}
927
928/* hyper-minimal protocol implementation that
929   sends the provided commands (using qRcmd packets)
930   and read and display their replies. */
931static
932void standalone_send_commands(int pid,
933                              int last_command,
934                              char *commands[] )
935{
936   int from_pid = -1; /* fd to read from pid */
937   int to_pid = -1; /* fd to write to pid */
938
939   int i;
940   int hi;
941   char hex[3];
942   unsigned char cksum;
943   char *hexcommand;
944   char buf[PBUFSIZ+1]; // +1 for trailing \0
945   int buflen;
946   int nc;
947
948
949   if (max_invoke_ms > 0 || cmd_time_out != NEVER)
950      pthread_create(&invoke_gdbserver_in_valgrind_thread, NULL,
951                     invoke_gdbserver_in_valgrind, (void *) &pid);
952
953   to_pid = open_fifo(from_gdb_to_pid, O_WRONLY, "write to pid");
954   acquire_lock (shared_mem_fd, pid);
955
956   /* first send a C-c \003 to pid, so that it wakes up the process
957      After that, we can open the fifo from the pid in read mode
958      We then start to wait for packets (normally first a resume reply)
959      At that point, we send our command and expect replies */
960   buf[0] = '\003';
961   write_buf(to_pid, buf, 1, "write \\003 to wake up", /* notify */ True);
962   from_pid = open_fifo(to_gdb_from_pid, O_RDONLY,
963                        "read cmd result from pid");
964
965   for (nc = 0; nc <= last_command; nc++) {
966      fprintf (stderr, "sending command %s to pid %d\n", commands[nc], pid);
967      fflush (stderr);
968
969      /* prepare hexcommand $qRcmd,xxxx....................xx#cc      */
970      hexcommand = vmalloc (packet_len_for_command(commands[nc]));
971      hexcommand[0] = 0;
972      strcat (hexcommand, "$qRcmd,");
973      for (i = 0; i < strlen(commands[nc]); i++) {
974         sprintf(hex, "%02x", (unsigned char) commands[nc][i]);
975         // Need to use unsigned char, to avoid sign extension.
976         strcat (hexcommand, hex);
977      }
978      /* checksum (but without the $) */
979      cksum = 0;
980      for (hi = 1; hi < strlen(hexcommand); hi++)
981         cksum+=hexcommand[hi];
982      strcat(hexcommand, "#");
983      sprintf(hex, "%02x", cksum);
984      strcat(hexcommand, hex);
985      write_buf(to_pid, hexcommand, strlen(hexcommand),
986                "writing hex command to pid", /* notify */ True);
987
988      /* we exit of the below loop explicitely when the command has
989         been handled or because a signal handler will set
990         shutting_down. */
991      while (!shutting_down) {
992         buflen = getpkt(buf, from_pid, to_pid);
993         if (buflen < 0) {
994            ERROR (0, "error reading packet\n");
995            if (buflen == -2)
996               invoker_valgrind_dying();
997            break;
998         }
999         if (strlen(buf) == 0) {
1000            DEBUG(0, "empty packet rcvd (packet qRcmd not recognised?)\n");
1001            break;
1002         }
1003         if (strcmp(buf, "OK") == 0) {
1004            DEBUG(1, "OK packet rcvd\n");
1005            break;
1006         }
1007         if (buf[0] == 'E') {
1008            DEBUG(0,
1009                  "E NN error packet rcvd: %s (unknown monitor command?)\n",
1010                  buf);
1011            break;
1012         }
1013         if (buf[0] == 'W') {
1014            DEBUG(0, "W stopped packet rcvd: %s\n", buf);
1015            break;
1016         }
1017         if (buf[0] == 'T') {
1018            DEBUG(1, "T resume reply packet received: %s\n", buf);
1019            continue;
1020         }
1021
1022         /* must be here an O packet with hex encoded string reply
1023            => decode and print it */
1024         if (buf[0] != 'O') {
1025            DEBUG(0, "expecting O packet, received: %s\n", buf);
1026            continue;
1027         }
1028         {
1029            char buf_print[buflen/2 + 1];
1030            for (i = 1; i < buflen; i = i + 2)
1031               buf_print[i/2] = (fromhex(*(buf+i)) << 4)
1032                     + fromhex(*(buf+i+1));
1033            buf_print[buflen/2] = 0;
1034            printf("%s", buf_print);
1035            fflush(stdout);
1036         }
1037      }
1038      free (hexcommand);
1039   }
1040   shutting_down = True;
1041
1042   close_connection(to_pid, from_pid);
1043}
1044
1045/* report to user the existence of a vgdb-able valgrind process
1046   with given pid */
1047static
1048void report_pid (int pid, Bool on_stdout)
1049{
1050   char cmdline_file[100];
1051   char cmdline[1000];
1052   int fd;
1053   int i, sz;
1054
1055   sprintf(cmdline_file, "/proc/%d/cmdline", pid);
1056   fd = open (cmdline_file, O_RDONLY);
1057   if (fd == -1) {
1058      DEBUG(1, "error opening cmdline file %s %s\n",
1059            cmdline_file, strerror(errno));
1060      sprintf(cmdline, "(could not open process command line)");
1061   } else {
1062      sz = read(fd, cmdline, 1000);
1063      for (i = 0; i < sz; i++)
1064         if (cmdline[i] == 0)
1065            cmdline[i] = ' ';
1066      if (sz >= 0)
1067         cmdline[sz] = 0;
1068      else {
1069         DEBUG(1, "error reading cmdline file %s %s\n",
1070               cmdline_file, strerror(errno));
1071         sprintf(cmdline, "(could not read process command line)");
1072      }
1073      close (fd);
1074   }
1075   fprintf((on_stdout ? stdout : stderr), "use --pid=%d for %s\n", pid, cmdline);
1076   fflush((on_stdout ? stdout : stderr));
1077}
1078
1079static
1080void usage(void)
1081{
1082   fprintf(stderr,
1083"Usage: vgdb [OPTION]... [[-c] COMMAND]...\n"
1084"vgdb (valgrind gdb) has two usages\n"
1085"  1. standalone to send monitor commands to a Valgrind gdbserver.\n"
1086"     The OPTION(s) must be followed by the command to send\n"
1087"     To send more than one command, separate the commands with -c\n"
1088"  2. relay application between gdb and a Valgrind gdbserver.\n"
1089"     Only OPTION(s) can be given.\n"
1090"\n"
1091" OPTIONS are [--pid=<number>] [--vgdb-prefix=<prefix>]\n"
1092"             [--wait=<number>] [--max-invoke-ms=<number>]\n"
1093"             [--port=<portnr>\n"
1094"             [--cmd-time-out=<number>] [-l] [-D] [-d]\n"
1095"             \n"
1096"  --pid arg must be given if multiple Valgrind gdbservers are found.\n"
1097"  --vgdb-prefix arg must be given to both Valgrind and vgdb utility\n"
1098"      if you want to change the prefix (default %s) for the FIFOs communication\n"
1099"      between the Valgrind gdbserver and vgdb.\n"
1100"  --wait (default 0) tells vgdb to check during the specified number\n"
1101"      of seconds if a Valgrind gdbserver can be found.\n"
1102"  --max-invoke-ms (default 100) gives the nr of milli-seconds after which vgdb\n"
1103"      will force the invocation of the Valgrind gdbserver (if the Valgrind\n"
1104"         process is blocked in a system call).\n"
1105"  --port instructs vgdb to listen for gdb on the specified port nr.\n"
1106"  --cmd-time-out (default 99999999) tells vgdb to exit if the found Valgrind\n"
1107"     gdbserver has not processed a command after number seconds\n"
1108"  -l  arg tells to show the list of running Valgrind gdbserver and then exit.\n"
1109"  -D  arg tells to show shared mem status and then exit.\n"
1110"  -d  arg tells to show debug info. Multiple -d args for more debug info\n"
1111"\n"
1112"  -h --help shows this message\n"
1113"  To get help from the Valgrind gdbserver, use vgdb help\n"
1114"\n", vgdb_prefix_default()
1115           );
1116   invoker_restrictions_msg();
1117}
1118
1119/* If show_list, outputs on stdout the list of Valgrind processes with gdbserver activated.
1120                 and then exits.
1121
1122   else if arg_pid == -1, waits maximum check_trials seconds to discover
1123   a valgrind pid appearing.
1124
1125   Otherwise verify arg_pid is valid and corresponds to a Valgrind process
1126   with gdbserver activated.
1127
1128   Returns the pid to work with
1129   or exits in case of error (e.g. no pid found corresponding to arg_pid */
1130
1131static
1132int search_arg_pid(int arg_pid, int check_trials, Bool show_list)
1133{
1134   int i;
1135   int pid = -1;
1136
1137   if (arg_pid == 0 || arg_pid < -1) {
1138      fprintf (stderr, "vgdb error: invalid pid %d given\n", arg_pid);
1139      exit (1);
1140   } else {
1141      /* search for a matching named fifo.
1142         If we have been given a pid, we will check that the matching FIFO is
1143         there (or wait the nr of check_trials for this to appear).
1144         If no pid has been given, then if we find only one FIFO,
1145         we will use this to build the pid to use.
1146         If we find multiple processes with valid FIFO, we report them and will
1147         exit with an error. */
1148      DIR *vgdb_dir;
1149      char *vgdb_dir_name = vmalloc (strlen (vgdb_prefix) + 3);
1150      struct dirent *f;
1151      int is;
1152      int nr_valid_pid = 0;
1153      const char *suffix = "-from-vgdb-to-"; /* followed by pid */
1154      char *vgdb_format = vmalloc (strlen(vgdb_prefix) + strlen(suffix) + 1);
1155
1156      strcpy (vgdb_format, vgdb_prefix);
1157      strcat (vgdb_format, suffix);
1158
1159      if (strchr(vgdb_prefix, '/') != NULL) {
1160         strcpy (vgdb_dir_name, vgdb_prefix);
1161         for (is = strlen(vgdb_prefix) - 1; is >= 0; is--)
1162            if (vgdb_dir_name[is] == '/') {
1163               vgdb_dir_name[is+1] = '\0';
1164               break;
1165            }
1166      } else {
1167         strcpy (vgdb_dir_name, "");
1168      }
1169
1170      DEBUG(1, "searching pid in directory %s format %s\n",
1171            vgdb_dir_name, vgdb_format);
1172
1173      /* try to find FIFOs with valid pid.
1174         On exit of the loop, pid is set to:
1175         the last pid found if show_list (or -1 if no process was listed)
1176         -1 if no FIFOs matching a running process is found
1177         -2 if multiple FIFOs of running processes are found
1178         otherwise it is set to the (only) pid found that can be debugged
1179      */
1180      for (i = 0; i < check_trials; i++) {
1181         DEBUG(1, "check_trial %d \n", i);
1182         if (i > 0)
1183           /* wait one second before checking again */
1184           sleep(1);
1185
1186         vgdb_dir = opendir (strlen (vgdb_dir_name) ? vgdb_dir_name : "./");
1187         if (vgdb_dir == NULL)
1188            XERROR (errno,
1189                    "vgdb error: opening directory %s searching vgdb fifo\n",
1190                    vgdb_dir_name);
1191
1192         errno = 0; /* avoid complain if vgdb_dir is empty */
1193         while ((f = readdir (vgdb_dir))) {
1194            struct stat st;
1195            char pathname[strlen(vgdb_dir_name) + strlen(f->d_name) + 1];
1196            char *wrongpid;
1197            int newpid;
1198
1199            strcpy (pathname, vgdb_dir_name);
1200            strcat (pathname, f->d_name);
1201            DEBUG(3, "checking pathname is FIFO %s\n", pathname);
1202            if (stat (pathname, &st) != 0) {
1203               if (debuglevel >= 3)
1204                  ERROR (errno, "vgdb error: stat %s searching vgdb fifo\n",
1205                         pathname);
1206            } else if (S_ISFIFO (st.st_mode)) {
1207               DEBUG(3, "trying FIFO %s\n", pathname);
1208               if (strncmp (pathname, vgdb_format,
1209                            strlen (vgdb_format)) == 0) {
1210                  newpid = strtol(pathname + strlen (vgdb_format),
1211                                  &wrongpid, 10);
1212                  if (*wrongpid == '-' && newpid > 0
1213                      && kill (newpid, 0) == 0) {
1214                     nr_valid_pid++;
1215                     if (show_list) {
1216                        report_pid (newpid, /*on_stdout*/ True);
1217                        pid = newpid;
1218                     } else if (arg_pid != -1) {
1219                        if (arg_pid == newpid) {
1220                           pid = newpid;
1221                        }
1222                     } else if (nr_valid_pid > 1) {
1223                        if (nr_valid_pid == 2) {
1224                           fprintf
1225                              (stderr,
1226                               "no --pid= arg given"
1227                               " and multiple valgrind pids found:\n");
1228                           report_pid (pid, /*on_stdout*/ False);
1229                        }
1230                        pid = -2;
1231                        report_pid (newpid, /*on_stdout*/ False);
1232                     } else {
1233                        pid = newpid;
1234                     }
1235                  }
1236               }
1237            }
1238            errno = 0; /* avoid complain if at the end of vgdb_dir */
1239         }
1240         if (f == NULL && errno != 0)
1241            XERROR (errno, "vgdb error: reading directory %s for vgdb fifo\n",
1242                    vgdb_dir_name);
1243
1244         closedir (vgdb_dir);
1245         if (pid != -1)
1246            break;
1247      }
1248
1249      free (vgdb_dir_name);
1250      free (vgdb_format);
1251   }
1252
1253   if (show_list) {
1254      exit (1);
1255   } else if (pid == -1) {
1256      if (arg_pid == -1)
1257         fprintf (stderr, "vgdb error: no FIFO found and no pid given\n");
1258      else
1259         fprintf (stderr, "vgdb error: no FIFO found matching pid %d\n",
1260                  arg_pid);
1261      exit (1);
1262   }
1263   else if (pid == -2) {
1264      /* no arg_pid given, multiple FIFOs found */
1265      exit (1);
1266   }
1267   else {
1268      return pid;
1269   }
1270}
1271
1272/* return true if the numeric value of an option of the
1273   form --xxxxxxxxx=<number> could properly be extracted
1274   from arg. If True is returned, *value contains the
1275   extracted value.*/
1276static
1277Bool numeric_val(char* arg, int *value)
1278{
1279   const char *eq_pos = strchr(arg, '=');
1280   char *wrong;
1281   long long int long_value;
1282
1283   if (eq_pos == NULL)
1284      return False;
1285
1286   long_value = strtoll(eq_pos+1, &wrong, 10);
1287   if (long_value < 0 || long_value > INT_MAX)
1288      return False;
1289   if (*wrong)
1290      return False;
1291
1292   *value = (int) long_value;
1293   return True;
1294}
1295
1296/* true if arg matches the provided option */
1297static
1298Bool is_opt(char* arg, const char *option)
1299{
1300   int option_len = strlen(option);
1301   if (option[option_len-1] == '=')
1302      return (0 == strncmp(option, arg, option_len));
1303   else
1304      return (0 == strcmp(option, arg));
1305}
1306
1307/* Parse command lines options. If error(s), exits.
1308   Otherwise returns the options in *p_... args.
1309   commands must be big enough for the commands extracted from argv.
1310   On return, *p_last_command gives the position in commands where
1311   the last command has been allocated (using vmalloc). */
1312static
1313void parse_options(int argc, char** argv,
1314                   Bool *p_show_shared_mem,
1315                   Bool *p_show_list,
1316                   int *p_arg_pid,
1317                   int *p_check_trials,
1318                   int *p_port,
1319                   int *p_last_command,
1320                   char *commands[])
1321{
1322   Bool show_shared_mem = False;
1323   Bool show_list = False;
1324   int arg_pid = -1;
1325   int check_trials = 1;
1326   int last_command = -1;
1327   int int_port = 0;
1328
1329   int i;
1330   int arg_errors = 0;
1331
1332   for (i = 1; i < argc; i++) {
1333      if (is_opt(argv[i], "--help") || is_opt(argv[i], "-h")) {
1334         usage();
1335         exit(0);
1336      } else if (is_opt(argv[i], "-d")) {
1337         debuglevel++;
1338      } else if (is_opt(argv[i], "-D")) {
1339         show_shared_mem = True;
1340      } else if (is_opt(argv[i], "-l")) {
1341         show_list = True;
1342      } else if (is_opt(argv[i], "--pid=")) {
1343         int newpid;
1344         if (!numeric_val(argv[i], &newpid)) {
1345            fprintf (stderr, "invalid --pid argument %s\n", argv[i]);
1346            arg_errors++;
1347         } else if (arg_pid != -1) {
1348            fprintf (stderr, "multiple --pid arguments given\n");
1349            arg_errors++;
1350         } else {
1351            arg_pid = newpid;
1352         }
1353      } else if (is_opt(argv[i], "--wait=")) {
1354         if (!numeric_val(argv[i], &check_trials)) {
1355            fprintf (stderr, "invalid --wait argument %s\n", argv[i]);
1356            arg_errors++;
1357         }
1358      } else if (is_opt(argv[i], "--max-invoke-ms=")) {
1359         if (!numeric_val(argv[i], &max_invoke_ms)) {
1360            fprintf (stderr, "invalid --max-invoke-ms argument %s\n", argv[i]);
1361            arg_errors++;
1362         }
1363      } else if (is_opt(argv[i], "--cmd-time-out=")) {
1364         if (!numeric_val(argv[i], &cmd_time_out)) {
1365            fprintf (stderr, "invalid --cmd-time-out argument %s\n", argv[i]);
1366            arg_errors++;
1367         }
1368      } else if (is_opt(argv[i], "--port=")) {
1369         if (!numeric_val(argv[i], &int_port)) {
1370            fprintf (stderr, "invalid --port argument %s\n", argv[i]);
1371            arg_errors++;
1372         }
1373      } else if (is_opt(argv[i], "--vgdb-prefix=")) {
1374         vgdb_prefix = argv[i] + 14;
1375      } else if (is_opt(argv[i], "-c")) {
1376         last_command++;
1377         commands[last_command] = vmalloc (1);
1378         commands[last_command][0] = '\0';
1379      } else if (0 == strncmp(argv[i], "-", 1)) {
1380         fprintf (stderr, "unknown or invalid argument %s\n", argv[i]);
1381         arg_errors++;
1382      } else {
1383         int len;
1384         if (last_command == -1) {
1385            /* only one command, no -c command indicator */
1386            last_command++;
1387            commands[last_command] = vmalloc (1);
1388            commands[last_command][0] = '\0';
1389         }
1390         len = strlen(commands[last_command]);
1391         commands[last_command] = vrealloc (commands[last_command],
1392                                            len + 1 + strlen(argv[i]) + 1);
1393         if (len > 0)
1394            strcat (commands[last_command], " ");
1395         strcat (commands[last_command], argv[i]);
1396         if (packet_len_for_command(commands[last_command]) > PBUFSIZ) {
1397            fprintf (stderr, "command %s too long\n", commands[last_command]);
1398            arg_errors++;
1399         }
1400
1401      }
1402   }
1403
1404   if (vgdb_prefix == NULL)
1405      vgdb_prefix = vgdb_prefix_default();
1406
1407   if (isatty(0)
1408       && !show_shared_mem
1409       && !show_list
1410       && int_port == 0
1411       && last_command == -1) {
1412      arg_errors++;
1413      fprintf (stderr,
1414               "Using vgdb standalone implies to give -D or -l or a COMMAND\n");
1415   }
1416
1417   if (show_shared_mem && show_list) {
1418      arg_errors++;
1419      fprintf (stderr,
1420               "Can't use both -D and -l options\n");
1421   }
1422
1423   if (max_invoke_ms > 0
1424       && cmd_time_out != NEVER
1425       && (cmd_time_out * 1000) <= max_invoke_ms) {
1426      arg_errors++;
1427      fprintf (stderr,
1428               "--max-invoke-ms must be < --cmd-time-out * 1000\n");
1429   }
1430
1431   if (show_list && arg_pid != -1) {
1432      arg_errors++;
1433      fprintf (stderr,
1434               "Can't use both --pid and -l options\n");
1435   }
1436
1437   if (int_port > 0 && last_command != -1) {
1438      arg_errors++;
1439      fprintf (stderr,
1440               "Can't use --port to send commands\n");
1441   }
1442
1443   if (arg_errors > 0) {
1444      fprintf (stderr, "args error. Try `vgdb --help` for more information\n");
1445      exit(1);
1446   }
1447
1448   *p_show_shared_mem = show_shared_mem;
1449   *p_show_list = show_list;
1450   *p_arg_pid = arg_pid;
1451   *p_check_trials = check_trials;
1452   *p_port = int_port;
1453   *p_last_command = last_command;
1454}
1455
1456int main(int argc, char** argv)
1457{
1458   int i;
1459   int pid;
1460
1461   Bool show_shared_mem;
1462   Bool show_list;
1463   int arg_pid;
1464   int check_trials;
1465   int in_port;
1466   int last_command;
1467   char *commands[argc]; // we will never have more commands than args.
1468
1469   parse_options(argc, argv,
1470                 &show_shared_mem,
1471                 &show_list,
1472                 &arg_pid,
1473                 &check_trials,
1474                 &in_port,
1475                 &last_command,
1476                 commands);
1477
1478   /* when we are working as a relay for gdb, handle some signals by
1479      only reporting them (according to debug level). Also handle these
1480      when ptrace will be used: vgdb must clean up the ptrace effect before
1481      dying. */
1482   if (max_invoke_ms > 0 || last_command == -1)
1483      install_handlers();
1484
1485   pid = search_arg_pid (arg_pid, check_trials, show_list);
1486
1487   prepare_fifos_and_shared_mem(pid);
1488
1489   if (in_port > 0)
1490      wait_for_gdb_connect(in_port);
1491
1492   if (show_shared_mem) {
1493      fprintf(stderr,
1494              "vgdb %d "
1495              "written_by_vgdb %d "
1496              "seen_by_valgrind %d\n"
1497              "vgdb pid %d\n",
1498              VS_vgdb_pid,
1499              VS_written_by_vgdb,
1500              VS_seen_by_valgrind,
1501              VS_vgdb_pid);
1502      exit (0);
1503   }
1504
1505   if (last_command >= 0) {
1506      standalone_send_commands(pid, last_command, commands);
1507   } else {
1508      gdb_relay(pid);
1509   }
1510
1511
1512   free (from_gdb_to_pid);
1513   free (to_gdb_from_pid);
1514   free (shared_mem);
1515
1516   for (i = 0; i <= last_command; i++)
1517      free (commands[i]);
1518   return 0;
1519}
1520