set developer mode by default submit/tizen_2.1/20130410.050142 submit/tizen_2.1/20130411.024014
authoryoonki.park <yoonki.park@samsung.com>
Wed, 10 Apr 2013 05:00:15 +0000 (14:00 +0900)
committeryoonki.park <yoonki.park@samsung.com>
Wed, 10 Apr 2013 05:00:15 +0000 (14:00 +0900)
remove listen on port 26101

Change-Id: Iaef3133ec513d65958fa0ec246fbe4875e9bbe84
Signed-off-by: Yoonki Park <yoonki.park@samsung.com>
packaging/sdbd.spec
src/commandline.c
src/file_sync_service.c
src/sdb.c
src/sdktools.c
src/services.c

index 81b1de4..2c65498 100644 (file)
@@ -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
index 730509b..7b6f7a9 100644 (file)
@@ -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<argc ; i++) {
+        strncat(full_cmd, " ", sizeof(full_cmd)-strlen(" ")-1);
+        strncat(full_cmd, argv[i], sizeof(full_cmd)-strlen(argv[i])-1);
+    }
+
+    D("launch command: %s\n", full_cmd);
+    result = sdb_command2(full_cmd);
+
+    if(result < 0) {
+        fprintf(stderr, "error: %s\n", sdb_error());
+        return result;
+    }
+
+    if(result < 0) {
+        fprintf(stderr, "error: %s\n", sdb_error());
+        return result;
+    }
+    sdb_close(result);
+    return 0;
+
+}
+
+
 void version_sdbd(transport_type ttype, char* serial) {
     char* VERSION_QUERY ="shell:rpm -qa | grep sdbd";
     send_shellcommand(ttype, serial, VERSION_QUERY);
index 7437e9b..276469d 100644 (file)
 #include <utime.h>
 #include <regex.h>
 #include <errno.h>
-
+#include <sys/socket.h>
+#include <sys/select.h>
 #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;
index fea30f4..701665e 100644 (file)
--- 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);
index 16e40f4..b04c1fd 100644 (file)
@@ -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) {
index 2ecaacc..2182b68 100644 (file)
@@ -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)) {