4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Yong Yeon Kim <yy9875.kim@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
23 * This file defines api utilities of IPC.
25 * @file media-util-ipc.c
26 * @author Haejeong Kim(backto.kim@samsung.com)
34 #include <sys/types.h>
37 #include "media-util-dbg.h"
38 #include "media-util.h"
40 #ifdef _USE_UDS_SOCKET_
41 char MEDIA_IPC_PATH[][50] ={
42 {"/tmp/media_ipc_dbbatchupdate.dat"},
43 {"/tmp/media_ipc_scandaemon.dat"},
44 {"/tmp/media_ipc_scancomm.dat"},
45 {"/tmp/media_ipc_scanner.dat"},
46 {"/tmp/media_ipc_dbupdate.dat"},
47 {"/tmp/media_ipc_thumbcreator.dat"},
48 {"/tmp/media_ipc_thumbcomm.dat"},
49 {"/tmp/media_ipc_thumbdaemon.dat"},
52 char MEDIA_IPC_PATH_CLIENT[][50] ={
53 {"/tmp/media_ipc_dbbatchupdate_client.dat"},
54 {"/tmp/media_ipc_scandaemon_client.dat"},
55 {"/tmp/media_ipc_scancomm_client.dat"},
56 {"/tmp/media_ipc_scanner_client.dat"},
57 {"/tmp/media_ipc_dbupdate_client.dat"},
58 {"/tmp/media_ipc_thumbcreator_client.dat"},
59 {"/tmp/media_ipc_thumbcomm_client.dat"},
60 {"/tmp/media_ipc_thumbdaemon_client.dat"},
62 #elif defined(_USE_UDS_SOCKET_TCP_)
63 char MEDIA_IPC_PATH[][50] ={
64 {"/tmp/media_ipc_dbbatchupdate.dat"},
65 {"/tmp/media_ipc_thumbcreator.dat"},
69 #ifdef _USE_UDS_SOCKET_
70 int ms_ipc_create_client_socket(ms_protocol_e protocol, int timeout_sec, int *sock_fd, int port)
72 int ms_ipc_create_client_socket(ms_protocol_e protocol, int timeout_sec, int *sock_fd)
77 struct timeval tv_timeout = { timeout_sec, 0 };
79 if(protocol == MS_PROTOCOL_UDP)
81 #ifdef _USE_UDS_SOCKET_
82 struct sockaddr_un serv_addr;
85 /* Create a datagram/UDP socket */
86 #ifdef _USE_UDS_SOCKET_
87 if ((sock = socket(PF_FILE, SOCK_DGRAM, 0)) < 0) {
89 if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
91 MSAPI_DBG_ERR("socket failed: %s", strerror(errno));
92 return MS_MEDIA_ERR_SOCKET_CONN;
95 #ifdef _USE_UDS_SOCKET_
96 memset(&serv_addr, 0, sizeof(serv_addr));
97 serv_addr.sun_family = AF_UNIX;
98 MSAPI_DBG("%s", MEDIA_IPC_PATH_CLIENT[port]);
99 unlink(MEDIA_IPC_PATH_CLIENT[port]);
100 strcpy(serv_addr.sun_path, MEDIA_IPC_PATH_CLIENT[port]);
102 /* Bind to the local address */
103 if (bind(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
104 MSAPI_DBG_ERR("bind failed : %s", strerror(errno));
106 return MS_MEDIA_ERR_SOCKET_CONN;
112 /*Create TCP Socket*/
113 #ifdef _USE_UDS_SOCKET_
114 if ((sock = socket(PF_FILE, SOCK_STREAM, 0)) < 0) {
116 if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
118 MSAPI_DBG_ERR("socket failed: %s", strerror(errno));
119 return MS_MEDIA_ERR_SOCKET_CONN;
123 if (timeout_sec > 0) {
124 if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv_timeout, sizeof(tv_timeout)) == -1) {
125 MSAPI_DBG_ERR("setsockopt failed: %s", strerror(errno));
127 return MS_MEDIA_ERR_SOCKET_CONN;
133 return MS_MEDIA_ERR_NONE;
136 #ifdef _USE_UDS_SOCKET_TCP_
137 int ms_ipc_create_client_tcp_socket(ms_protocol_e protocol, int timeout_sec, int *sock_fd, int port)
141 struct timeval tv_timeout = { timeout_sec, 0 };
143 /*Create TCP Socket*/
144 if ((sock = socket(PF_FILE, SOCK_STREAM, 0)) < 0) {
145 MSAPI_DBG_ERR("socket failed: %s", strerror(errno));
146 return MS_MEDIA_ERR_SOCKET_CONN;
149 if (timeout_sec > 0) {
150 if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv_timeout, sizeof(tv_timeout)) == -1) {
151 MSAPI_DBG_ERR("setsockopt failed: %s", strerror(errno));
153 return MS_MEDIA_ERR_SOCKET_CONN;
159 return MS_MEDIA_ERR_NONE;
162 int ms_ipc_create_server_tcp_socket(ms_protocol_e protocol, int port, int *sock_fd)
165 bool bind_success = false;
168 struct sockaddr_un serv_addr;
170 orig_mode = umask(0);
172 /* Create a TCP socket */
173 if ((sock = socket(PF_FILE, SOCK_STREAM, 0)) < 0) {
174 MSAPI_DBG_ERR("socket failed: %s", strerror(errno));
175 return MS_MEDIA_ERR_SOCKET_CONN;
178 memset(&serv_addr, 0, sizeof(serv_addr));
180 serv_addr.sun_family = AF_UNIX;
181 MSAPI_DBG("%s", MEDIA_IPC_PATH[port]);
182 unlink(MEDIA_IPC_PATH[port]);
183 strcpy(serv_addr.sun_path, MEDIA_IPC_PATH[port]);
185 /* Bind to the local address */
186 for (i = 0; i < 20; i ++) {
187 if (bind(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == 0) {
195 if (bind_success == false) {
196 MSAPI_DBG_ERR("bind failed : %s %d_", strerror(errno), errno);
198 return MS_MEDIA_ERR_SOCKET_CONN;
201 MSAPI_DBG("bind success");
204 if (listen(sock, SOMAXCONN) < 0) {
205 MSAPI_DBG_ERR("listen failed : %s", strerror(errno));
207 return MS_MEDIA_ERR_SOCKET_CONN;
210 MSAPI_DBG("Listening...");
215 return MS_MEDIA_ERR_NONE;
220 int ms_ipc_create_server_socket(ms_protocol_e protocol, int port, int *sock_fd)
223 bool bind_success = false;
226 #ifdef _USE_UDS_SOCKET_
227 struct sockaddr_un serv_addr;
229 struct sockaddr_in serv_addr;
231 unsigned short serv_port;
235 if(protocol == MS_PROTOCOL_UDP)
237 /* Create a datagram/UDP socket */
238 #ifdef _USE_UDS_SOCKET_
239 if ((sock = socket(PF_FILE, SOCK_DGRAM, 0)) < 0) {
241 if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
243 MSAPI_DBG_ERR("socket failed: %s", strerror(errno));
244 return MS_MEDIA_ERR_SOCKET_CONN;
249 /* Create a TCP socket */
250 #ifdef _USE_UDS_SOCKET_
251 if ((sock = socket(PF_FILE, SOCK_STREAM, 0)) < 0) {
253 if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
255 MSAPI_DBG_ERR("socket failed: %s", strerror(errno));
256 return MS_MEDIA_ERR_SOCKET_CONN;
259 #ifdef _USE_UDS_SOCKET_
261 if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &n_reuse, sizeof(n_reuse)) == -1) {
262 MSAPI_DBG_ERR("setsockopt failed: %s", strerror(errno));
264 return MS_MEDIA_ERR_SOCKET_INTERNAL;
267 memset(&serv_addr, 0, sizeof(serv_addr));
268 #ifdef _USE_UDS_SOCKET_
269 serv_addr.sun_family = AF_UNIX;
270 MSAPI_DBG("%s", MEDIA_IPC_PATH[serv_port]);
271 unlink(MEDIA_IPC_PATH[serv_port]);
272 strcpy(serv_addr.sun_path, MEDIA_IPC_PATH[serv_port]);
274 serv_addr.sin_family = AF_INET;
275 serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
276 // serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
277 serv_addr.sin_port = htons(serv_port);
279 /* Bind to the local address */
280 for (i = 0; i < 20; i ++) {
281 if (bind(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == 0) {
289 if (bind_success == false) {
290 MSAPI_DBG_ERR("bind failed : %s %d_", strerror(errno), errno);
292 return MS_MEDIA_ERR_SOCKET_CONN;
295 MSAPI_DBG("bind success");
298 if (protocol == MS_PROTOCOL_TCP) {
299 if (listen(sock, SOMAXCONN) < 0) {
300 MSAPI_DBG_ERR("listen failed : %s", strerror(errno));
302 return MS_MEDIA_ERR_SOCKET_CONN;
305 MSAPI_DBG("Listening...");
310 return MS_MEDIA_ERR_NONE;
313 #ifdef _USE_UDS_SOCKET_
314 int ms_ipc_send_msg_to_server(int sockfd, int port, ms_comm_msg_s *send_msg, struct sockaddr_un *serv_addr)
316 int ms_ipc_send_msg_to_server(int sockfd, int port, ms_comm_msg_s *send_msg, struct sockaddr_in *serv_addr)
319 int res = MS_MEDIA_ERR_NONE;
320 #ifdef _USE_UDS_SOCKET_
321 struct sockaddr_un addr;
323 struct sockaddr_in addr;
326 /* Set server Address */
327 memset(&addr, 0, sizeof(addr));
328 #ifdef _USE_UDS_SOCKET_
329 addr.sun_family = AF_UNIX;
330 strcpy(addr.sun_path, MEDIA_IPC_PATH[port]);
331 MSAPI_DBG("%s", addr.sun_path);
333 addr.sin_family = AF_INET;
334 addr.sin_addr.s_addr = inet_addr(SERVER_IP);
335 addr.sin_port = htons(port);
338 if (sendto(sockfd, send_msg, sizeof(*(send_msg)), 0, (struct sockaddr *)&addr, sizeof(addr)) != sizeof(*(send_msg))) {
339 MSAPI_DBG_ERR("sendto failed [%s]", strerror(errno));
340 res = MS_MEDIA_ERR_SOCKET_SEND;
342 MSAPI_DBG("sent %d", send_msg->result);
343 MSAPI_DBG("sent %s", send_msg->msg);
344 if (serv_addr != NULL)
351 #ifdef _USE_UDS_SOCKET_
352 int ms_ipc_send_msg_to_client(int sockfd, ms_comm_msg_s *send_msg, struct sockaddr_un *client_addr)
354 int ms_ipc_send_msg_to_client(int sockfd, ms_comm_msg_s *send_msg, struct sockaddr_in *client_addr)
357 int res = MS_MEDIA_ERR_NONE;
359 #ifdef _USE_UDS_SOCKET_
360 MSAPI_DBG("the path of client address : %s", client_addr->sun_path);
362 if (sendto(sockfd, send_msg, sizeof(*(send_msg)), 0, (struct sockaddr *)client_addr, sizeof(*(client_addr))) != sizeof(*(send_msg))) {
363 MSAPI_DBG_ERR("sendto failed [%s]", strerror(errno));
364 res = MS_MEDIA_ERR_SOCKET_SEND;
366 MSAPI_DBG("sent %d", send_msg->result);
367 MSAPI_DBG("sent %s", send_msg->msg);
370 return MS_MEDIA_ERR_NONE;
373 #ifdef _USE_UDS_SOCKET_
374 int ms_ipc_receive_message(int sockfd, void *recv_msg, unsigned int msg_size, struct sockaddr_un *recv_addr, unsigned int *addr_size)
376 int ms_ipc_receive_message(int sockfd, void *recv_msg, unsigned int msg_size, struct sockaddr_in *recv_addr, unsigned int *addr_size)
380 #ifdef _USE_UDS_SOCKET_
381 struct sockaddr_un addr;
383 struct sockaddr_in addr;
388 return MS_MEDIA_ERR_INVALID_PARAMETER;
390 #ifdef _USE_UDS_SOCKET_
391 addr_len = sizeof(addr);
393 addr_len = sizeof(struct sockaddr_in);
396 if ((recv_msg_size = recvfrom(sockfd, recv_msg, msg_size, 0, (struct sockaddr *)&addr, &addr_len)) < 0) {
397 MSAPI_DBG_ERR("recvfrom failed [%s]", strerror(errno));
398 return MS_MEDIA_ERR_SOCKET_RECEIVE;
401 #ifdef _USE_UDS_SOCKET_
402 MSAPI_DBG("the path of received client address : %s", addr.sun_path);
405 if (recv_addr != NULL)
407 if (addr_size != NULL)
408 *addr_size = addr_len;
410 return MS_MEDIA_ERR_NONE;
413 #ifdef _USE_UDS_SOCKET_
414 int ms_ipc_wait_message(int sockfd, void *recv_msg, unsigned int msg_size, struct sockaddr_un *recv_addr, unsigned int *addr_size)
416 int ms_ipc_wait_message(int sockfd, void *recv_msg, unsigned int msg_size, struct sockaddr_in *recv_addr, unsigned int *addr_size)
422 if (!recv_msg ||!recv_addr)
423 return MS_MEDIA_ERR_INVALID_PARAMETER;
425 #ifdef _USE_UDS_SOCKET_
426 addr_len = sizeof(struct sockaddr_un);
428 addr_len = sizeof(struct sockaddr_in);
431 if ((recv_msg_size = recvfrom(sockfd, recv_msg, msg_size, 0, (struct sockaddr *)recv_addr, &addr_len)) < 0) {
432 MSAPI_DBG_ERR("recvfrom failed [%s]", strerror(errno));
433 if (errno == EWOULDBLOCK) {
434 MSAPI_DBG_ERR("recvfrom Timeout.");
435 return MS_MEDIA_ERR_SOCKET_RECEIVE_TIMEOUT;
437 MSAPI_DBG_ERR("recvfrom error [%s]", strerror(errno));
438 return MS_MEDIA_ERR_SOCKET_RECEIVE;
442 if (addr_size != NULL)
443 *addr_size = addr_len;
445 return MS_MEDIA_ERR_NONE;