Example #1
0
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;
}
Example #2
0
int main (int argc, char ** argv)
{
    PAL_HANDLE handles[3];

    if (argc == 2 && !memcmp(argv[1], "Child", 6)) {
        for (int i = 0 ; i < 3 ; i++) {
            handles[i] = DkReceiveHandle(pal_control.parent_process);
            if (handles[i])
                pal_printf("Receive Handle OK\n");
        }

        char buffer[20];

        for (int i = 0 ; i < 3 ; i++) {
            if (!handles[i])
                continue;

            memset(buffer, 0, 20);

            switch(PAL_GET_TYPE(handles[i])) {
                case pal_type_pipesrv: {
                    PAL_HANDLE pipe = DkStreamWaitForClient(handles[i]);

                    if (pipe) {
                        if (DkStreamRead(pipe, 0, 20, buffer, NULL, 0))
                            pal_printf("Receive Pipe Handle: %s\n", buffer);

                        DkObjectClose(pipe);
                    }

                    break;
                }

                case pal_type_udpsrv: {
                    char uri[20];

                    if ((DkStreamRead(handles[i], 0, 20, buffer, &uri, 20)))
                        pal_printf("Receive Socket Handle: %s\n", buffer);

                    break;
                }

                case pal_type_file:
                    if (DkStreamRead(handles[i], 0, 20, buffer, NULL, 0))
                        pal_printf("Receive File Handle: %s\n", buffer);

                    break;

                default:
                    break;
            }

            DkObjectClose(handles[i]);
        }
    } else {
        const char *args[3] = { "SendHandle", "Child", NULL };

        PAL_HANDLE child = DkProcessCreate("file:SendHandle", 0, args);

        if (child) {
            // Sending pipe handle
            handles[0] = DkStreamOpen("pipe.srv:1", PAL_ACCESS_RDWR,
                                      0, PAL_CREAT_TRY, 0);

            if (handles[0]) {
                pal_printf("Send Handle OK\n");

                if (DkSendHandle(child, handles[0])) {
                    DkObjectClose(handles[0]);
                    PAL_HANDLE pipe = DkStreamOpen("pipe:1", PAL_ACCESS_RDWR,
                                                   0, 0, 0);
                    if (pipe) {
                        DkStreamWrite(pipe, 0, 20, "Hello World", NULL);
                        DkObjectClose(pipe);
                    }
                } else {
                    DkObjectClose(handles[0]);
                }
            }

            // Sending udp handle
            handles[1] = DkStreamOpen("udp.srv:127.0.0.1:8000", PAL_ACCESS_RDWR,
                                      0, PAL_CREAT_TRY, 0);

            if (handles[1]) {
                pal_printf("Send Handle OK\n");

                if (DkSendHandle(child, handles[1])) {
                    DkObjectClose(handles[1]);
                    PAL_HANDLE socket = DkStreamOpen("udp:127.0.0.1:8000",
                                                     PAL_ACCESS_RDWR, 0, 0, 0);
                    if (socket) {
                        DkStreamWrite(socket, 0, 20, "Hello World", NULL);
                        DkObjectClose(socket);
                    }
                } else {
                    DkObjectClose(handles[1]);
                }
            }

            handles[2] = DkStreamOpen("file:to_send.tmp", PAL_ACCESS_RDWR,
                                      0600, PAL_CREAT_TRY, 0);

            if (handles[2]) {
                pal_printf("Send Handle OK\n");

                DkStreamWrite(handles[2], 0, 20, "Hello World", NULL);
                DkStreamSetLength(handles[2], 4096);

                DkSendHandle(child, handles[2]);
                DkObjectClose(handles[2]);
            }
        }

        DkObjectClose(child);
    }

    return 0;
}