Home | History | Annotate | Line # | Download | only in gdb.base
      1      1.1  christos /* This testcase is part of GDB, the GNU debugger.
      2      1.1  christos 
      3  1.1.1.2  christos    Copyright 2021-2024 Free Software Foundation, Inc.
      4      1.1  christos 
      5      1.1  christos    This program is free software; you can redistribute it and/or modify
      6      1.1  christos    it under the terms of the GNU General Public License as published by
      7      1.1  christos    the Free Software Foundation; either version 3 of the License, or
      8      1.1  christos    (at your option) any later version.
      9      1.1  christos 
     10      1.1  christos    This program is distributed in the hope that it will be useful,
     11      1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     12      1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13      1.1  christos    GNU General Public License for more details.
     14      1.1  christos 
     15      1.1  christos    You should have received a copy of the GNU General Public License
     16      1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     17      1.1  christos 
     18      1.1  christos #include <unistd.h>
     19      1.1  christos 
     20  1.1.1.2  christos #include <string.h>
     21  1.1.1.2  christos #include <limits.h>
     22  1.1.1.2  christos #include <stdio.h>
     23  1.1.1.2  christos 
     24      1.1  christos static volatile int unblock_parent = 0;
     25      1.1  christos 
     26      1.1  christos static void
     27      1.1  christos break_parent (void)
     28      1.1  christos {
     29      1.1  christos }
     30      1.1  christos 
     31      1.1  christos int
     32  1.1.1.2  christos main (int argc, char **argv)
     33      1.1  christos {
     34      1.1  christos   alarm (30);
     35      1.1  christos 
     36      1.1  christos   if (vfork () != 0)
     37      1.1  christos     {
     38      1.1  christos       /* We want to guarantee that GDB processes the child exit event before
     39      1.1  christos 	 the parent's breakpoint hit event.  Make the parent wait on this
     40      1.1  christos 	 variable that is eventually set by the test.  */
     41      1.1  christos       while (!unblock_parent)
     42      1.1  christos 	usleep (1000);
     43      1.1  christos 
     44      1.1  christos       break_parent ();
     45      1.1  christos     }
     46      1.1  christos   else
     47  1.1.1.2  christos     {
     48  1.1.1.2  christos #if defined TEST_EXEC
     49  1.1.1.2  christos       char prog[PATH_MAX];
     50  1.1.1.2  christos       int len;
     51  1.1.1.2  christos 
     52  1.1.1.2  christos       strcpy (prog, argv[0]);
     53  1.1.1.2  christos       len = strlen (prog);
     54  1.1.1.2  christos       for (; len > 0; --len)
     55  1.1.1.2  christos 	{
     56  1.1.1.2  christos 	  if (prog[len - 1] == '/')
     57  1.1.1.2  christos 	    break;
     58  1.1.1.2  christos 	}
     59  1.1.1.2  christos       strcpy (&prog[len], "vforked-prog");
     60  1.1.1.2  christos       execlp (prog, prog, (char *) 0);
     61  1.1.1.2  christos       perror ("exec failed");
     62  1.1.1.2  christos       _exit (1);
     63  1.1.1.2  christos #elif defined TEST_EXIT
     64  1.1.1.2  christos       _exit (0);
     65  1.1.1.2  christos #else
     66  1.1.1.2  christos #error Define TEST_EXEC or TEST_EXIT
     67  1.1.1.2  christos #endif
     68  1.1.1.2  christos     }
     69      1.1  christos 
     70      1.1  christos   return 0;
     71      1.1  christos }
     72