tizen 2.3 release
[framework/system/deviced.git] / src / logd / src / shared / proc-events.c
1 #include <errno.h>
2 #include <unistd.h>
3 #include <string.h>
4
5 #include "core/log.h"
6 #include "proc-events.h"
7 #include "netlink.h"
8
9 int subscribe_on_proc_events(int sock)
10 {
11         struct {
12                 struct nlmsghdr n;
13                 struct __attribute__ ((__packed__)) {
14                         struct cn_msg cn_msg;
15                         enum proc_cn_mcast_op cn_mcast;
16                 };
17         } msg;
18
19         bzero(&msg, sizeof(msg));
20         msg.n.nlmsg_len = sizeof(msg);
21         msg.n.nlmsg_pid = getpid();
22         msg.n.nlmsg_type = NLMSG_DONE;
23
24         msg.cn_msg.id.idx = CN_IDX_PROC;
25         msg.cn_msg.id.val = CN_VAL_PROC;
26         msg.cn_msg.len = sizeof(enum proc_cn_mcast_op);
27         msg.cn_mcast = PROC_CN_MCAST_LISTEN;
28
29         if (send(sock, &msg, sizeof(msg), 0) < 0) {
30                 _E("send failed");
31                 return -errno;
32         }
33
34         return 0;
35 }
36
37
38 int process_proc_event_answer(int sock,
39         int (*process_cb)(struct proc_event *e, void *user_data), void *user_data)
40 {
41         int rc;
42         struct {
43                 struct nlmsghdr nl_hdr;
44                 struct __attribute__ ((__packed__)) {
45                         struct cn_msg cn_msg;
46                         struct proc_event event;
47                 };
48         } msg;
49
50         rc = recv(sock, &msg, sizeof(msg), 0);
51         if (rc < 0 && errno != EAGAIN) {
52                 _E("recv failed");
53                 return -errno;
54         }
55
56         if (rc > 0)
57                 process_cb(&msg.event, user_data);
58
59         return 0;
60 }