From 73fef844148ce67c63f7b61d04c16be0f8fef813 Mon Sep 17 00:00:00 2001 From: "yoonki.park" Date: Wed, 10 Apr 2013 14:00:15 +0900 Subject: [PATCH] set developer mode by default remove listen on port 26101 Change-Id: Iaef3133ec513d65958fa0ec246fbe4875e9bbe84 Signed-off-by: Yoonki Park --- packaging/sdbd.spec | 2 +- src/commandline.c | 40 +++++++++++++++++++++++++++++++ src/file_sync_service.c | 57 ++++++++++++++++++++++++------------------- src/sdb.c | 12 ++++++---- src/sdktools.c | 12 +++++++--- src/services.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 152 insertions(+), 35 deletions(-) diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index 81b1de4..2c65498 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -1,6 +1,6 @@ Name: sdbd Summary: SDB daemon -Version: 2.1.0 +Version: 2.1.1 Release: 0 Group: TO_BE/FILLED_IN License: TO BE FILLED IN diff --git a/src/commandline.c b/src/commandline.c index 730509b..7b6f7a9 100644 --- a/src/commandline.c +++ b/src/commandline.c @@ -45,6 +45,7 @@ int find_sync_dirs(const char *srcarg, int install_app(transport_type transport, char* serial, int argc, char** argv); int uninstall_app_sdb(const char *app_id); int install_app_sdb(const char *srcpath); +int launch_app(transport_type transport, char* serial, int argc, char** argv); int uninstall_app(transport_type transport, char* serial, int argc, char** argv); int sdb_command2(const char* cmd); void version_sdbd(transport_type ttype, char* serial); @@ -1239,6 +1240,11 @@ top: return uninstall_app(ttype, serial, argc, argv); } + if(!strcmp(argv[0], "launch")) { + //if (argc < 2) return usage(); + return launch_app(ttype, serial, argc, argv); + } + if(!strcmp(argv[0], "sync")) { char *srcarg, *android_srcpath, *data_srcpath; int listonly = 0; @@ -1672,6 +1678,40 @@ cleanup_apk: return err; } +int launch_app(transport_type transport, char* serial, int argc, char** argv) +{ + static const char *const SHELL_LAUNCH_CMD = "shell:/usr/bin/sdk_launch_app "; + char full_cmd[PATH_MAX]; + int i; + int result = 0; + + snprintf(full_cmd, sizeof full_cmd, "%s", SHELL_LAUNCH_CMD); + + //TODO: check argument validation + + for (i=1 ; i #include #include - +#include +#include #include "sysdeps.h" #define TRACE_TAG TRACE_SYNC #include "sdb.h" #include "file_sync_service.h" +#define SYNC_TIMEOUT 10 + struct sync_permit_rule { const char *name; @@ -41,7 +44,7 @@ struct sync_permit_rule struct sync_permit_rule sdk_sync_permit_rule[] = { // /* 0 */ {"rds", "^((/opt/apps)|(/opt/usr/apps))/[a-zA-Z0-9]{10}/info/\\.sdk_delta\\.info$", 1}, /* 1 */ {"unitest", "^((/opt/apps)|(/opt/usr/apps))/[a-zA-Z0-9]{10}/data/[a-zA-Z0-9_\\-]{1,50}\\.xml$", 1}, - /* 2 */ {"codecoverage", "^((/opt/apps)|(/opt/usr/apps))/[a-zA-Z0-9]{10}/data/+([a-zA-Z0-9_/])*+[a-zA-Z0-9_\\-]{1,50}\\.gcda$", 1}, + /* 2 */ {"codecoverage", "^((/opt/apps)|(/opt/usr/apps))/[a-zA-Z0-9]{10}/data/+([a-zA-Z0-9_/\\.])*+[a-zA-Z0-9_\\-\\.]{1,50}\\.gcda$", 1}, /* end */ {NULL, NULL, 0} }; @@ -199,8 +202,9 @@ static int handle_send_file(int s, char *path, mode_t mode, char *buffer) for(;;) { unsigned int len; - if(readx(s, &msg.data, sizeof(msg.data))) + if(readx(s, &msg.data, sizeof(msg.data))) { goto fail; + } if(msg.data.id != ID_DATA) { if(msg.data.id == ID_DONE) { timestamp = ltohl(msg.data.size); @@ -214,11 +218,14 @@ static int handle_send_file(int s, char *path, mode_t mode, char *buffer) fail_message(s, "oversize data message"); goto fail; } - if(readx(s, buffer, len)) + if(readx(s, buffer, len)) { + D("read failed due to unknown reason\n"); goto fail; + } - if(fd < 0) + if(fd < 0) { continue; + } if(writex(fd, buffer, len)) { int saved_errno = errno; sdb_close(fd); @@ -420,35 +427,34 @@ static int verify_sync_rule(const char* path) { return 0; } -void file_sync_subproc(int fd, void *cookie) { - if (should_drop_privileges()) { - pid_t pid = fork(); - int ret = 0; - if (pid == 0) { - file_sync_service(fd, cookie); - } else if (pid > 0) { - waitpid(pid, &ret, 0); - } - if(pid < 0) { - D("- fork failed: %s -\n", strerror(errno)); - return; - } - } else { - file_sync_service(fd, cookie); - } -} - void file_sync_service(int fd, void *cookie) { syncmsg msg; char name[1025]; unsigned namelen; - + fd_set set; + struct timeval timeout; + int rv; char *buffer = malloc(SYNC_DATA_MAX); if(buffer == 0) goto fail; + FD_ZERO(&set); /* clear the set */ + FD_SET(fd, &set); /* add our file descriptor to the set */ + + timeout.tv_sec = SYNC_TIMEOUT; + timeout.tv_usec = 0; + for(;;) { - D("sync: waiting for command\n"); + D("sync: waiting for command for %d sec\n", SYNC_TIMEOUT); + + rv = select(fd + 1, &set, NULL, NULL, &timeout); + if (rv == -1) { + D("sync file descriptor select failed\n"); + } else if (rv == 0) { + D("sync file descriptor timeout: (took %d sec over)\n", SYNC_TIMEOUT); + fail_message(fd, "sync timeout"); + goto fail; + } if(readx(fd, &msg.req, sizeof(msg.req))) { fail_message(fd, "command read failure"); @@ -471,6 +477,7 @@ void file_sync_service(int fd, void *cookie) if (should_drop_privileges() && !verify_sync_rule(name)) { set_developer_privileges(); } + switch(msg.req.id) { case ID_STAT: if(do_stat(fd, name)) goto fail; diff --git a/src/sdb.c b/src/sdb.c index fea30f4..701665e 100644 --- a/src/sdb.c +++ b/src/sdb.c @@ -50,6 +50,8 @@ void handle_sig_term(int sig) { if (access(SDB_PIDPATH, F_OK) == 0) sdb_unlink(SDB_PIDPATH); #endif + //kill(getpgid(getpid()),SIGTERM); + //killpg(getpgid(getpid()),SIGTERM); if (access("/dev/samsung_sdb", F_OK) == 0) { exit(0); } else { @@ -1011,18 +1013,18 @@ int set_developer_privileges() { } return 1; } -#define ONDEMAND_PATH "/home/developer/sdk_tools" +#define ONDEMAND_ROOT_PATH "/home/developer" static void init_sdk_requirements() { struct stat st; - if (stat(ONDEMAND_PATH, &st) == -1) { + if (stat(ONDEMAND_ROOT_PATH, &st) == -1) { return; } if (st.st_uid != SID_DEVELOPER || st.st_gid != SID_DEVELOPER) { char cmd[128]; - snprintf(cmd, sizeof(cmd), "chown developer:developer %s -R", ONDEMAND_PATH); + snprintf(cmd, sizeof(cmd), "chown developer:developer %s -R", ONDEMAND_ROOT_PATH); if (system(cmd) < 0) { - D("failed to change ownership to developer to %s\n",ONDEMAND_PATH); + D("failed to change ownership to developer to %s\n", ONDEMAND_ROOT_PATH); } } } @@ -1108,7 +1110,7 @@ int sdb_main(int is_daemon, int server_port) // listen on USB usb_init(); // listen on tcp - local_init(DEFAULT_SDB_LOCAL_TRANSPORT_PORT); + //local_init(DEFAULT_SDB_LOCAL_TRANSPORT_PORT); } else { // listen on default port local_init(DEFAULT_SDB_LOCAL_TRANSPORT_PORT); diff --git a/src/sdktools.c b/src/sdktools.c index 16e40f4..b04c1fd 100644 --- a/src/sdktools.c +++ b/src/sdktools.c @@ -230,7 +230,7 @@ int exec_app_standalone(const char* path) { if (pid) { snprintf(cmdline, sizeof(cmdline), "/proc/%d/cmdline", pid); int fd = unix_open(cmdline, O_RDONLY); - if (fd) { + if (fd > 0) { if(read_line(fd, cmdline, sizeof(cmdline))) { if (set_smack_rules_for_gdbserver(cmdline, 1)) { ret = 1; @@ -291,8 +291,12 @@ char* clone_gdbserver_label_from_app(const char* app_path) { int rc = smack_lgetlabel(app_path, &buffer, SMACK_LABEL_ACCESS); - if (rc == 0 && buffer != NULL && strlen(buffer) == APPID_MAX_LENGTH) { - strcpy(appid, buffer); + if (rc == 0 && buffer != NULL) { + if (strlen(buffer) == APPID_MAX_LENGTH) { + strcpy(appid, buffer); + } else { + strcpy(appid, "_"); + } free(buffer); } else { strcpy(appid, "_"); @@ -394,10 +398,12 @@ void set_appuser_groups(void) { } if (cnt > 0) { if (setgroups(sizeof(groups) / sizeof(groups[0]), groups) != 0) { + sdb_close(fd); fprintf(stderr, "set groups failed errno: %d\n", errno); exit(1); } } + sdb_close(fd); } int is_root_commands(const char *command) { diff --git a/src/services.c b/src/services.c index 2ecaacc..2182b68 100644 --- a/src/services.c +++ b/src/services.c @@ -511,6 +511,67 @@ static int create_subproc_thread(const char *name) D("service thread started, fd=%d pid=%d\n",ret_fd, pid); return ret_fd; } + +static int create_sync_subprocess(void (*func)(int, void *), void* cookie) { + stinfo *sti; + sdb_thread_t t; + int s[2]; + + if(sdb_socketpair(s)) { + D("cannot create service socket pair\n"); + return -1; + } + + pid_t pid = fork(); + + if (pid == 0) { + sdb_close(s[0]); + func(s[1], cookie); + exit(-1); + } else if (pid > 0) { + sdb_close(s[1]); + // FIXME: do not wait child process hear + //waitpid(pid, &ret, 0); + } + if (pid < 0) { + D("- fork failed: %s -\n", strerror(errno)); + sdb_close(s[0]); + sdb_close(s[1]); + D("cannot create sync service sub process\n"); + return -1; + } + + sti = malloc(sizeof(stinfo)); + if(sti == 0) fatal("cannot allocate stinfo"); + sti->func = subproc_waiter_service; + sti->cookie = (void*)pid; + sti->fd = s[0]; + + if(sdb_thread_create( &t, service_bootstrap_func, sti)){ + free(sti); + sdb_close(s[0]); + sdb_close(s[1]); + printf("cannot create service monitor thread\n"); + return -1; + } + + D("service process started, fd=%d pid=%d\n",s[0], pid); + return s[0]; +} + +static int create_syncproc_thread() +{ + int ret_fd; + + if (should_drop_privileges()) { + ret_fd = create_sync_subprocess(file_sync_service, NULL); + } else { + ret_fd = create_service_thread(file_sync_service, NULL); + } + + return ret_fd; +} + #endif int service_to_fd(const char *name) @@ -570,7 +631,8 @@ int service_to_fd(const char *name) ret = create_subproc_thread(0); } } else if(!strncmp(name, "sync:", 5)) { - ret = create_service_thread(file_sync_subproc, NULL); + //ret = create_service_thread(file_sync_service, NULL); + ret = create_syncproc_thread(); }/* else if(!strncmp(name, "remount:", 8)) { ret = create_service_thread(remount_service, NULL); } else if(!strncmp(name, "reboot:", 7)) { -- 2.7.4