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:
Justine Tunney 2022-10-11 21:06:27 -07:00
parent e7329b7cba
commit b41f91c658
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
80 changed files with 1370 additions and 344 deletions

View file

@ -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);