54 lines
1.4 KiB
C
54 lines
1.4 KiB
C
#include "ulib.h"
|
|
|
|
/*
|
|
* Only ever spawned by fifomaster.c, with the shared pipe's handle number
|
|
* as argv[1]. Attaches its end and immediately calls a blocking read() on
|
|
* a pipe fifowriter.c (spawned alongside it, sleeping before it writes)
|
|
* has not put anything into yet -- this call must genuinely park (the
|
|
* syscall-restart path in syscall.c's sysRead, parked on pipeChannel) and
|
|
* only return once fifowriter.c's write wakes it back up, not before.
|
|
*/
|
|
|
|
static int streq(const char* a, const char* b)
|
|
{
|
|
while (*a && *a == *b) {
|
|
a++;
|
|
b++;
|
|
}
|
|
return *a == *b;
|
|
}
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
if (argc != 2) {
|
|
print("fiforeader: FAIL expected one argv (pipe handle)\n");
|
|
return 1;
|
|
}
|
|
|
|
long handle = parseDec(argv[1]);
|
|
long fd = userPipeAttach(handle, 0);
|
|
if (fd < 0) {
|
|
print("fiforeader: FAIL attach\n");
|
|
return 1;
|
|
}
|
|
|
|
print("fiforeader: attached, blocking on read\n");
|
|
char buffer[64];
|
|
long got = userRead((int)fd, buffer, sizeof(buffer) - 1);
|
|
if (got <= 0) {
|
|
print("fiforeader: FAIL read\n");
|
|
return 1;
|
|
}
|
|
buffer[got] = 0;
|
|
|
|
print("fiforeader: got: ");
|
|
print(buffer);
|
|
print("\n");
|
|
|
|
int ok = streq(buffer, "shared pipe payload");
|
|
print(ok ? "fiforeader: payload-ok\n" : "fiforeader: payload-FAIL\n");
|
|
|
|
userClose((int)fd);
|
|
return ok ? 0 : 1;
|
|
}
|