| /* 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 | |
| } |