{"media-server/media_ipc_dcmdaemon.socket"},
{"media-server/media_ipc_dcmcomm.socket"},
};
+#define DCM_MAX_RETRY 100
int dcm_ipc_receive_message(int client_sock, dcmMsg *recv_msg)
{
- int recv_msg_size = 0;
-
- if ((recv_msg_size = read(client_sock, recv_msg, sizeof(dcmMsg))) < 0) {
- if (errno == EWOULDBLOCK) {
- dcm_error("Timeout. Can't try any more");
- return MS_MEDIA_ERR_SOCKET_RECEIVE_TIMEOUT;
- } else {
- dcm_stderror("recv failed");
- return MS_MEDIA_ERR_SOCKET_RECEIVE;
- }
- }
- dcm_sec_debug("[receive msg] type[%d] pid[%d] uid[%d] msg[%.*s]", recv_msg->msg_type, recv_msg->pid, recv_msg->uid, MAX_FILEPATH_LEN, (recv_msg->msg) ? recv_msg->msg : "NULL");
-
- if (!(recv_msg->msg_type >= 0 && recv_msg->msg_type < DCM_MSG_MAX)) {
- dcm_error("IPC message is wrong!");
- return MS_MEDIA_ERR_INVALID_IPC_MESSAGE;
+ if (read(client_sock, recv_msg, sizeof(dcmMsg)) < 0) {
+ dcm_stderror("recv failed");
+ return MS_MEDIA_ERR_IPC;
}
return MS_MEDIA_ERR_NONE;
}
-int dcm_ipc_accept_socket(int serv_sock, int* client_sock)
+int dcm_ipc_accept_socket(int serv_sock, int *client_sock)
{
DCM_CHECK_VAL(client_sock, MS_MEDIA_ERR_INVALID_PARAMETER);
int sockfd = -1;
if ((sockfd = accept(serv_sock, (struct sockaddr*)&client_addr, &client_addr_len)) < 0) {
dcm_stderror("accept failed");
*client_sock = -1;
- return MS_MEDIA_ERR_SOCKET_ACCEPT;
+ return MS_MEDIA_ERR_IPC;
}
*client_sock = sockfd;
DCM_CHECK_VAL(socket_fd, MS_MEDIA_ERR_INVALID_PARAMETER);
int sock = -1;
struct sockaddr_un serv_addr;
- gboolean bind_success = false;
int i = 0;
/* Create a new TCP socket */
if ((sock = socket(PF_FILE, SOCK_STREAM, 0)) < 0) {
dcm_stderror("socket failed");
- return MS_MEDIA_ERR_SOCKET_INTERNAL;
+ return MS_MEDIA_ERR_IPC;
}
/* Set socket address */
DCM_SAFE_STRLCPY(serv_addr.sun_path, tzplatform_mkpath(TZ_SYS_RUN, DCM_IPC_PATH[port]), sizeof(serv_addr.sun_path));
/* Bind socket to local address */
- for (i = 0; i < 100; i++) {
- if (bind(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == 0) {
- bind_success = true;
+ for (i = 0; i < DCM_MAX_RETRY; i++) {
+ if (bind(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == 0)
break;
- }
+
dcm_debug("#%d bind", i);
usleep(250000);
}
- if (bind_success == false) {
+ if (i == DCM_MAX_RETRY) {
dcm_stderror("bind failed");
close(sock);
- return MS_MEDIA_ERR_SOCKET_BIND;
+ return MS_MEDIA_ERR_IPC;
}
+
dcm_debug("bind success");
/* Listen */
if (listen(sock, SOMAXCONN) < 0) {
dcm_stderror("listen failed");
close(sock);
- return MS_MEDIA_ERR_SOCKET_INTERNAL;
+ return MS_MEDIA_ERR_IPC;
}
dcm_debug("Listening...");
/* Send msg to the socket */
if (send(socket_fd, &send_msg, sizeof(send_msg), 0) != sizeof(send_msg)) {
dcm_stderror("send failed");
- return MS_MEDIA_ERR_SOCKET_SEND;
+ return MS_MEDIA_ERR_IPC;
}
dcm_debug("Sent result [%d]", send_msg.result);
/* Create a new UDS socket */
if ((socket_fd = socket(PF_FILE, SOCK_STREAM, 0)) < 0) {
dcm_stderror("socket failed");
- return MS_MEDIA_ERR_SOCKET_SEND;
+ return MS_MEDIA_ERR_IPC;
}
/* Set dcm thread socket address */
if (connect(socket_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
dcm_stderror("connect error");
close(socket_fd);
- return MS_MEDIA_ERR_SOCKET_CONN;
+ return MS_MEDIA_ERR_IPC;
}
/* Send msg to the socket */
if (send(socket_fd, &send_msg, sizeof(send_msg), 0) != sizeof(send_msg)) {
dcm_stderror("send failed");
close(socket_fd);
- return MS_MEDIA_ERR_SOCKET_SEND;
+ return MS_MEDIA_ERR_IPC;
}
close(socket_fd);
void dcm_ipc_close_socket(int socket_fd)
{
- if (socket_fd < 0) {
- dcm_error("The socket has been closed already.");
- return;
- }
-
- close(socket_fd);
+ if (socket_fd != -1)
+ close(socket_fd);
}
static void __dcm_svc_kill_service(void)
{
- if (g_dcm_svc_mainloop != NULL) {
+ if (g_dcm_svc_mainloop) {
dcm_warn("Shutting down DCM Service");
g_main_loop_quit(g_dcm_svc_mainloop);
}
}
-gboolean dcm_service_recieve_request(GIOChannel *src, GIOCondition condition, gpointer data)
+static gboolean __dcm_service_recieve_request(GIOChannel *src, GIOCondition condition, gpointer data)
{
dcmMsg recv_msg;
int sock = -1;
memset((void *)&recv_msg, 0, sizeof(recv_msg));
sock = g_io_channel_unix_get_fd(src);
- if (sock < 0) {
- dcm_error("sock fd is invalid!");
- return TRUE;
- }
+ dcm_retvm_if(sock < 0, G_SOURCE_CONTINUE, "sock fd is invalid!");
/* Accept tcp client socket */
ret = dcm_ipc_accept_socket(sock, &client_sock);
- if (ret != MS_MEDIA_ERR_NONE) {
- dcm_error("Failed to accept tcp socket! err: %d", ret);
- return TRUE;
- }
+ dcm_retvm_if(ret != MS_MEDIA_ERR_NONE, G_SOURCE_CONTINUE, "Failed to accept tcp socket! err: %d", ret);
if (dcm_ipc_receive_message(client_sock, &recv_msg) != MS_MEDIA_ERR_NONE) {
dcm_error("getRecvMsg failed");
- dcm_ipc_close_socket(client_sock);
- return TRUE;
+ goto ERROR;
}
dcm_sec_info("msg_type[%d] uid[%d] msg[%.*s]", recv_msg.msg_type, recv_msg.uid, MAX_FILEPATH_LEN, recv_msg.msg);
dcm_debug("Invalid message(%d)", recv_msg.msg_type);
}
+ERROR:
dcm_ipc_close_socket(client_sock);
- return TRUE;
+ return G_SOURCE_CONTINUE;
}
int main(int argc, char *argv[])
source = g_io_create_watch(channel, G_IO_IN);
/* Set callback to be called when socket is readable */
- g_source_set_callback(source, (GSourceFunc)dcm_service_recieve_request, NULL, NULL);
+ g_source_set_callback(source, (GSourceFunc)__dcm_service_recieve_request, NULL, NULL);
g_source_attach(source, context);
if (dcm_face_detect_initialize() != MS_MEDIA_ERR_NONE)