mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-24 14:22:28 +00:00
Greatly expand system() shell code features
The cosmopolitan command interpreter now has 13 builtin commands, variable support, support for ; / && / || syntax, asynchronous support, and plenty of unit tests with bug fixes. This change fixes a bug in posix_spawn() with null envp arg. strace logging now uses atomic writes for scatter functions. Breaking change renaming GetCpuCount() to _getcpucount(). TurfWar is now updated to use the new token bucket algorithm. WIN32 affinity masks now inherit across fork() and execve().
This commit is contained in:
parent
e7329b7cba
commit
b41f91c658
80 changed files with 1370 additions and 344 deletions
|
@ -38,24 +38,41 @@ COSMOPOLITAN_C_START_
|
|||
* _Exit(1);
|
||||
* EXITS(1);
|
||||
* }
|
||||
*
|
||||
* The above are shorthand for:
|
||||
*
|
||||
* TEST(my, test) {
|
||||
* SPAWN(fork);
|
||||
* // communicate with parent
|
||||
* PARENT();
|
||||
* // communicate with child
|
||||
* WAIT(exit, 0)
|
||||
* }
|
||||
*
|
||||
* These macros cause a local variable named `child` with the child pid
|
||||
* to be defined.
|
||||
*/
|
||||
|
||||
#define SPAWN(METHOD) \
|
||||
{ \
|
||||
int _pid, _failed = g_testlib_failed; \
|
||||
ASSERT_NE(-1, (_pid = METHOD())); \
|
||||
if (!_pid) {
|
||||
#define SPAWN(METHOD) \
|
||||
{ \
|
||||
int child, _failed = g_testlib_failed; \
|
||||
ASSERT_NE(-1, (child = METHOD())); \
|
||||
if (!child) {
|
||||
|
||||
#define EXITS(rc) \
|
||||
_Exit(MAX(0, MIN(255, g_testlib_failed - _failed))); \
|
||||
} \
|
||||
testlib_waitforexit(__FILE__, __LINE__, #rc, rc, _pid); \
|
||||
#define EXITS(CODE) \
|
||||
PARENT() \
|
||||
WAIT(exit, CODE)
|
||||
|
||||
#define TERMS(SIG) \
|
||||
PARENT() \
|
||||
WAIT(term, SIG)
|
||||
|
||||
#define PARENT() \
|
||||
_Exit(MAX(0, MIN(255, g_testlib_failed - _failed))); \
|
||||
}
|
||||
|
||||
#define TERMS(sig) \
|
||||
_Exit(MAX(0, MIN(255, g_testlib_failed - _failed))); \
|
||||
} \
|
||||
testlib_waitforterm(__FILE__, __LINE__, #sig, sig, _pid); \
|
||||
#define WAIT(KIND, CODE) \
|
||||
testlib_waitfor##KIND(__FILE__, __LINE__, #CODE, CODE, child); \
|
||||
}
|
||||
|
||||
void testlib_waitforexit(const char *, int, const char *, int, int);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue