From: Jinkun Jang Date: Tue, 12 Mar 2013 16:46:28 +0000 (+0900) Subject: Tizen 2.1 base X-Git-Tag: 2.1b_release~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a21db5d82155531547af22850c09d9063f2ce49e;p=framework%2Fappfw%2Fapp-checker.git Tizen 2.1 base --- diff --git a/app-checker.manifest b/app-checker.manifest new file mode 100644 index 0000000..97e8c31 --- /dev/null +++ b/app-checker.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/debian/changelog b/debian/changelog index b25b9a5..d6e34cc 100755 --- a/debian/changelog +++ b/debian/changelog @@ -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 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 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 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 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 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 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 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 Tue, 19 Jul 2011 10:23:24 +0900 - -- Jaeho Lee Wed, 07 Dec 2011 13:41:34 +0900 diff --git a/include/app-checker-server.h b/include/app-checker-server.h index 4667fab..a1f4614 100755 --- a/include/app-checker-server.h +++ b/include/app-checker-server.h @@ -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 } diff --git a/include/app-checker.h b/include/app-checker.h index b3c4fe0..9ae03be 100755 --- a/include/app-checker.h +++ b/include/app-checker.h @@ -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); diff --git a/include/internal.h b/include/internal.h index 54ce035..731263d 100755 --- a/include/internal.h +++ b/include/internal.h @@ -28,7 +28,7 @@ #include #undef LOG_TAG -#define LOG_TAG "APP-CHECKER" +#define LOG_TAG "APP_CHECKER" #define MAX_PACKAGE_STR_SIZE 512 #define MAX_PACKAGE_TYPE_SIZE 128 @@ -39,8 +39,8 @@ struct ac_data { int pid; }; -#define _E(fmt, arg...) LOGE("[%s,%d] "fmt,__FUNCTION__,__LINE__,##arg) -#define _D(fmt, arg...) LOGD("[%s,%d] "fmt,__FUNCTION__,__LINE__,##arg) +#define _E(fmt, arg...) LOGE(fmt,##arg) +#define _D(fmt, arg...) LOGD(fmt,##arg) #define retvm_if(expr, val, fmt, arg...) do { \ if(expr) { \ diff --git a/packaging/app-checker.spec b/packaging/app-checker.spec index 6f3de2a..68de8b4 100644 --- a/packaging/app-checker.spec +++ b/packaging/app-checker.spec @@ -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 diff --git a/src/ac_lib.c b/src/ac_lib.c index 0861b55..cfb92b3 100755 --- a/src/ac_lib.c +++ b/src/ac_lib.c @@ -36,16 +36,18 @@ 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; } diff --git a/src/ac_server.c b/src/ac_server.c index 531a487..b33f368 100755 --- a/src/ac_server.c +++ b/src/ac_server.c @@ -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; +} + + diff --git a/src/ac_sock.c b/src/ac_sock.c index bd17a7c..ce81406 100755 --- a/src/ac_sock.c +++ b/src/ac_sock.c @@ -18,303 +18,305 @@ * limitations under the License. * */ - - -#include -#include -#include -#include -#include -#include -#include - - -#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; - struct sockaddr_un p_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; - } - } - - bzero(&saddr, 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"); - return -1; - } - - if (chmod(saddr.sun_path, (S_IRWXU | S_IRWXG | S_IRWXO)) < 0) { - /* Flawfinder: ignore*/ - _E("failed to change the socket permission"); - return -1; - } - - __set_sock_option(fd, 0); - - if (listen(fd, 10) == -1) { - _E("listen error"); - 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; -} + + +#include +#include +#include +#include +#include +#include +#include + + +#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; +}