summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJinkun Jang <jinkun.jang@samsung.com>2013-03-13 01:46:28 +0900
committerJinkun Jang <jinkun.jang@samsung.com>2013-03-13 01:46:28 +0900
commita21db5d82155531547af22850c09d9063f2ce49e (patch)
tree6db040a283dc10d46c6d9f2d3035e28f6a7ada0d
parent9432ce4d03f0be060c67db2c991cc5664bdec7fb (diff)
downloadapp-checker-a21db5d82155531547af22850c09d9063f2ce49e.tar.gz
app-checker-a21db5d82155531547af22850c09d9063f2ce49e.tar.bz2
app-checker-a21db5d82155531547af22850c09d9063f2ce49e.zip
Tizen 2.1 base
-rw-r--r--app-checker.manifest5
-rwxr-xr-xdebian/changelog67
-rwxr-xr-xinclude/app-checker-server.h3
-rwxr-xr-xinclude/app-checker.h2
-rwxr-xr-xinclude/internal.h6
-rw-r--r--packaging/app-checker.spec12
-rwxr-xr-xsrc/ac_lib.c20
-rwxr-xr-xsrc/ac_server.c29
-rwxr-xr-xsrc/ac_sock.c602
9 files changed, 419 insertions, 327 deletions
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 @@
+<manifest>
+ <request>
+ <domain name="_"/>
+ </request>
+</manifest>
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 <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
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 <dlog.h>
#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 <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;
- 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 <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;
+}