ust: add info exchange between app and ustd
[ust.git] / ustd / ustd.c
1 #define _GNU_SOURCE
2
3 #include <sys/types.h>
4 #include <sys/shm.h>
5
6 #include <stdlib.h>
7 #include <stdio.h>
8 #include <string.h>
9
10 #include "localerr.h"
11 #include "ustcomm.h"
12
13 struct list_head buffers = LIST_HEAD_INIT(buffers);
14
15 struct buffer_info {
16 char *name;
17 pid_t pid;
18
19 int shmid;
20 void *mem;
21 int memlen;
22
23 int n_subbufs;
24 int subbuf_size;
25
26 int file_fd; /* output file */
27 };
28
29 int add_buffer(pid_t pid, char *bufname)
30 {
31 struct buffer_info *buf;
32 char *send_msg;
33 char *received_msg;
34 int result;
35
36 buf = (struct buffer_info *) malloc(sizeof(struct buffer_info));
37 if(buf == NULL) {
38 ERR("add_buffer: insufficient memory");
39 return -1;
40 }
41
42 buf->name = bufname;
43 buf->pid = pid;
44
45 /* get shmid */
46 asprintf(&send_msg, "get_shmid %s", buf->name);
47 send_message(pid, send_msg, &received_msg);
48 free(send_msg);
49 DBG("got buffer name %s", buf->name);
50
51 result = sscanf(received_msg, "%d", &buf->shmid);
52 if(result != 1) {
53 ERR("unable to parse response to get_shmid");
54 return -1;
55 }
56 free(received_msg);
57 DBG("got shmid %d", buf->shmid);
58
59 /* get n_subbufs */
60 asprintf(&send_msg, "get_n_subbufs %s", buf->name);
61 send_message(pid, send_msg, &received_msg);
62 free(send_msg);
63
64 result = sscanf(received_msg, "%d", &buf->n_subbufs);
65 if(result != 1) {
66 ERR("unable to parse response to get_n_subbufs");
67 return -1;
68 }
69 free(received_msg);
70 DBG("got n_subbufs %d", buf->n_subbufs);
71
72 /* get subbuf size */
73 asprintf(&send_msg, "get_subbuf_size %s", buf->name);
74 send_message(pid, send_msg, &received_msg);
75 free(send_msg);
76
77 result = sscanf(received_msg, "%d", &buf->subbuf_size);
78 if(result != 1) {
79 ERR("unable to parse response to get_subbuf_size");
80 return -1;
81 }
82 free(received_msg);
83 DBG("got subbuf_size %d", buf->subbuf_size);
84
85 /* attach memory */
86 buf->mem = shmat(buf->shmid, NULL, 0);
87 if(buf->mem == (void *) 0) {
88 perror("shmat");
89 return -1;
90 }
91 DBG("successfully attached memory");
92
93 return 0;
94 }
95
96 int main(int argc, char **argv)
97 {
98 struct ustcomm_ustd ustd;
99 int result;
100
101 result = ustcomm_init_ustd(&ustd);
102 if(result == -1) {
103 ERR("failed to initialize socket");
104 return 1;
105 }
106
107 for(;;) {
108 char *recvbuf;
109
110 ustcomm_ustd_recv_message(&ustd, &recvbuf, NULL);
111
112 if(!strncmp(recvbuf, "collect", 7)) {
113 pid_t pid;
114 char *bufname;
115 int result;
116
117 result = sscanf(recvbuf, "%*s %d %50as", &pid, &bufname);
118 if(result != 2) {
119 fprintf(stderr, "parsing error: %s\n", recvbuf);
120 }
121
122 add_buffer(pid, bufname);
123
124 }
125
126 free(recvbuf);
127 }
128
129 return 0;
130 }
This page took 0.030771 seconds and 4 git commands to generate.