Files
graphene/Pal/test/HandleSend.c
T
Chia-Che Tsai 7f19f62f31 beta version 0.2
Plenty of bugfixes for Linux kernel later than 3.5 and Ubuntu later than 10.10.
More organized code to improve portability.
Regression tests for Pal to test completeness of implementation.
2015-05-20 14:15:52 -04:00

146 lines
4.1 KiB
C

/* -*- mode:c; c-file-style:"k&r"; c-basic-offset: 4; tab-width:4; indent-tabs-mode:nil; mode:auto-fill; fill-column:78; -*- */
/* vim: set ts=4 sw=4 et tw=78 fo=cqt wm=0: */
/* This Hello World demostrate a simple multithread program */
#include "pal.h"
#include "pal_debug.h"
#include "api.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_CREAT_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_CREAT_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_CREAT_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", 0, 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;
}