1 /* Wrapper implementation for waitpid for GNU/Linux (LWP layer). 2 3 Copyright (C) 2001-2019 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #include "common/common-defs.h" 21 22 #ifdef GDBSERVER 23 /* FIXME: server.h is required for the definition of debug_threads 24 which is used in the gdbserver-specific debug printing in 25 linux_debug. This code should be made available to GDB also, 26 but the lack of a suitable flag to enable it prevents this. */ 27 #include "server.h" 28 #endif 29 30 #include "linux-nat.h" 31 #include "linux-waitpid.h" 32 #include "common/gdb_wait.h" 33 34 /* Print debugging output based on the format string FORMAT and 35 its parameters. */ 36 37 static inline void ATTRIBUTE_PRINTF (1,2) 38 linux_debug (const char *format, ...) 39 { 40 #ifdef GDBSERVER 41 if (debug_threads) 42 { 43 va_list args; 44 va_start (args, format); 45 vfprintf (stderr, format, args); 46 va_end (args); 47 } 48 #endif 49 } 50 51 /* Convert wait status STATUS to a string. Used for printing debug 52 messages only. */ 53 54 char * 55 status_to_str (int status) 56 { 57 static char buf[64]; 58 59 if (WIFSTOPPED (status)) 60 { 61 if (WSTOPSIG (status) == SYSCALL_SIGTRAP) 62 snprintf (buf, sizeof (buf), "%s (stopped at syscall)", 63 strsignal (SIGTRAP)); 64 else 65 snprintf (buf, sizeof (buf), "%s (stopped)", 66 strsignal (WSTOPSIG (status))); 67 } 68 else if (WIFSIGNALED (status)) 69 snprintf (buf, sizeof (buf), "%s (terminated)", 70 strsignal (WTERMSIG (status))); 71 else 72 snprintf (buf, sizeof (buf), "%d (exited)", WEXITSTATUS (status)); 73 74 return buf; 75 } 76 77 /* See linux-waitpid.h. */ 78 79 int 80 my_waitpid (int pid, int *status, int flags) 81 { 82 int ret, out_errno; 83 84 linux_debug ("my_waitpid (%d, 0x%x)\n", pid, flags); 85 86 do 87 { 88 ret = waitpid (pid, status, flags); 89 } 90 while (ret == -1 && errno == EINTR); 91 out_errno = errno; 92 93 linux_debug ("my_waitpid (%d, 0x%x): status(%x), %d\n", 94 pid, flags, (ret > 0 && status != NULL) ? *status : -1, ret); 95 96 errno = out_errno; 97 return ret; 98 } 99