Files

41 lines
1.5 KiB
C

#include "ulib.h"
/*
* Live ring-3 proof for shell.c's new `cmd 2> file` / `cmd 2>> file` stderr
* redirection (jobctlApplyRedirects/jobctlSpawnForegroundRedirected,
* jobctl.h): the exact mirror image of redirwriter.c's own `>`/`>>` proof,
* with fd 1 and fd 2's roles swapped -- this program writes its payload to
* fd 2 (the fd the shell redirects here) and its own diagnostics to fd 1
* (which stays on the real console in this demo, since only fd 2 is ever
* redirected). Writing the diagnostics through fd 2 would corrupt the exact
* bytes stderrreader.c later compares, the same hazard redirwriter.c avoids
* by keeping its own diagnostics off fd 1.
*
* kmain.c's stderrDriverThread runs this program TWICE against the same
* path -- once through `2>` (truncate/create) and once through `2>>`
* (append) -- so the resulting file holds two back-to-back copies of this
* same payload with no separator, proving `2>>` genuinely continues from
* the end of what `2>` already wrote rather than overwriting it.
*/
#define stderrPayload "stderr-payload-ok"
static void printOut(const char* text)
{
userWrite(1, text, stringLength(text));
}
int main(void)
{
printOut("stderrwriter: writing payload to stderr (redirected)\n");
unsigned long length = stringLength(stderrPayload);
long written = userWrite(2, stderrPayload, length);
if (written != (long)length) {
printOut("stderrwriter: FAIL short/failed write\n");
return 1;
}
printOut("stderrwriter: wrote payload\n");
return 0;
}