Tizen 2.1 base
authorJinkun Jang <jinkun.jang@samsung.com>
Tue, 12 Mar 2013 16:46:28 +0000 (01:46 +0900)
committerJinkun Jang <jinkun.jang@samsung.com>
Tue, 12 Mar 2013 16:46:28 +0000 (01:46 +0900)
app-checker.manifest [new file with mode: 0644]
debian/changelog
include/app-checker-server.h
include/app-checker.h
include/internal.h
packaging/app-checker.spec
src/ac_lib.c
src/ac_server.c
src/ac_sock.c

diff --git a/app-checker.manifest b/app-checker.manifest
new file mode 100644 (file)
index 0000000..97e8c31
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
index b25b9a5..d6e34cc 100755 (executable)
@@ -1,7 +1,64 @@
-app-checker (0.0.5-1) unstable; urgency=low
+app-checker (0.0.8) unstable; urgency=low
 
-  * Initial release
-  * Git: pkgs/a/app-checker
-  * Tag: app-check_0.0.5-1
+  * Fixed compile warnings
+  * Git: slp/pkgs/a/app-checker
+  * Tag: app-checker_0.0.8
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com>  Tue, 20 Mar 2012 13:42:36 +0900
+
+app-checker (0.0.7) unstable; urgency=low
+
+  * Fix bug (memset)
+  * Git: slp/pkgs/a/app-checker
+  * Tag: app-checker_0.0.7
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com>  Fri, 02 Mar 2012 18:09:01 +0900
+
+app-checker (0.0.6) unstable; urgency=low
+
+  * Added TC
+  * Git: slp/pkgs/a/app-checker
+  * Tag: app-checker_0.0.6
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com>  Mon, 19 Dec 2011 19:06:25 +0900
+
+app-checker (0.0.5) unstable; urgency=low
+
+  * Changed boilerplate
+  * Git: 165.213.180.234:slp/pkgs/a/app-checker
+  * Tag: app-checker_0.0.5
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com>  Mon, 05 Dec 2011 16:35:25 +0900
+
+app-checker (0.0.4) unstable; urgency=low
+
+  * Fix svace bugs
+  * Git: 165.213.180.234:slp/pkgs/a/app-checker
+  * Tag: app-checker_0.0.4 
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com>  Tue, 25 Oct 2011 19:04:37 +0900
+
+app-checker (0.0.3) unstable; urgency=low
+
+  * Fix memory leak
+  * Git: 165.213.180.234:slp/pkgs/a/app-checker
+  * Tag: app-checker_0.0.3 
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com>  Tue, 25 Oct 2011 16:36:06 +0900
+
+app-checker (0.0.2) unstable; urgency=low
+
+  * add plugin directory
+  * Git: 165.213.180.234:slp/pkgs/a/app-checker
+  * Tag: app-checker_0.0.2 
+
+ -- root <jaeho81.lee@samsung.com>  Mon, 17 Oct 2011 19:09:13 +0900
+
+app-checker (0.0.1) unstable; urgency=low
+
+  * initial update
+  * Git: 165.213.180.234:slp/pkgs/a/app-checker
+  * Tag: app-checker_0.0.1
+
+ -- Jaeho Lee <jaeho81.lee@samsung.com>  Tue, 19 Jul 2011 10:23:24 +0900
 
- -- Jaeho Lee <jaeho81.lee@samsung.com>  Wed, 07 Dec 2011 13:41:34 +0900
index 4667fab..a1f4614 100755 (executable)
@@ -32,7 +32,8 @@ typedef enum _ac_return_val {
        AC_R_OK = 0                     /**< General success */
 }ac_return_val;
 
-int ac_server_initailize();
+int ac_server_initialize();
+int ac_server_check_launch_privilege(const char *pkg_name, const char *pkg_type, int pid);
 
 #ifdef __cpulusplus
        }
