| /* wait.c -- functions for getting wait status values. |
| |
| Copyright 2011 The Go Authors. All rights reserved. |
| Use of this source code is governed by a BSD-style |
| license that can be found in the LICENSE file. |
| |
| We use C code to extract the wait status so that we can easily be |
| OS-independent. */ |
| |
| #include <stdint.h> |
| #include <sys/wait.h> |
| |
| #include "runtime.h" |
| |
| #ifndef WCOREDUMP |
| #define WCOREDUMP(status) (((status) & 0200) != 0) |
| #endif |
| |
| #ifndef WIFCONTINUED |
| #define WIFCONTINUED(x) 0 |
| #endif |
| |
| extern _Bool Exited (uint32_t *w) |
| __asm__ (GOSYM_PREFIX "syscall.WaitStatus.Exited"); |
| |
| _Bool |
| Exited (uint32_t *w) |
| { |
| return WIFEXITED (*w) != 0; |
| } |
| |
| extern _Bool Signaled (uint32_t *w) |
| __asm__ (GOSYM_PREFIX "syscall.WaitStatus.Signaled"); |
| |
| _Bool |
| Signaled (uint32_t *w) |
| { |
| return WIFSIGNALED (*w) != 0; |
| } |
| |
| extern _Bool Stopped (uint32_t *w) |
| __asm__ (GOSYM_PREFIX "syscall.WaitStatus.Stopped"); |
| |
| _Bool |
| Stopped (uint32_t *w) |
| { |
| return WIFSTOPPED (*w) != 0; |
| } |
| |
| extern _Bool Continued (uint32_t *w) |
| __asm__ (GOSYM_PREFIX "syscall.WaitStatus.Continued"); |
| |
| _Bool |
| Continued (uint32_t *w __attribute__ ((unused))) |
| { |
| return WIFCONTINUED (*w) != 0; |
| } |
| |
| extern _Bool CoreDump (uint32_t *w) |
| __asm__ (GOSYM_PREFIX "syscall.WaitStatus.CoreDump"); |
| |
| _Bool |
| CoreDump (uint32_t *w) |
| { |
| return WCOREDUMP (*w) != 0; |
| } |
| |
| extern intgo ExitStatus (uint32_t *w) |
| __asm__ (GOSYM_PREFIX "syscall.WaitStatus.ExitStatus"); |
| |
| intgo |
| ExitStatus (uint32_t *w) |
| { |
| if (!WIFEXITED (*w)) |
| return -1; |
| return WEXITSTATUS (*w); |
| } |
| |
| extern intgo Signal (uint32_t *w) |
| __asm__ (GOSYM_PREFIX "syscall.WaitStatus.Signal"); |
| |
| intgo |
| Signal (uint32_t *w) |
| { |
| if (!WIFSIGNALED (*w)) |
| return -1; |
| return WTERMSIG (*w); |
| } |
| |
| extern intgo StopSignal (uint32_t *w) |
| __asm__ (GOSYM_PREFIX "syscall.WaitStatus.StopSignal"); |
| |
| intgo |
| StopSignal (uint32_t *w) |
| { |
| if (!WIFSTOPPED (*w)) |
| return -1; |
| return WSTOPSIG (*w); |
| } |
| |
| extern intgo TrapCause (uint32_t *w) |
| __asm__ (GOSYM_PREFIX "syscall.WaitStatus.TrapCause"); |
| |
| intgo |
| TrapCause (uint32_t *w __attribute__ ((unused))) |
| { |
| #ifndef __linux__ |
| return -1; |
| #else |
| if (!WIFSTOPPED (*w) || WSTOPSIG (*w) != SIGTRAP) |
| return -1; |
| return *w >> 16; |
| #endif |
| } |