Add 4-byte header to messages so that we can have different message types
[nativeclient.git] / imcplugin / imcread.c
blob3f2de6bb71aa087e06983a607e3fb06562bac743
2 #include <stdio.h>
3 #include <string.h>
5 #include <sys/nacl_imc_api.h>
6 #include <sys/nacl_syscalls.h>
9 void print_string(const char *msg, int size)
11 printf("\"");
12 int i;
13 for(i = 0; i < size; i++) {
14 char c = msg[i];
15 if (32 <= c && c < 127) {
16 printf("%c", c);
18 else {
19 printf("\\x%02x", c);
22 printf("\"\n");
25 void send_message(int desc, char *data)
27 struct NaClImcMsgIoVec iov;
28 struct NaClImcMsgHdr msg;
29 iov.base = data;
30 iov.length = strlen(data);
31 msg.iov = &iov;
32 msg.iov_length = 1;
33 msg.descv = NULL;
34 msg.desc_length = 0;
36 int result = imc_sendmsg(desc, &msg, 0);
37 if(result < 0) {
38 perror("sendmsg");
42 void read_file(int desc)
44 while(1) {
45 char buf[2000];
46 int got = read(desc, buf, sizeof(buf));
47 if(got <= 0)
48 break;
49 printf("NaCl read from FD %i: ", desc);
50 print_string(buf, got);
54 void read_message(int desc)
56 char buf[2000];
57 int fds[8];
58 struct NaClImcMsgIoVec iov;
59 struct NaClImcMsgHdr msg;
60 iov.base = buf;
61 iov.length = sizeof(buf);
62 msg.iov = &iov;
63 msg.iov_length = 1;
64 msg.descv = fds;
65 msg.desc_length = 8;
67 int result = imc_recvmsg(desc, &msg, 0);
68 if(result < 0) {
69 perror("recvmsg");
71 else {
72 printf("NaCl got message: ");
73 print_string(buf, result);
74 printf("NaCl received %i FDs\n", msg.desc_length);
75 int i;
76 for(i = 0; i < msg.desc_length; i++) {
77 read_file(msg.descv[i]);
78 close(msg.descv[i]);
83 int main(int argc, char* argv[]) {
84 printf("NaCl module started\n");
85 printf("argc = %i\n", argc);
86 int i;
87 for(i = 0; i < argc; i++)
88 printf("argv[i] = \"%s\"\n", argv[i]);
89 send_message(3, "Hello from NaCl to Javascript!");
90 send_message(3, "Hello from NaCl to Javascript (message 2)");
91 read_message(3);
92 read_message(3);
93 return 0;