index b3c4fe0..9ae03be 100755 (executable)
@@ -36,7 +36,7 @@ typedef enum _ac_return_val {
        AC_R_OK = 0                     /**< General success */
 }ac_return_val;
 
-int ac_check_launch_privilege(const char *pkg_name, const char *pkg_type, int pid);
+int ac_check_launch_privilege(const char *appid, const char *pkg_type, int pid);
 
 int ac_register_launch_privilege(const char *pkg_name, const char *pkg_type);
 
index 54ce035..731263d 100755 (executable)
@@ -28,7 +28,7 @@
 #include <dlog.h>\r
 \r
 #undef LOG_TAG\r
-#define LOG_TAG "APP-CHECKER"\r
+#define LOG_TAG "APP_CHECKER"
 \r
 #define MAX_PACKAGE_STR_SIZE 512\r
 #define MAX_PACKAGE_TYPE_SIZE 128\r
@@ -39,8 +39,8 @@ struct ac_data {
        int pid;\r
 };\r
 \r
-#define _E(fmt, arg...) LOGE("[%s,%d] "fmt,__FUNCTION__,__LINE__,##arg)\r
-#define _D(fmt, arg...) LOGD("[%s,%d] "fmt,__FUNCTION__,__LINE__,##arg)\r
+#define _E(fmt, arg...) LOGE(fmt,##arg)
+#define _D(fmt, arg...) LOGD(fmt,##arg)
 \r
 #define retvm_if(expr, val, fmt, arg...) do { \\r
        if(expr) { \\r
index 6f3de2a..68de8b4 100644 (file)
@@ -1,9 +1,9 @@
 Name:      app-checker
 Summary:    App Checker
-Version:    0.0.2
+Version:    0.0.16
 Release:    1
 Group:      System/Libraries
-License:    SAMSUNG
+License:    Apache License, Version 2.0
 Source0:    %{name}-%{version}.tar.gz
 
 Requires(post): /sbin/ldconfig
@@ -60,14 +60,17 @@ rm -rf %{buildroot}
 %make_install
 
 
-%post -p /sbin/ldconfig
+%post
+
+/sbin/ldconfig
+mkdir -p /usr/lib/ac-plugins
 
 %postun -p /sbin/ldconfig
 
 
 %files
+%manifest app-checker.manifest
 %defattr(-,root,root,-)
-/usr/bin/ac_test
 /usr/lib/libapp-checker.so.0
 /usr/lib/libapp-checker.so.0.1.0
 
@@ -78,6 +81,7 @@ rm -rf %{buildroot}
 /usr/include/app-checker/app-checker.h
 
 %files server
+%manifest app-checker.manifest
 %defattr(-,root,root,-)
 /usr/lib/libapp-checker-server.so.0
 /usr/lib/libapp-checker-server.so.0.1.0
index 0861b55..cfb92b3 100755 (executable)
 static int app_send_cmd(const char *pkg_name, const char *pkg_type, int pid, int cmd)
 {
        int ret = -1;
-       char *data;
+       unsigned char *data;
        struct ac_data ad;
 
-       strncpy(ad.pkg_name, pkg_name, MAX_PACKAGE_STR_SIZE);
-       strncpy(ad.pkg_type, pkg_type, MAX_PACKAGE_TYPE_SIZE);
+       memset(&ad, 0, sizeof(ad));
+
+       strncpy(ad.pkg_name, pkg_name, MAX_PACKAGE_STR_SIZE-1);
+       strncpy(ad.pkg_type, pkg_type, MAX_PACKAGE_TYPE_SIZE-1);
        ad.pid = pid;
 
-       data = g_base64_encode(&ad, sizeof(ad));
-       
-       if ((ret = _app_send_raw(cmd, data, strnlen(data, AC_SOCK_MAXBUFF - 8))) < 0) {
+       data = (unsigned char *)g_base64_encode((const guchar *)&ad, sizeof(ad));
+
+       if ((ret = _app_send_raw(cmd, data, (int)strnlen((char *)data, AC_SOCK_MAXBUFF - 8))) < 0) {
                switch (ret) {
                case -EINVAL:
                        ret = AC_R_EINVAL;
@@ -68,14 +70,14 @@ static int app_send_cmd(const char *pkg_name, const char *pkg_type, int pid, int
        return ret;
 }
 
-SLPAPI int ac_check_launch_privilege(const char *pkg_name, const char *pkg_type, int pid)
+SLPAPI int ac_check_launch_privilege(const char *appid, const char *pkg_type, int pid)
 {
        int ret = -1;
 
-       if(pkg_name == NULL || pkg_type == NULL)
+       if(appid == NULL || pkg_type == NULL)
                return AC_R_EINVAL;
 
-       ret = app_send_cmd(pkg_name, pkg_type, pid, AC_CHECK);
+       ret = app_send_cmd(appid, pkg_type, pid, AC_CHECK);
 
        return ret;
 }
index 531a487..b33f368 100755 (executable)
@@ -162,7 +162,7 @@ static gboolean __ac_handler(gpointer data)
                return FALSE;
        }
 
-       ad = (struct ac_data *)g_base64_decode(pkt->data, &size);
+       ad = (struct ac_data *)g_base64_decode((const gchar*)pkt->data, (gsize *)&size);
 
        _D("cmd : %d, pkgname : %s, pkgtype : %s", pkt->cmd, ad->pkg_name, ad->pkg_type);
 
@@ -289,7 +289,7 @@ int __initialize()
 
        DIR *dp;
        struct dirent *dentry;
-       DIR *sub_dp;
+       DIR *sub_dp = NULL;
        struct dirent *sub_dentry;
        char buf[MAX_LOCAL_BUFSZ];
        char buf2[MAX_LOCAL_BUFSZ];
@@ -314,6 +314,7 @@ int __initialize()
                type_t = malloc(sizeof(ac_type_list_t));
                if(type_t == NULL) {
                        __pkt_type_list_free();
+                       closedir(dp);
                        return AC_R_ERROR;
                }
                memset(type_t, 0, sizeof(ac_type_list_t));
@@ -323,6 +324,11 @@ int __initialize()
                pkg_type_list = g_slist_append(pkg_type_list, (void *)type_t);
                
                sub_dp = opendir(buf);
+               if (sub_dp == NULL) {
+                       __pkt_type_list_free();
+                       closedir(dp);
+                       return AC_R_ERROR;
+               }
                
                while ((sub_dentry = readdir(sub_dp)) != NULL) {
                        
@@ -337,9 +343,13 @@ int __initialize()
                        so_t = malloc(sizeof(ac_so_list_t));
                        if(so_t == NULL) {
                                __pkt_type_list_free();
+                               dlclose(handle);
+                               handle = NULL;
+                               closedir(sub_dp);
+                               closedir(dp);
                                return AC_R_ERROR;
                        }
-                       memset(type_t, 0, sizeof(ac_so_list_t));
+                       memset(so_t, 0, sizeof(ac_so_list_t));
                        so_t->so_name = strdup(sub_dentry->d_name);
                        so_t->ac_check = dlsym(handle, "check_launch_privilege");
                        so_t->ac_register = dlsym(handle, "check_register_privilege");
@@ -348,12 +358,14 @@ int __initialize()
                        type_t->so_list = g_slist_append(type_t->so_list, (void *)so_t);
                        handle = NULL;
                }
+               closedir(sub_dp);
        }
+       closedir(dp);
 
        return AC_R_OK;
 }
 
-SLPAPI int ac_server_initailize()
+SLPAPI int ac_server_initialize()
 {
        int ret = AC_R_OK;
        
@@ -362,3 +374,12 @@ SLPAPI int ac_server_initailize()
        return ret;
 }
 
+SLPAPI int ac_server_check_launch_privilege(const char *pkg_name, const char *pkg_type, int pid)
+{
+       int ret = -1;
+       ret = __check_launch_privilege(pkg_name, pkg_type, pid);
+
+       return ret;
+}
+
+
index bd17a7c..ce81406 100755 (executable)
  * limitations under the License.
  *
  */
-\r
-\r
-#include <sys/types.h>\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <sys/stat.h>\r
-#include <errno.h>\r
-#include <fcntl.h>\r
-\r
-\r
-#include "ac_sock.h"\r
-#include "internal.h"\r
-\r
-static int __connect_client_sock(int sockfd, const struct sockaddr *saptr, socklen_t salen,\r
-                  int nsec);\r
-\r
-static inline void __set_sock_option(int fd, int cli)\r
-{\r
-       int size;\r
-       struct timeval tv = { 5, 200 * 1000 };  /*  5.2 sec */\r
-\r
-       size = AC_SOCK_MAXBUFF;\r
-       setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size));\r
-       setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));\r
-       if (cli)\r
-               setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));\r
-}\r
-\r
-int _create_server_sock()\r
-{\r
-       struct sockaddr_un saddr;\r
-       struct sockaddr_un p_saddr;\r
-       int fd;\r
-\r
-       fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);\r
-       /*  support above version 2.6.27*/\r
-       if (fd < 0) {\r
-               if(errno == EINVAL) {\r
-                       fd = socket(AF_UNIX, SOCK_STREAM, 0);\r
-                       if(fd < 0) {\r
-                               _E("second chance - socket create error");\r
-                               return -1;\r
-                       }\r
-               } else {\r
-                       _E("socket error");\r
-                       return -1;\r
-               }\r
-       }\r
-\r
-       bzero(&saddr, sizeof(saddr));\r
-       saddr.sun_family = AF_UNIX;\r
-       snprintf(saddr.sun_path, UNIX_PATH_MAX, "%s",AC_SOCK_NAME);\r
-       unlink(saddr.sun_path);\r
-       \r
-       if (bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) {\r
-               _E("bind error");\r
-               return -1;\r
-       }\r
-\r
-       if (chmod(saddr.sun_path, (S_IRWXU | S_IRWXG | S_IRWXO)) < 0) {\r
-               /* Flawfinder: ignore*/\r
-               _E("failed to change the socket permission");\r
-               return -1;\r
-       }\r
-\r
-       __set_sock_option(fd, 0);\r
-\r
-       if (listen(fd, 10) == -1) {\r
-               _E("listen error");\r
-               return -1;\r
-       }       \r
-\r
-       return fd;\r
-}\r
-\r
-int _create_client_sock()\r
-{\r
-       int fd = -1;\r
-       struct sockaddr_un saddr = { 0, };\r
-       int retry = 1;\r
-       int ret = -1;\r
-\r
-       fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);    \r
-       /*  support above version 2.6.27*/\r
-       if (fd < 0) {\r
-               if (errno == EINVAL) {\r
-                       fd = socket(AF_UNIX, SOCK_STREAM, 0);\r
-                       if (fd < 0) {\r
-                               _E("second chance - socket create error");\r
-                               return -1;\r
-                       }\r
-               } else {\r
-                       _E("socket error");\r
-                       return -1;\r
-               }\r
-       }\r
-\r
-       saddr.sun_family = AF_UNIX;\r
-       snprintf(saddr.sun_path, UNIX_PATH_MAX, "%s", AC_SOCK_NAME);\r
- retry_con:\r
-       ret = __connect_client_sock(fd, (struct sockaddr *)&saddr, sizeof(saddr),\r
-                       100 * 1000);\r
-       if (ret < -1) {\r
-               _E("maybe peer not launched or peer daed\n");\r
-               if (retry > 0) {\r
-                       usleep(100 * 1000);\r
-                       retry--;\r
-                       goto retry_con;\r
-               }\r
-       }\r
-       if (ret < 0) {\r
-               close(fd);\r
-               return -1;\r
-       }\r
-\r
-       __set_sock_option(fd, 1);\r
-\r
-       return fd;\r
-}\r
-\r
-static int __connect_client_sock(int fd, const struct sockaddr *saptr, socklen_t salen,\r
-                  int nsec)\r
-{\r
-       int flags;\r
-       int ret;\r
-       int error;\r
-       socklen_t len;\r
-       fd_set readfds;\r
-       fd_set writefds;\r
-       struct timeval timeout;\r
-\r
-       flags = fcntl(fd, F_GETFL, 0);\r
-       fcntl(fd, F_SETFL, flags | O_NONBLOCK);\r
-\r
-       error = 0;\r
-       if ((ret = connect(fd, (struct sockaddr *)saptr, salen)) < 0) {\r
-               if (errno != EAGAIN && errno != EINPROGRESS) {\r
-                       fcntl(fd, F_SETFL, flags);      \r
-                       return (-2);\r
-               }\r
-       }\r
-\r
-       /* Do whatever we want while the connect is taking place. */\r
-       if (ret == 0)\r
-               goto done;      /* connect completed immediately */\r
-\r
-       FD_ZERO(&readfds);\r
-       FD_SET(fd, &readfds);\r
-       writefds = readfds;\r
-       timeout.tv_sec = 0;\r
-       timeout.tv_usec = nsec;\r
-\r
-       if ((ret = select(fd + 1, &readfds, &writefds, NULL, \r
-                       nsec ? &timeout : NULL)) == 0) {\r
-               close(fd);      /* timeout */\r
-               errno = ETIMEDOUT;\r
-               return (-1);\r
-       }\r
-\r
-       if (FD_ISSET(fd, &readfds) || FD_ISSET(fd, &writefds)) {\r
-               len = sizeof(error);\r
-               if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)\r
-                       return (-1);    /* Solaris pending error */\r
-       } else\r
-               return (-1);    /* select error: sockfd not set*/\r
-\r
- done:\r
-       fcntl(fd, F_SETFL, flags);      \r
-       if (error) {\r
-               close(fd);      \r
-               errno = error;\r
-               return (-1);\r
-       }\r
-       return (0);\r
-}\r
-\r
-/**\r
- * @brief      Send data (in raw) to the process with 'pid' via socket\r
- */\r
-int _app_send_raw(int cmd, unsigned char *data, int datalen)\r
-{\r
-       int fd;\r
-       int len;\r
-       int res = 0;\r
-       ac_pkt_t *pkt = NULL;\r
-\r
-       if (data == NULL || datalen > AC_SOCK_MAXBUFF - 8) {\r
-               _E("keybundle error\n");\r
-               return -EINVAL;\r
-       }\r
-\r
-       fd = _create_client_sock();\r
-       if (fd < 0)\r
-               return -ECOMM;\r
-\r
-       pkt = (ac_pkt_t *) malloc(sizeof(char) * AC_SOCK_MAXBUFF);\r
-       if (NULL == pkt) {\r
-               _E("Malloc Failed!");\r
-               return -ENOMEM;\r
-       }\r
-       memset(pkt, 0, AC_SOCK_MAXBUFF);\r
-\r
-       pkt->cmd = cmd;\r
-       pkt->len = datalen;\r
-       memcpy(pkt->data, data, datalen);\r
-\r
-       if ((len = send(fd, pkt, datalen + 8, 0)) != datalen + 8) {\r
-               _E("sendto() failed - %d %d", len, datalen + 8);\r
-               if (errno == EPIPE) {\r
-                       _E("fd:%d\n", fd);\r
-               }\r
-               close(fd);\r
-               if (pkt) {\r
-                       free(pkt);\r
-                       pkt = NULL;\r
-               }\r
-               return -ECOMM;\r
-       }\r
-       if (pkt) {\r
-               free(pkt);\r
-               pkt = NULL;\r
-       }\r
-\r
-       len = recv(fd, &res, sizeof(int), 0);\r
-       if (len == -1) {\r
-               if (errno == EAGAIN) {\r
-                       _E("recv timeout \n");\r
-                       res = -EAGAIN;\r
-               } else {\r
-                       _E("recv error\n");\r
-                       res = -ECOMM;\r
-               }\r
-       } else\r
-               _D("recv result  = %d (%d)", res, len);\r
-       close(fd);\r
-\r
-       return res;\r
-}\r
-\r
-ac_pkt_t *_app_recv_raw(int fd, int *clifd, struct ucred *cr)\r
-{\r
-       int len;\r
-       struct sockaddr_un aul_addr = { 0, };\r
-       int sun_size;\r
-       ac_pkt_t *pkt = NULL;\r
-       int cl = sizeof(struct ucred);\r
-\r
-       sun_size = sizeof(struct sockaddr_un);\r
-\r
-       if ((*clifd = accept(fd, (struct sockaddr *)&aul_addr,\r
-                            (socklen_t *) &sun_size)) == -1) {\r
-               if (errno != EINTR)\r
-                       _E("accept error");\r
-               return NULL;\r
-       }\r
-\r
-       if (getsockopt(*clifd, SOL_SOCKET, SO_PEERCRED, cr,\r
-                      (socklen_t *) &cl) < 0) {\r
-               _E("peer information error");\r
-               close(*clifd);\r
-               return NULL;\r
-       }\r
-\r
-       pkt = (ac_pkt_t *) malloc(sizeof(char) * AC_SOCK_MAXBUFF);\r
-       if(pkt == NULL) {\r
-               close(*clifd);\r
-               return NULL;\r
-       }\r
-       memset(pkt, 0, AC_SOCK_MAXBUFF);\r
-\r
-       __set_sock_option(*clifd, 1);\r
-\r
- retry_recv:\r
-       /* receive single packet from socket */\r
-       len = recv(*clifd, pkt, AC_SOCK_MAXBUFF, 0);\r
-       if (len < 0)\r
-               if (errno == EINTR)\r
-                       goto retry_recv;\r
-\r
-       if ((len < 8) || (len != (pkt->len + 8))) {\r
-               _E("recv error %d %d", len, pkt->len);\r
-               free(pkt);\r
-               close(*clifd);\r
-               return NULL;\r
-       }\r
-\r
-       return pkt;\r
-}\r
-\r
-int _send_result_to_server(int fd, int res)\r
-{\r
-       if (send(fd, &res, sizeof(int), MSG_NOSIGNAL) < 0) {\r
-               if (errno == EPIPE)\r
-                       _E("send failed due to EPIPE.\n");\r
-               _E("send fail to client");\r
-       }\r
-       close(fd);\r
-       return 0;\r
-}\r
+
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <fcntl.h>
+
+
+#include "ac_sock.h"
+#include "internal.h"
+
+static int __connect_client_sock(int sockfd, const struct sockaddr *saptr, socklen_t salen,
+                  int nsec);
+
+static inline void __set_sock_option(int fd, int cli)
+{
+       int size;
+       struct timeval tv = { 5, 200 * 1000 };  /*  5.2 sec */
+
+       size = AC_SOCK_MAXBUFF;
+       setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size));
+       setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));
+       if (cli)
+               setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
+}
+
+int _create_server_sock()
+{
+       struct sockaddr_un saddr;
+       int fd;
+
+       fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
+       /*  support above version 2.6.27*/
+       if (fd < 0) {
+               if(errno == EINVAL) {
+                       fd = socket(AF_UNIX, SOCK_STREAM, 0);
+                       if(fd < 0) {
+                               _E("second chance - socket create error");
+                               return -1;
+                       }
+               } else {
+                       _E("socket error");
+                       return -1;
+               }
+       }
+
+       memset(&saddr, 0, sizeof(saddr));
+       saddr.sun_family = AF_UNIX;
+       snprintf(saddr.sun_path, UNIX_PATH_MAX, "%s",AC_SOCK_NAME);
+       unlink(saddr.sun_path);
+       
+       if (bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) {
+               _E("bind error");
+               close(fd);
+               return -1;
+       }
+
+       if (chmod(saddr.sun_path, (S_IRWXU | S_IRWXG | S_IRWXO)) < 0) {
+               /* Flawfinder: ignore*/
+               _E("failed to change the socket permission");
+               close(fd);
+               return -1;
+       }
+
+       __set_sock_option(fd, 0);
+
+       if (listen(fd, 10) == -1) {
+               _E("listen error");
+               close(fd);
+               return -1;
+       }       
+
+       return fd;
+}
+
+int _create_client_sock()
+{
+       int fd = -1;
+       struct sockaddr_un saddr = { 0, };
+       int retry = 1;
+       int ret = -1;
+
+       fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);    
+       /*  support above version 2.6.27*/
+       if (fd < 0) {
+               if (errno == EINVAL) {
+                       fd = socket(AF_UNIX, SOCK_STREAM, 0);
+                       if (fd < 0) {
+                               _E("second chance - socket create error");
+                               return -1;
+                       }
+               } else {
+                       _E("socket error");
+                       return -1;
+               }
+       }
+
+       saddr.sun_family = AF_UNIX;
+       snprintf(saddr.sun_path, UNIX_PATH_MAX, "%s", AC_SOCK_NAME);
+ retry_con:
+       ret = __connect_client_sock(fd, (struct sockaddr *)&saddr, sizeof(saddr),
+                       100 * 1000);
+       if (ret < -1) {
+               _E("maybe peer not launched or peer daed\n");
+               if (retry > 0) {
+                       usleep(100 * 1000);
+                       retry--;
+                       goto retry_con;
+               }
+       }
+       if (ret < 0) {
+               close(fd);
+               return -1;
+       }
+
+       __set_sock_option(fd, 1);
+
+       return fd;
+}
+
+static int __connect_client_sock(int fd, const struct sockaddr *saptr, socklen_t salen,
+                  int nsec)
+{
+       int flags;
+       int ret;
+       int error;
+       socklen_t len;
+       fd_set readfds;
+       fd_set writefds;
+       struct timeval timeout;
+
+       flags = fcntl(fd, F_GETFL, 0);
+       fcntl(fd, F_SETFL, flags | O_NONBLOCK);
+
+       error = 0;
+       if ((ret = connect(fd, (struct sockaddr *)saptr, salen)) < 0) {
+               if (errno != EAGAIN && errno != EINPROGRESS) {
+                       fcntl(fd, F_SETFL, flags);      
+                       return (-2);
+               }
+       }
+
+       /* Do whatever we want while the connect is taking place. */
+       if (ret == 0)
+               goto done;      /* connect completed immediately */
+
+       FD_ZERO(&readfds);
+       FD_SET(fd, &readfds);
+       writefds = readfds;
+       timeout.tv_sec = 0;
+       timeout.tv_usec = nsec;
+
+       if ((ret = select(fd + 1, &readfds, &writefds, NULL, 
+                       nsec ? &timeout : NULL)) == 0) {
+               close(fd);      /* timeout */
+               errno = ETIMEDOUT;
+               return (-1);
+       }
+
+       if (FD_ISSET(fd, &readfds) || FD_ISSET(fd, &writefds)) {
+               len = sizeof(error);
+               if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
+                       return (-1);    /* Solaris pending error */
+       } else
+               return (-1);    /* select error: sockfd not set*/
+
+ done:
+       fcntl(fd, F_SETFL, flags);      
+       if (error) {
+               close(fd);      
+               errno = error;
+               return (-1);
+       }
+       return (0);
+}
+
+/**
+ * @brief      Send data (in raw) to the process with 'pid' via socket
+ */
+int _app_send_raw(int cmd, unsigned char *data, int datalen)
+{
+       int fd;
+       int len;
+       int res = 0;
+       ac_pkt_t *pkt = NULL;
+
+       if (data == NULL || datalen > AC_SOCK_MAXBUFF - 8) {
+               _E("keybundle error\n");
+               return -EINVAL;
+       }
+
+       fd = _create_client_sock();
+       if (fd < 0)
+               return -ECOMM;
+
+       pkt = (ac_pkt_t *) malloc(sizeof(char) * AC_SOCK_MAXBUFF);
+       if (NULL == pkt) {
+               _E("Malloc Failed!");
+               return -ENOMEM;
+       }
+       memset(pkt, 0, AC_SOCK_MAXBUFF);
+
+       pkt->cmd = cmd;
+       pkt->len = datalen;
+       memcpy(pkt->data, data, datalen);
+
+       if ((len = send(fd, pkt, datalen + 8, 0)) != datalen + 8) {
+               _E("sendto() failed - %d %d", len, datalen + 8);
+               if (errno == EPIPE) {
+                       _E("fd:%d\n", fd);
+               }
+               close(fd);
+               if (pkt) {
+                       free(pkt);
+                       pkt = NULL;
+               }
+               return -ECOMM;
+       }
+       if (pkt) {
+               free(pkt);
+               pkt = NULL;
+       }
+
+       len = recv(fd, &res, sizeof(int), 0);
+       if (len == -1) {
+               if (errno == EAGAIN) {
+                       _E("recv timeout \n");
+                       res = -EAGAIN;
+               } else {
+                       _E("recv error\n");
+                       res = -ECOMM;
+               }
+       } else
+               _D("recv result  = %d (%d)", res, len);
+       close(fd);
+
+       return res;
+}
+
+ac_pkt_t *_app_recv_raw(int fd, int *clifd, struct ucred *cr)
+{
+       int len;
+       struct sockaddr_un aul_addr = { 0, };
+       int sun_size;
+       ac_pkt_t *pkt = NULL;
+       int cl = sizeof(struct ucred);
+
+       sun_size = sizeof(struct sockaddr_un);
+
+       if ((*clifd = accept(fd, (struct sockaddr *)&aul_addr,
+                            (socklen_t *) &sun_size)) == -1) {
+               if (errno != EINTR)
+                       _E("accept error");
+               return NULL;
+       }
+
+       if (getsockopt(*clifd, SOL_SOCKET, SO_PEERCRED, cr,
+                      (socklen_t *) &cl) < 0) {
+               _E("peer information error");
+               close(*clifd);
+               return NULL;
+       }
+
+       pkt = (ac_pkt_t *) malloc(sizeof(char) * AC_SOCK_MAXBUFF);
+       if(pkt == NULL) {
+               close(*clifd);
+               return NULL;
+       }
+       memset(pkt, 0, AC_SOCK_MAXBUFF);
+
+       __set_sock_option(*clifd, 1);
+
+ retry_recv:
+       /* receive single packet from socket */
+       len = recv(*clifd, pkt, AC_SOCK_MAXBUFF, 0);
+       if (len < 0)
+               if (errno == EINTR)
+                       goto retry_recv;
+
+       if ((len < 8) || (len != (pkt->len + 8))) {
+               _E("recv error %d %d", len, pkt->len);
+               free(pkt);
+               close(*clifd);
+               return NULL;
+       }
+
+       return pkt;
+}
+
+int _send_result_to_server(int fd, int res)
+{
+       if (send(fd, &res, sizeof(int), MSG_NOSIGNAL) < 0) {
+               if (errno == EPIPE)
+                       _E("send failed due to EPIPE.\n");
+               _E("send fail to client");
+       }
+       close(fd);
+       return 0;
+}