diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2016-07-23 22:10:25 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2016-07-23 22:10:25 +0300 |
commit | de23ab7bfbea6ee03ef7386c6c203a4b2b7b7116 (patch) | |
tree | ffa59bb719378f31c16783a5f05c527edc75bd67 /builtin.c | |
parent | 1d321442926fd7de2d108b65272649b4701dfbb3 (diff) | |
download | egawk-de23ab7bfbea6ee03ef7386c6c203a4b2b7b7116.tar.gz egawk-de23ab7bfbea6ee03ef7386c6c203a4b2b7b7116.tar.bz2 egawk-de23ab7bfbea6ee03ef7386c6c203a4b2b7b7116.zip |
Make return status of close on a pipe like system.
Diffstat (limited to 'builtin.c')
-rw-r--r-- | builtin.c | 37 |
1 files changed, 24 insertions, 13 deletions
@@ -2124,22 +2124,12 @@ do_system(int nargs) ; /* leave it alone, full 16 bits */ else if (do_traditional) #ifdef __MINGW32__ - ret = (((unsigned)status) & ~0xC0000000); + ret = (((unsigned)status) & ~0xC0000000); #else ret = (status / 256.0); #endif - else if (WIFEXITED(status)) - ret = WEXITSTATUS(status); /* normal exit */ - else if (WIFSIGNALED(status)) { - bool coredumped = false; -#ifdef WCOREDUMP - coredumped = WCOREDUMP(status); -#endif - /* use 256 since exit values are 8 bits */ - ret = WTERMSIG(status) + - (coredumped ? 512 : 256); - } else - ret = 0; /* shouldn't get here */ + else + ret = sanitize_exit_status(status); } if ((BINMODE & BINMODE_INPUT) != 0) @@ -4054,3 +4044,24 @@ mbc_char_count(const char *ptr, size_t numbytes) return sum; } + +/* sanitize_exit_status --- convert a 16 bit Unix exit status into something reasonable */ + +int sanitize_exit_status(int status) +{ + int ret = 0; + + if (WIFEXITED(status)) + ret = WEXITSTATUS(status); /* normal exit */ + else if (WIFSIGNALED(status)) { + bool coredumped = false; +#ifdef WCOREDUMP + coredumped = WCOREDUMP(status); +#endif + /* use 256 since exit values are 8 bits */ + ret = WTERMSIG(status) + (coredumped ? 512 : 256); + } else + ret = 0; /* shouldn't get here */ + + return ret; +} |