Files
graphene/Pal/test/HandleSend.c

137 lines
3.8 KiB
C

/* This Hello World demostrate a simple multithread program */
#include "api.h"
#include "pal.h"
#include "pal_debug.h"
int main(int argc, char** argv) {
int nsend = 5, i;
PAL_HANDLE handles[nsend];
if (argc == 1) {
/* parent */
pal_printf("Parent: Executing the program\n");
const char* args[3] = {"HandleSend", "child", NULL};
char* data = "Hello World";
char content[20];
char uri[80];
PAL_HANDLE child;
int bytes;
pal_printf("Parent: Creating handles\n");
// Sending pipe handle
handles[0] = DkStreamOpen("pipe.srv:012", PAL_ACCESS_RDWR, 0, PAL_CREATE_TRY, 0);
if (!handles[0]) {
pal_printf("Parent: DkStreamOpen for pipe failed\n");
goto out;
}
// Sending pipe handle
handles[1] = DkStreamOpen("udp:127.0.0.1:8000", PAL_ACCESS_RDWR, 0, PAL_CREATE_TRY, 0);
if (!handles[1]) {
pal_printf("Parent: DkStreamOpen for socket failed\n");
goto out;
}
for (i = 2; i < nsend; i++) {
snprintf(uri, 80, "file:test_file_%d", i - 2);
handles[i] = DkStreamOpen(uri, PAL_ACCESS_RDWR, 0600, PAL_CREATE_TRY, 0);
if (!handles[i]) {
pal_printf("Parent: DkStreamOpen failed\n");
goto out;
}
DkStreamSetLength(handles[i], 0);
}
for (i = 0; i < nsend; i++) {
/* do some write */
snprintf(content, sizeof(content), "%s%d", data, i);
bytes = DkStreamWrite(handles[i], 0, sizeof(content), content, NULL);
if (!bytes) {
pal_printf("Parent: DKStreamWrite failed\n");
goto out;
}
DkStreamFlush(handles[i]);
}
pal_printf("Parent: Forking child\n");
child = DkProcessCreate("file:HandleSend", args);
if (!child) {
pal_printf("Parent: Failed creating process\n");
DkProcessExit(1);
}
for (i = 0; i < nsend; i++) {
pal_printf("Parent: Sending Handle %d\n", i);
if (!DkSendHandle(child, handles[i])) {
pal_printf("Send handle failed\n");
goto out;
}
DkObjectClose(handles[i]);
}
pal_printf("Parent: Finished execution\n");
DkObjectClose(child);
} else {
/* child */
PAL_HANDLE parent = pal_control.parent_process;
for (i = 0; i < nsend; i++) {
pal_printf("Child: Receiving Handle %d\n", i);
handles[i] = DkReceiveHandle(parent);
if (!handles[i]) {
pal_printf("Child: Failed receiving handle\n");
DkProcessExit(1);
}
}
pal_printf("Child: Reading the handles\n");
for (i = 0; i < nsend; i++) {
/* do some read */
pal_printf("Child: Handle %d Type ", i);
char data[20];
switch (PAL_GET_TYPE(handles[i])) {
case pal_type_file:
if ((DkStreamRead(handles[i], 0, 20, data, NULL, 0)))
pal_printf("File Data: %s\n", data);
else
pal_printf("Couldn't read\n");
break;
case pal_type_pipesrv:
pal_printf("Pipe\n");
break;
case pal_type_udp:
pal_printf("Udp\n");
break;
default:
pal_printf("Unknown\n");
}
DkObjectClose(handles[i]);
}
pal_printf("Child: Finished execution\n\n");
DkObjectClose(parent);
}
out:
for (i = 0; i < nsend; i++) {
DkObjectClose(handles[i]);
}
return 0;
}