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
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);
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;
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);
#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;
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}
};
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);
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);
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");
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;
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 {
}
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);
}
}
}
// 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);
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;
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, "_");
}
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) {
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)
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)) {