tizen 2.3 release
[framework/system/deviced.git] / src / logd / src / shared / socket-helper.c
1 #include <errno.h>
2 #include <fcntl.h>
3 #include <grp.h>
4 #include <sys/socket.h>
5 #include <sys/stat.h>
6 #include <sys/types.h>
7 #include <sys/un.h>
8 #include <unistd.h>
9
10 #include "core/log.h"
11 #include "socket-helper.h"
12
13 int create_logd_socket()
14 {
15         int ret = 0;
16         struct sockaddr_un saun;
17         int old_umask = umask(~(S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP));
18         struct group *group_entry = NULL;
19         int len, sock;
20
21         if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
22                 ret = -errno;
23                 _E("Failed to create socket");
24                 return ret;
25         }
26
27         saun.sun_family = AF_UNIX;
28         strcpy(saun.sun_path, LOGD_SOCKET_PATH);
29         unlink(LOGD_SOCKET_PATH);
30
31         len = sizeof(saun.sun_family) + sizeof(saun.sun_path);
32         if (bind(sock, (const struct sockaddr*)&saun, len) < 0) {
33                 ret = -errno;
34                 _E("Failed bind socket");
35                 goto err;
36         }
37         umask(old_umask);
38
39         group_entry = getgrnam("app");
40         if (group_entry == NULL) {
41                 ret = -errno;
42                 _E("can't find app group id");
43                 goto err;
44         }
45         if (chown(LOGD_SOCKET_PATH, -1, group_entry->gr_gid) < 0) {
46                 ret = -errno;
47                 _E("can't change group");
48                 goto err;
49         }
50
51         if (listen(sock, 5) < 0) {
52                 ret = -errno;
53                 _E("Failed listen socket");
54                 goto err;
55         }
56
57         return sock;
58 err:
59         close(sock);
60         return ret;
61 }
62
63 int connect_to_logd_socket()
64 {
65         struct sockaddr_un saun;
66         int len, ret;
67         int sock;
68
69         if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
70                 ret = -errno;
71                 _E("Failed to create socket");
72                 return ret;
73         }
74         saun.sun_family = AF_UNIX;
75         strcpy(saun.sun_path, LOGD_SOCKET_PATH);
76
77         len = sizeof(saun.sun_family) + sizeof(saun.sun_path);
78         if (connect(sock, (const struct sockaddr*)&saun, len) < 0) {
79                 ret = -errno;
80                 _E("Failed connect");
81                 close(sock);
82                 return ret;
83         }
84
85         return sock;
86 }
87
88 int read_from_socket(int sock, void *buf, int size)
89 {
90         int i = 0;
91         int ret;
92
93         while (i < size) {
94                 ret = recv(sock, buf + i, size - i, 0);
95                 if (ret > 0) {
96                         i += ret;
97                 } else if (errno != EAGAIN)
98                         return -errno;
99
100         }
101         return i;
102 }