monitor: request-handler: Add TCP-socket handler in request-server sandbox/sebuns2/unix_socket
authorSung-hun Kim <sfoon.kim@samsung.com>
Fri, 2 Sep 2022 11:08:31 +0000 (20:08 +0900)
committerSung-hun Kim <sfoon.kim@samsung.com>
Fri, 2 Sep 2022 11:08:31 +0000 (20:08 +0900)
For Tizen resource monitor tool, TCP-socket also be supported by
pass resource-monitor. This patch adds a support for TCP-socket.

Change-Id: If8e43074d7a67de070286695adb39b57117b782d
Signed-off-by: Sung-hun Kim <sfoon.kim@samsung.com>
src/monitor/request-handler.c

index 538892b9f833759cf27b0575111fe2ab9ff91537..2251beb11c671c4c9b7587e51f4669bd5b96f05f 100644 (file)
@@ -1079,15 +1079,17 @@ static int create_request_client(int socket_fd)
        return 0;
 }
 
-static const char *server_socket_path = "/run/.pass.socket";
+static const char *server_uds_path = "/run/.pass.socket";
 
 static int request_server_func(void *ctx, void **result)
 {
        struct sockaddr_un address;
+       struct sockaddr_in ip_address;
        struct timeval wait;
        int opt = true;
        int server_socket;
-       int addrlen;
+       int tcp_socket;
+       int addrlen, ip_addrlen;
        int ret;
        fd_set fds;
 
@@ -1106,31 +1108,62 @@ static int request_server_func(void *ctx, void **result)
        if (setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR,
                        (char *)&opt, sizeof(opt)) < 0) {
                _E("Failed to setsockopt");
-               goto error_out_close;
+               goto error_out_close_server_socket;
        }
 
        bzero(&address, sizeof(address));
        address.sun_family = AF_UNIX;
-       strcpy(address.sun_path, server_socket_path);
+       strcpy(address.sun_path, server_uds_path);
 
-       if (!access(server_socket_path, F_OK))
-               unlink(server_socket_path);
+       if (!access(server_uds_path, F_OK))
+               unlink(server_uds_path);
 
        if (bind(server_socket, (struct sockaddr *)&address, sizeof(address)) < 0) {
                _E("Failed to bind");
-               goto error_out_close;
+               goto error_out_close_server_socket;
        }
 
        if (listen(server_socket, PENDING_MAX) < 0) {
                _E("Failed to begin listenning");
-               goto error_out_close;
+               goto error_out_close_server_socket;
        }
 
        addrlen = sizeof(address);
 
+       /* initialize TCP socket */
+       tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
+       if (tcp_socket < 0) {
+               _E("Failed to initialize TCP socket");
+               goto error_out_close_server_socket;
+       }
+
+       if (setsockopt(tcp_socket, SOL_SOCKET, SO_REUSEADDR,
+                       (char *)&opt, sizeof(opt)) < 0) {
+               _E("Failed to setsockopt for TCP socket");
+               goto error_out_close;
+       }
+
+       bzero(&ip_address, sizeof(ip_address));
+       ip_address.sin_family = AF_INET;
+       ip_address.sin_addr.s_addr = INADDR_ANY;
+       ip_address.sin_port = htons(REQUEST_SERVER_PORT);
+
+       if (bind(tcp_socket, (struct sockaddr *)&ip_address, sizeof(ip_address)) < 0) {
+               _E("Failed to bind for TCP socket");
+               goto error_out_close;
+       }
+
+       if (listen(tcp_socket, PENDING_MAX) < 0) {
+               _E("Failed to begin listenning for TCP socket");
+               goto error_out_close;
+       }
+
+       ip_addrlen = sizeof(address);
+
        while (g_request_server_run) {
                FD_ZERO(&fds);
                FD_SET(server_socket, &fds);
+               FD_SET(tcp_socket, &fds);
 
                wait.tv_sec = 1;
                wait.tv_usec = 0;
@@ -1152,13 +1185,28 @@ static int request_server_func(void *ctx, void **result)
 
                        create_request_client(new_socket);
                }
+
+               if (FD_ISSET(tcp_socket, &fds)) {
+                       int new_socket = accept(tcp_socket, (struct sockaddr *)&ip_address,
+                                       (socklen_t *)&ip_addrlen);
+
+                       if (new_socket < 0) {
+                               _E("Failed to accept");
+                               goto error_out_close;
+                       }
+
+                       create_request_client(new_socket);
+               }
        }
 
+       close(tcp_socket);
        close(server_socket);
 
        return THREAD_RETURN_DONE;
 
 error_out_close:
+       close(tcp_socket);
+error_out_close_server_socket:
        close(server_socket);
 error_out: