chiark / gitweb /
Merge mac build fix
[disorder] / lib / wstat.c
1 /*
2  * This file is part of DisOrder.
3  * Copyright (C) 2004, 2007-2009 Richard Kettlewell
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  * 
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  * 
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 /** @file lib/wstat.c
19  * @brief Convert wait status to text
20  */
21
22 #include "common.h"
23
24 #include <signal.h>
25
26 #include "mem.h"
27 #include "log.h"
28 #include "wstat.h"
29 #include "printf.h"
30
31 /** @brief Convert exit status to text
32  * @param w Exit status (e.g. from waitpid())
33  * @return Allocated string containing description of status
34  */
35 char *wstat(int w) {
36   int n;
37   char *r;
38
39   if(WIFEXITED(w))
40     n = byte_xasprintf(&r, "exited with status %d", WEXITSTATUS(w));
41   else if(WIFSIGNALED(w))
42     n = byte_xasprintf(&r, "terminated by signal %d (%s)%s",
43                  WTERMSIG(w), strsignal(WTERMSIG(w)),
44                  WCOREDUMP(w) ? " - core dumped" : "");
45   else if(WIFSTOPPED(w))
46     n = byte_xasprintf(&r, "stopped by signal %d (%s)",
47                  WSTOPSIG(w), strsignal(WSTOPSIG(w)));
48   else
49     n = byte_xasprintf(&r, "terminated with unknown wait status %#x",
50                       (unsigned)w);
51   return n >= 0 ? r : xstrdup("[could not convert wait status]");
52 }
53
54 /*
55 Local Variables:
56 c-basic-offset:2
57 comment-column:40
58 End:
59 */