summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSung-hun Kim <sfoon.kim@samsung.com>2022-09-19 19:51:54 +0900
committerSeung-Woo Kim <sw0312.kim@samsung.com>2022-09-20 00:53:33 +0000
commit5641d5d99c307ab05eb93a2697f025866754e6ce (patch)
tree31cf8fc398896a70ca743c1b98125ea600933a45
parent39b88d4e37ffe12b775f7932a35cb3819486c717 (diff)
downloadpass-5641d5d99c307ab05eb93a2697f025866754e6ce.tar.gz
pass-5641d5d99c307ab05eb93a2697f025866754e6ce.tar.bz2
pass-5641d5d99c307ab05eb93a2697f025866754e6ce.zip
monitor: Use the systemd Unix socketaccepted/tizen/unified/20220920.110715
Systemd creates an Unix socket when the system is booted on by using existing configuration files in /usr/lib/systemd. Previously, the resource monitor always creates a new Unix socket whether the socket exists or not. From now on, the resource monitor checks that the Unix socket is existed on the given path. If so, it uses the Unix socket instead of open a newer one. By doing so, the permission of the Unix socket can follow the given configuration denoted in the Systemd socket configuration file. Change-Id: I1eab46cd238340cc9700e1a2d52481270c06b8b1 Signed-off-by: Sung-hun Kim <sfoon.kim@samsung.com>
-rw-r--r--src/monitor/request-handler.c36
-rw-r--r--systemd/pass-resource-monitor.socket.in4
2 files changed, 35 insertions, 5 deletions
diff --git a/src/monitor/request-handler.c b/src/monitor/request-handler.c
index f5a2138..3ffc258 100644
--- a/src/monitor/request-handler.c
+++ b/src/monitor/request-handler.c
@@ -39,6 +39,9 @@
#include <netinet/in.h>
#include <sys/time.h>
#include <assert.h>
+#include <fcntl.h>
+
+#include <systemd/sd-daemon.h>
#define PENDING_MAX 3
#define REQUEST_SERVER_PORT 10001
@@ -1083,10 +1086,30 @@ static int init_unix_socket(int *sock, struct sockaddr_un *address, int *addrlen
{
const char *server_unix_socket_path = "/run/.pass-resource-monitor.socket";
int opt = true;
+ int n = sd_listen_fds(0);
+ int fd;
+ int file_mode;
if (!sock || !address || !addrlen)
return -EINVAL;
+ bzero(address, sizeof(*address));
+ address->sun_family = AF_UNIX;
+ strncpy(address->sun_path, server_unix_socket_path, sizeof(address->sun_path));
+ address->sun_path[sizeof(address->sun_path) - 1] = '\0';
+
+ /* use the existing systemd unix socket */
+ if (n > 0) {
+ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd++) {
+ if (sd_is_socket_unix(fd, SOCK_STREAM, 1, server_unix_socket_path, 0) > 0) {
+ *sock = fd;
+ *addrlen = sizeof(*address);
+ return 0;
+ }
+ }
+ }
+
+ /* make a new unix socket */
*sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (*sock < 0) {
_E("Failed to initialize socket");
@@ -1099,11 +1122,6 @@ static int init_unix_socket(int *sock, struct sockaddr_un *address, int *addrlen
goto error_out_close;
}
- bzero(address, sizeof(*address));
- address->sun_family = AF_UNIX;
- strncpy(address->sun_path, server_unix_socket_path, sizeof(address->sun_path));
- address->sun_path[sizeof(address->sun_path) - 1] = '\0';
-
if (!access(server_unix_socket_path, F_OK))
unlink(server_unix_socket_path);
@@ -1112,6 +1130,12 @@ static int init_unix_socket(int *sock, struct sockaddr_un *address, int *addrlen
goto error_out_close;
}
+ file_mode = (S_IRWXU | S_IRWXG | S_IRWXO);
+ if (chmod(server_unix_socket_path, file_mode) < 0) {
+ _E("Failed to change the file mode of %s", server_unix_socket_path);
+ goto error_out_close;
+ }
+
if (listen(*sock, PENDING_MAX) < 0) {
_E("Failed to begin listenning");
goto error_out_close;
@@ -1124,6 +1148,8 @@ static int init_unix_socket(int *sock, struct sockaddr_un *address, int *addrlen
error_out_close:
close(*sock);
error_out:
+ bzero(address, sizeof(*address));
+
return -EIO;
}
diff --git a/systemd/pass-resource-monitor.socket.in b/systemd/pass-resource-monitor.socket.in
index 88f021a..533a720 100644
--- a/systemd/pass-resource-monitor.socket.in
+++ b/systemd/pass-resource-monitor.socket.in
@@ -8,3 +8,7 @@ ListenStream=/run/.pass-resource-monitor.socket
SocketMode=0777
SmackLabelIPIn=*
SmackLabelIPOut=@
+Service=pass.service
+
+[Install]
+WantedBy=sockets.target