41 lines
1.5 KiB
C
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;
|
|
}
|