#include "ctsvc_socket.h"
#include "ctsvc_mutex.h"
#include "ctsvc_inotify.h"
-
+#ifdef _CONTACTS_IPC_CLIENT
+#include "ctsvc_client_utils.h"
+#endif
static int __ctsvc_conn_refcnt = 0;
static int __ctsvc_sockfd = -1;
{
int ret;
struct sockaddr_un caddr;
+ uid_t uid = getuid();
+ WARN("ctsvc_socket_init: socket ref count : %d", __ctsvc_conn_refcnt);
if (0 < __ctsvc_conn_refcnt) {
__ctsvc_conn_refcnt++;
return CONTACTS_ERROR_NONE;
}
char sock_file[CTSVC_PATH_MAX_LEN] = {0};
- snprintf(sock_file, sizeof(sock_file), CTSVC_SOCK_PATH"/%s", getuid(), CTSVC_SOCKET_FILE);
+
+#ifdef _CONTACTS_IPC_CLIENT
+ if (ctsvc_client_is_in_system_session()) {
+ /* LCOV_EXCL_START */
+ if (CONTACTS_ERROR_NONE != ctsvc_client_get_active_uid(&uid))
+ return CONTACTS_ERROR_SYSTEM;
+ /* LCOV_EXCL_STOP */
+ }
+#endif
+
+ snprintf(sock_file, sizeof(sock_file), CTSVC_SOCK_PATH"/%s", uid, CTSVC_SOCKET_FILE);
bzero(&caddr, sizeof(caddr));
caddr.sun_family = AF_UNIX;
ret = connect(__ctsvc_sockfd, (struct sockaddr *)&caddr, sizeof(caddr));
if (-1 == ret) {
+ /* LCOV_EXCL_START */
ERR("connect() Fail(errno = %d)", errno);
close(__ctsvc_sockfd);
__ctsvc_sockfd = -1;
return CONTACTS_ERROR_IPC;
+ /* LCOV_EXCL_STOP */
}
__ctsvc_conn_refcnt++;
return CONTACTS_ERROR_NONE;
}
+static int __ctsvc_cancel_sim_import(int fd)
+{
+ int ret;
+ ctsvc_socket_msg_s msg = {0};
+
+ RETVM_IF(-1 == fd, CONTACTS_ERROR_IPC, "socket is not connected");
+
+ msg.type = CTSVC_SOCKET_MSG_TYPE_CANCEL_IMPORT_SIM;
+
+ ret = __ctsvc_safe_write(fd, (char *)&msg, sizeof(msg));
+ RETVM_IF(-1 == ret, CONTACTS_ERROR_IPC, "__ctsvc_safe_write() Fail(errno = %d)", errno);
+
+ return CONTACTS_ERROR_NONE;
+}
+
+static int __ctsvc_client_socket_response_handler(int fd, ctsvc_socket_msg_s *msg, contacts_sim_import_progress_cb callback, void *user_data)
+{
+ CTS_FN_CALL;
+ int ret;
+
+ do {
+ ret = __ctsvc_safe_read(fd, (char *)msg, sizeof(ctsvc_socket_msg_s));
+ RETVM_IF(-1 == ret, CONTACTS_ERROR_IPC, "__ctsvc_safe_read() Fail(errno = %d)", errno);
+ RETVM_IF(CTSVC_SOCKET_MSG_REQUEST_MAX_ATTACH < msg->attach_num, CONTACTS_ERROR_IPC,
+ "Invalid msg(attach_num = %d)", msg->attach_num);
+
+ switch (msg->type) {
+ case CTSVC_SOCKET_MSG_TYPE_REQUEST_RETURN_VALUE:
+ break;
+
+ case CTSVC_SOCKET_MSG_TYPE_REQUEST_INVOKE_CB:
+ DBG("total[%d], index[%d]", msg->val, msg->data);
+ if (callback) {
+ if (false == callback(msg->val, msg->data, user_data))
+ __ctsvc_cancel_sim_import(fd);
+ } else {
+ WARN("No callback");
+ }
+ break;
+
+ /* LCOV_EXCL_START */
+ default:
+ WARN("Unknown Type(%d), ret=%d, attach_num= %d,"
+ "attach1 = %d, attach2 = %d, attach3 = %d, attach4 = %d",
+ msg->type, msg->val, msg->attach_num,
+ msg->attach_sizes[0], msg->attach_sizes[1], msg->attach_sizes[2],
+ msg->attach_sizes[3]);
+ break;
+ /* LCOV_EXCL_STOP */
+ }
+ } while (CTSVC_SOCKET_MSG_TYPE_REQUEST_RETURN_VALUE != msg->type);
+
+ return CONTACTS_ERROR_NONE;
+}
+
static void __ctsvc_remove_invalid_msg(int fd, int size)
{
int ret;
}
}
-int ctsvc_request_sim_import(int sim_slot_no)
+int ctsvc_request_sim_import(int sim_slot_no, contacts_sim_import_progress_cb callback,
+ void *user_data)
{
int i, ret;
ctsvc_socket_msg_s msg = {0};
ret = __ctsvc_safe_write(__ctsvc_sockfd, src, msg.attach_sizes[0]);
RETVM_IF(-1 == ret, CONTACTS_ERROR_IPC, "__ctsvc_safe_write() Fail(errno = %d)", errno);
- ret = __ctsvc_socket_handle_return(__ctsvc_sockfd, &msg);
+ ret = __ctsvc_client_socket_response_handler(__ctsvc_sockfd, &msg, callback, user_data);
RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "__ctsvc_socket_handle_return() Fail(%d)", ret);
DBG("attach_num = %d", msg.attach_num);