X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fsdb.c;h=7b33f8a843b34071576dad0b65daf425a0e204c7;hb=refs%2Fheads%2Ftizen;hp=fe77333aff1ce2967568052730a0773a4392d23e;hpb=95ba741bb4fc70acf13d4ef68d3a15031025aa6f;p=sdk%2Ftarget%2Fsdbd.git diff --git a/src/sdb.c b/src/sdb.c old mode 100644 new mode 100755 index fe77333..7b33f8a --- a/src/sdb.c +++ b/src/sdb.c @@ -14,7 +14,8 @@ * limitations under the License. */ -#define TRACE_TAG TRACE_SDB +//#define TRACE_TAG TRACE_SDB +#define LOG_TAG "SDBD_TRACE_SDB" #include #include @@ -42,13 +43,13 @@ #include "sdktools.h" #include "plugin.h" #include "sdbd_plugin.h" +#include "sdb_systemd.h" #ifdef SUPPORT_ENCRYPT #include "plugin_encrypt.h" #endif #include -#define SDB_PIDPATH "/tmp/.sdbd.pid" #include #include #include @@ -71,6 +72,7 @@ SDB_MUTEX_DEFINE( D_lock ); #define SDB_LOGCONF_PATH "/tmp/.sdbdlog.conf" int HOST = 0; +int exit_cleanup_required = 0; // sdk user uid_t g_sdk_user_id; @@ -101,10 +103,13 @@ struct group_info g_default_groups[] = { }; #define SDB_DEFAULT_GROUPS_CNT ((sizeof(g_default_groups)/sizeof(g_default_groups[0]))-1) +#define BUF_SIZE 4096 int is_init_sdk_userinfo = 0; int is_pwlocked = 0; // 0 if unlocked, 1 otherwise +int recovery_mode = 0; + SdbdCommandlineArgs sdbd_commandline_args; static int is_support_usbproto(); @@ -151,12 +156,47 @@ int is_appid2pid_supported(void) { return 0; } +int is_netcoredbg_supported(void) { + + FILE *fp = fopen(NETCOREDBG_LOCATION, "r"); + if (fp) { + size_t len; + ssize_t num; + char *line = NULL; + + while ((num = getline(&line, &len, fp)) != -1) { + if (strstr(line, "NETCOREDBG") != NULL) { + snprintf(g_capabilities.netcoredbg_support, sizeof(g_capabilities.netcoredbg_support), + "%s", ENABLED); + free(line); + fclose(fp); + return 1; + } + free(line); + line = NULL; + } + fclose(fp); + } + return 0; +} + +const char* get_platfrom_architecture(void) { + void* void_pointer; + D("void pointer size: %zu", sizeof(void_pointer)); + // in 32 bit sizeof void* is 4 and in 64 bit its 8 + if((int)(sizeof(void_pointer)) == 4) + return BIT32; + if((int)(sizeof(void_pointer)) == 8) + return BIT64; + return UNKNOWN; +} + int is_container_enabled(void) { bool value; int ret; ret = system_info_get_platform_bool("tizen.org/feature/container", &value); if (ret != SYSTEM_INFO_ERROR_NONE) { - D("failed to get container information: %d\n", errno); + E("failed to get container information: %d\n", errno); return 0; } else { D("tizen container: %d\n", value); @@ -167,12 +207,6 @@ int is_container_enabled(void) { } } -void handle_sig_term(int sig) { -#ifdef SDB_PIDPATH - if (access(SDB_PIDPATH, F_OK) == 0) - sdb_unlink(SDB_PIDPATH); -#endif -} static const char *sdb_device_banner = "device"; @@ -210,7 +244,7 @@ static char* get_sdb_log_conf(const char* key) fd = unix_open(SDB_LOGCONF_PATH, O_RDONLY); if (fd < 0) { - D("failed to open '%s' file: %d\n", SDB_LOGCONF_PATH, errno); + E("failed to open '%s' file: %d\n", SDB_LOGCONF_PATH, errno); return NULL; } @@ -224,7 +258,8 @@ static char* get_sdb_log_conf(const char* key) if (end != NULL) { strncpy(value, start, end - start); } else { - strncpy(value, start, sizeof(value)); + strncpy(value, start, sizeof(value) - 1); + value[sizeof(value) - 1] = '\0'; } } else { sdb_close(fd); @@ -237,7 +272,7 @@ static char* get_sdb_log_conf(const char* key) static int is_enable_sdbd_log() { - return (!strncmp(g_capabilities.log_enable, PLUGIN_RET_ENABLED, strlen(PLUGIN_RET_ENABLED))); + return (!strncmp(g_capabilities.log_enable, PLUGIN_RET_ENABLED, strlen(PLUGIN_RET_ENABLED)+1)); } int sdb_trace_mask; @@ -344,13 +379,22 @@ int sdb_debug_qemu = -1; apacket *get_apacket(void) { apacket *p = malloc(sizeof(apacket)); - if(p == 0) fatal("failed to allocate an apacket"); + if(p == 0) { + // free only being done to resolve SVACE issue. + free(p) ; + fatal("failed to allocate an apacket"); + } memset(p, 0, sizeof(apacket) - MAX_PAYLOAD); return p; } void put_apacket(apacket *p) { + int result = access((const char *) p, F_OK); + if ((result == -1) && (errno == EFAULT)) { + E("Invalid apacket = [0x%p]", p); + fatal("Invalid apacket = [0x%p]", p); + } if (p != NULL) { free(p); p = NULL; @@ -359,12 +403,12 @@ void put_apacket(apacket *p) void handle_online(void) { - D("sdb: online\n"); + I("sdb: online\n"); } void handle_offline(atransport *t) { - D("sdb: offline\n"); + I("sdb: offline\n"); //Close the associated usb run_transport_disconnects(t); } @@ -442,10 +486,10 @@ int handle_encr_packet(apacket* p, atransport *t){ t->sessionID = sessionID; if((retVal = security_init(t->sessionID, NULL)) == 1){ // 암호화 handshaking을 위한 init if(security_parse_server_hello(t->sessionID, p) == 1){ // hello 메시지 파싱 - D("security_parse_server_hello success\n"); + I("security_parse_server_hello success\n"); enc_p = get_apacket(); if(security_gen_client_hello(t->sessionID, enc_p) == 1){ // hello 메시지 생성 - D("security_gen_client_hello success\n"); + I("security_gen_client_hello success\n"); enc_p->msg.command = A_ENCR; enc_p->msg.arg0 = ENCR_SET_ON_REQ; enc_p->msg.arg1 = p->msg.arg1; @@ -453,7 +497,7 @@ int handle_encr_packet(apacket* p, atransport *t){ send_packet(enc_p, t); } else { // hello 메시지 생성 실패 - D("security_gen_client_hello error\n"); + E("security_gen_client_hello error\n"); send_encr_fail(p, t, ENCR_ON_FAIL); // 암호화 on 실패 메시지 전송 t->encryption = ENCR_OFF; // 암호화 모드는 off security_deinit(t->sessionID); @@ -461,7 +505,7 @@ int handle_encr_packet(apacket* p, atransport *t){ } } else{ // hello 메시지 파싱 실패 - D("security_parse_server_hello error\n"); + E("security_parse_server_hello error\n"); send_encr_fail(p, t, ENCR_ON_FAIL); t->encryption = ENCR_OFF; security_deinit(t->sessionID); @@ -469,7 +513,7 @@ int handle_encr_packet(apacket* p, atransport *t){ return -1; } } else { // init 실패 - D("security_init error\n"); + E("security_init error\n"); send_encr_fail(p, t, ENCR_ON_FAIL); t->encryption = ENCR_OFF; if (retVal == 0) @@ -484,7 +528,7 @@ int handle_encr_packet(apacket* p, atransport *t){ if(security_parse_server_ack(t->sessionID, p) == 1){ // ack 메시지 파싱 enc_p = get_apacket(); if(security_gen_client_ack(t->sessionID, enc_p) == 1){ // ack 메시지 생성 - D("security_gen_client_ack success\n"); + I("security_gen_client_ack success\n"); enc_p->msg.command = A_ENCR; enc_p->msg.arg0 = ENCR_SET_ON_OK; enc_p->msg.arg1 = p->msg.arg1; @@ -492,7 +536,7 @@ int handle_encr_packet(apacket* p, atransport *t){ send_packet(enc_p, t); } else { // ack 메시지 생성에 실패한 경우 - D("security_gen_client_ack error\n"); + E("security_gen_client_ack error\n"); send_encr_fail(p, t, ENCR_ON_FAIL); t->encryption = ENCR_OFF; security_deinit(t->sessionID); @@ -500,7 +544,7 @@ int handle_encr_packet(apacket* p, atransport *t){ } } else { // ack 메시지 파싱에 실패한 경우 - D("security_parse_server_ack error\n"); + E("security_parse_server_ack error\n"); send_encr_fail(p, t, ENCR_ON_FAIL); t->encryption = ENCR_OFF; security_deinit(t->sessionID); @@ -517,7 +561,7 @@ int handle_encr_packet(apacket* p, atransport *t){ send_packet(enc_p, t); } else { // 암호화 모드 off에 실패한 경우 - D("security_deinit error\n"); + E("security_deinit error\n"); send_encr_fail(p, t, ENCR_OFF_FAIL); // 암호화 모드 off 실패 메시지 전송 return -1; } @@ -529,22 +573,22 @@ int handle_encr_packet(apacket* p, atransport *t){ enc_p->msg.arg1 = p->msg.arg1; if(t->encryption == ENCR_ON){ // 암호화 모드가 on인 경우 enc_p->msg.data_length = 13; - strncpy((char*)enc_p->data, "encryption:on", enc_p->msg.data_length); // encryption:on 메시지 전송 + strncpy((char*)enc_p->data, "encryption:on", enc_p->msg.data_length + 1); // encryption:on 메시지 전송 } else if(t->encryption == ENCR_OFF){ // 암호화 모드가 off인 경우 enc_p->msg.data_length = 14; - strncpy((char*)enc_p->data, "encryption:off", enc_p->msg.data_length); // encryption:off 메시지 전송 + strncpy((char*)enc_p->data, "encryption:off", enc_p->msg.data_length + 1); // encryption:off 메시지 전송 } send_packet(enc_p, t); } else if (p->msg.arg0 == ENCR_ON_FAIL) // 암호화 모드를 on 하는 도중 실패한 경우 받는 메시지 { t->encryption = ENCR_OFF; // 암호화 모드를 다시 off - D("encryption on failed\n"); + E("encryption on failed\n"); } else if (p->msg.arg0 == ENCR_OFF_FAIL) // 암호화 모드를 off하는 도중 실패한 경우 받는 메시지 { //t->encryption = ENCR_ON; - D("encryption off failed\n"); + E("encryption off failed\n"); } //put_apacket(enc_p); return 0; @@ -555,7 +599,7 @@ int handle_encr_packet(apacket* p, atransport *t){ static void send_ready(unsigned local, unsigned remote, atransport *t) { - D("Calling send_ready \n"); + I("Calling send_ready \n"); apacket *p = get_apacket(); p->msg.command = A_OKAY; p->msg.arg0 = local; @@ -565,7 +609,7 @@ static void send_ready(unsigned local, unsigned remote, atransport *t) static void send_close(unsigned local, unsigned remote, atransport *t) { - D("Calling send_close \n"); + I("Calling send_close \n"); apacket *p = get_apacket(); p->msg.command = A_CLSE; p->msg.arg0 = local; @@ -575,7 +619,7 @@ static void send_close(unsigned local, unsigned remote, atransport *t) static void send_connect(atransport *t) { - D("Calling send_connect \n"); + I("Calling send_connect \n"); apacket *cp = get_apacket(); cp->msg.command = A_CNXN; cp->msg.arg0 = A_VERSION; @@ -603,15 +647,20 @@ static void send_connect(atransport *t) snprintf((char*) cp->data, sizeof cp->data, "%s::%s::%d", sdb_device_banner, device_name, status); } - D("CNXN data:%s\n", (char*)cp->data); + if (extcmd != NULL) { + char extbuf[BUF_SIZE] = {0,}; + snprintf(extbuf, sizeof extbuf, "::%s", extcmd); + strncat((char*) cp->data, extbuf, sizeof(cp->data) - strlen((const char*)cp->data)- 1); + } cp->msg.data_length = strlen((char*) cp->data) + 1; + D("CNXN data: %s\n", (char*)cp->data); send_packet(cp, t); } void send_device_status() { - D("broadcast device status\n"); + I("broadcast device status\n"); apacket* cp = get_apacket(); cp->msg.command = A_STAT; cp->msg.arg0 = is_pwlocked; @@ -655,7 +704,7 @@ static int get_str_cmdline(char *src, char *dest, char str[], int str_size) { int len = e-s-strlen(dest); if (len >= str_size) { - D("buffer size(%d) should be bigger than %d\n", str_size, len+1); + E("buffer size(%d) should be bigger than %d\n", str_size, len+1); return -1; } @@ -689,7 +738,7 @@ int get_device_name(char str[], int str_size) { char *value = NULL; int r = system_info_get_platform_string("http://tizen.org/system/model_name", &value); if (r != SYSTEM_INFO_ERROR_NONE) { - D("fail to get system model:%d\n", errno); + E("fail to get system model:%d\n", errno); return -1; } else { s_strncpy(str, value, str_size); @@ -721,13 +770,13 @@ static int get_cmdline_value(char *split, char str[], int str_size) { int fd = unix_open(PROC_CMDLINE_PATH, O_RDONLY); if (fd < 0) { - D("fail to read /proc/cmdline\n"); + E("fail to read /proc/cmdline\n"); return -1; } if(read_line(fd, cmdline, sizeof(cmdline))) { D("qemu cmd: %s\n", cmdline); if (get_str_cmdline(cmdline, split, str, str_size) < 1) { - D("could not get the (%s) value from cmdline\n", split); + E("could not get the (%s) value from cmdline\n", split); sdb_close(fd); return -1; } @@ -747,19 +796,19 @@ int get_emulator_guestip(char str[], int str_size) { s = socket(AF_INET, SOCK_DGRAM, 0); if(s < 0) { - D("socket error\n"); + E("socket error\n"); return -1; } snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", GUEST_IP_INTERFACE); if(ioctl(s, SIOCGIFHWADDR, &ifr) < 0) { - D("ioctl hwaddr error\n"); + E("ioctl hwaddr error\n"); sdb_close(s); return -1; } if(ioctl(s, SIOCGIFADDR, &ifr) < 0) { - D("ioctl addr error\n"); + E("ioctl addr error\n"); sdb_close(s); return -1; } @@ -796,28 +845,28 @@ void parse_banner(char *banner, atransport *t) } if(!strcmp(type, "bootloader")){ - D("setting connection_state to CS_BOOTLOADER\n"); + I("setting connection_state to CS_BOOTLOADER\n"); t->connection_state = CS_BOOTLOADER; update_transports(); return; } if(!strcmp(type, "device")) { - D("setting connection_state to CS_DEVICE\n"); + I("setting connection_state to CS_DEVICE\n"); t->connection_state = CS_DEVICE; update_transports(); return; } if(!strcmp(type, "recovery")) { - D("setting connection_state to CS_RECOVERY\n"); + I("setting connection_state to CS_RECOVERY\n"); t->connection_state = CS_RECOVERY; update_transports(); return; } if(!strcmp(type, "sideload")) { - D("setting connection_state to CS_SIDELOAD\n"); + I("setting connection_state to CS_SIDELOAD\n"); t->connection_state = CS_SIDELOAD; update_transports(); return; @@ -848,10 +897,10 @@ void handle_packet(apacket *p, atransport *t) asocket *s; - D("handle_packet() %c%c%c%c\n", ((char*) (&(p->msg.command)))[0], - ((char*) (&(p->msg.command)))[1], - ((char*) (&(p->msg.command)))[2], - ((char*) (&(p->msg.command)))[3]); +// D("handle_packet() %c%c%c%c\n", ((char*) (&(p->msg.command)))[0], +// ((char*) (&(p->msg.command)))[1], +// ((char*) (&(p->msg.command)))[2], +// ((char*) (&(p->msg.command)))[3]); print_packet("recv", p); @@ -882,7 +931,7 @@ void handle_packet(apacket *p, atransport *t) case A_OPEN: /* OPEN(local-id, 0, "destination") */ if (request_lock_state_to_plugin(LOCKTYPE_PASSWORD) == 1 && t->connection_state == CS_PWLOCK) { // in case of already locked before get A_CNXN - D("open failed due to password locked before get A_CNXN:%d\n", t->connection_state); + E("open failed due to password locked before get A_CNXN:%d\n", t->connection_state); send_close(0, p->msg.arg0, t); } else { if(t->connection_state != CS_OFFLINE) { @@ -928,7 +977,7 @@ void handle_packet(apacket *p, atransport *t) p->len = p->msg.data_length; if(s->enqueue(s, p) == 0) { - D("Enqueue the socket\n"); + I("Enqueue the socket\n"); send_ready(s->id, rid, t); } return; @@ -958,6 +1007,7 @@ alistener listener_list = { static void ss_listener_event_func(int _fd, unsigned ev, void *_l) { asocket *s; + int ret = -1; if(ev & FDE_READ) { struct sockaddr addr; @@ -968,7 +1018,10 @@ static void ss_listener_event_func(int _fd, unsigned ev, void *_l) fd = sdb_socket_accept(_fd, &addr, &alen); if(fd < 0) return; - sdb_socket_setbufsize(fd, CHUNK_SIZE); + ret = sdb_socket_setbufsize(fd, CHUNK_SIZE); + if (ret == -1) { + D("sdbd: sdb_socket_setbufsize failed (%d)\n", ret); + } s = create_local_socket(fd); if(s) { @@ -1127,7 +1180,7 @@ static int install_listener(const char *local_name, const char *connect_to, atra } if (close_on_exec(l->fd) < 0) { - D("fail to close fd exec:%d\n",l->fd); + E("fail to close fd exec:%d\n",l->fd); } if(!strcmp(l->connect_to, "*smartsocket*")) { fdevent_install(&l->fde, l->fd, ss_listener_event_func, l); @@ -1168,10 +1221,19 @@ static void sdb_cleanup(void) unload_sdbd_plugin(); } +static void sdb_service_cleanup(void) +{ + if (exit_cleanup_required) + { + unload_sdbd_service_plugin(); + } +} + + void start_device_log(void) { int fd; - char path[PATH_MAX] = {0, }; + char path[2*PATH_MAX] = {0, }; char path_folder[PATH_MAX] = {0, }; char path_file[PATH_MAX] = {0, }; struct tm now; @@ -1244,18 +1306,14 @@ static void init_drop_privileges() { } int should_drop_privileges() { - if (rootshell_mode == 1) { // if root, then don't drop - return 0; - } - return 1; + return !rootshell_mode; // if root, then don't drop } #include -#define DEVICED_BUS "org.tizen.system.deviced" -#define DEVICED_CORE_PATH "/Org/Tizen/System/DeviceD/Core" +#define BOOTING_DONE_PATH "/org/tizen/system" #define BOOTING_DONE_SIGNAL "BootingDone" -#define DEVICED_CORE_INTERFACE "org.tizen.system.deviced.core" +#define BOOTING_DONE_INTERFACE "org.tizen.system.Booting" #define SDBD_BOOT_INFO_FILE "/tmp/sdbd_boot_info" static GMainLoop *g_mainloop; @@ -1274,17 +1332,29 @@ static void booting_done_signal_subscriber(GDBusConnection *connection, booting_done = 1; if (access(SDBD_BOOT_INFO_FILE, F_OK) == 0) { - D("booting is already done\n"); + I("booting is already done\n"); } else { FILE *info_file = fopen(SDBD_BOOT_INFO_FILE, "w"); if (info_file != NULL) { - fprintf(info_file, "%d", 1); - fclose(info_file); + char* tmppath = realpath(SDBD_BOOT_INFO_FILE, NULL); + if (tmppath != NULL) { + if (strcmp(SDBD_BOOT_INFO_FILE, tmppath) == 0) { + fprintf(info_file, "%d", 1); + I("booting is done\n"); + } else { + D("Path has symbolic link, security risk \n"); + free(tmppath); + return; + } + free(tmppath); + } else { + D("Getting realpath failed\n"); + } + fclose(info_file); } - D("booting is done\n"); } - D("handled the booting done signal\n"); + I("handled the booting done signal\n"); g_main_loop_quit(g_mainloop); } @@ -1297,30 +1367,30 @@ static void *bootdone_cb(void *args) connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); if (connection == NULL) { if (error != NULL) { - D("failed to connect to the system bus: %s\n", error->message); + E("failed to connect to the system bus: %s\n", error->message); g_error_free(error); } else { - D("failed to connect to the system bus\n"); + E("failed to connect to the system bus\n"); } return NULL; } g_mainloop = g_main_loop_new(NULL, false); if (g_mainloop == NULL) { - D("failed to create a g_main_loop\n"); + E("failed to create a g_main_loop\n"); goto bootdone_out; } id = g_dbus_connection_signal_subscribe(connection, - DEVICED_BUS, DEVICED_CORE_INTERFACE, BOOTING_DONE_SIGNAL, - DEVICED_CORE_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE, + NULL, BOOTING_DONE_INTERFACE, BOOTING_DONE_SIGNAL, + BOOTING_DONE_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE, booting_done_signal_subscriber, NULL, NULL); if (id == 0) { - D("failed to subscribe to the booting done signal\n"); + E("failed to subscribe to the booting done signal\n"); goto bootdone_out; } - D("wait for the booting done signal\n"); + I("wait for the booting done signal\n"); g_main_loop_run(g_mainloop); g_dbus_connection_signal_unsubscribe(connection, id); @@ -1332,7 +1402,7 @@ bootdone_out: if (connection != NULL) { g_object_unref(connection); } - D("exit the bootdone_cb thread\n"); + I("exit the bootdone_cb thread\n"); return NULL; } @@ -1341,10 +1411,10 @@ void register_bootdone_cb() { sdb_thread_t t; if (sdb_thread_create(&t, bootdone_cb, NULL)) { - D("can not create a service thread to check the booting done\n"); + E("can not create a service thread to check the booting done\n"); return; } - D("created the bootdone_cb thread\n"); + I("created the bootdone_cb thread\n"); } static int sdbd_set_groups(const char *name, int gid, struct group_info default_groups[], int default_groups_size) { @@ -1354,15 +1424,16 @@ static int sdbd_set_groups(const char *name, int gid, struct group_info default_ int group_match = 0; int added_group_cnt = 0; - getgrouplist(name, gid, NULL, &ngroups); - D("group list : ngroups = %d\n", ngroups); + if (getgrouplist(name, gid, NULL, &ngroups) == -1) { + D("group list : ngroups = %d\n", ngroups); + } group_ids = malloc((ngroups + default_groups_size) * sizeof(gid_t)); if (group_ids == NULL) { - D("failed to allocate group_ids(%zu)\n", (ngroups + default_groups_size) * sizeof(gid_t)); + E("failed to allocate group_ids(%zu)\n", (ngroups + default_groups_size) * sizeof(gid_t)); return -1; } if (getgrouplist(name, gid, group_ids, &ngroups) == -1) { - D("failed to getgrouplist(), ngroups = %d\n", ngroups); + E("failed to getgrouplist(), ngroups = %d\n", ngroups); free(group_ids); return -1; } @@ -1382,7 +1453,7 @@ static int sdbd_set_groups(const char *name, int gid, struct group_info default_ } } if (setgroups(ngroups+added_group_cnt, group_ids) != 0) { - D("failed to setgroups().\n"); + E("failed to setgroups().\n"); free(group_ids); return -1; } @@ -1398,10 +1469,10 @@ static int sdbd_get_user_pwd(const char* user_name, struct passwd* pwd, char* bu ret = getpwnam_r(user_name, pwd, buf, bufsize, &result); if (result == NULL) { if (ret == 0) { - D("Not found passwd : username(%s)\n", user_name); + E("Not found passwd : username(%s)\n", user_name); } else { errno = ret; - D("failed to getpwnam_r\n"); + E("failed to getpwnam_r\n"); } return -1; } @@ -1416,10 +1487,10 @@ static int sdbd_get_group(const char* group_name, struct group* grp, char* buf, ret = getgrnam_r(group_name, grp, buf, bufsize, &result); if (result == NULL) { if (ret == 0) { - D("Not found group : groupname(%s)\n", group_name); + E("Not found group : groupname(%s)\n", group_name); } else { errno = ret; - D("failed to getgrnam_r\n"); + E("failed to getgrnam_r\n"); } return -1; } @@ -1429,7 +1500,7 @@ static int sdbd_get_group(const char* group_name, struct group* grp, char* buf, int set_sdk_user_privileges(int is_drop_capability_after_fork) { if (!is_init_sdk_userinfo) { - D("failed to init sdk user information.\n"); + E("failed to init sdk user information.\n"); return -1; } @@ -1440,23 +1511,23 @@ int set_sdk_user_privileges(int is_drop_capability_after_fork) { if(is_drop_capability_after_fork) { if (setuid(g_root_user_id) != 0) { - D("set root user id failed (errno: %d)\n", errno); + E("set root user id failed (errno: %d)\n", errno); return -1; } } if (sdbd_set_groups(SDK_USER_NAME, g_sdk_group_id, g_default_groups, SDB_DEFAULT_GROUPS_CNT) < 0) { - D("set groups failed (errno: %d)\n", errno); + E("set groups failed (errno: %d)\n", errno); return -1; } if (setgid(g_sdk_group_id) != 0) { - D("set group id failed (errno: %d)\n", errno); + E("set group id failed (errno: %d)\n", errno); return -1; } if (setuid(g_sdk_user_id) != 0) { - D("set user id failed (errno: %d)\n", errno); + E("set user id failed (errno: %d)\n", errno); return -1; // if(is_drop_capability_after_fork) { // return -1; @@ -1464,7 +1535,7 @@ int set_sdk_user_privileges(int is_drop_capability_after_fork) { } if (chdir(g_sdk_home_dir) < 0) { - D("unable to change working directory to %s\n", g_sdk_home_dir); + E("unable to change working directory to %s\n", g_sdk_home_dir); } // TODO: use pam later @@ -1478,19 +1549,19 @@ int set_sdk_user_privileges(int is_drop_capability_after_fork) { int set_root_privileges() { if (sdbd_set_groups(ROOT_USER_NAME, g_root_group_id, NULL, 0) < 0) { - D("set root groups failed (errno: %d)\n", errno); + E("set root groups failed (errno: %d)\n", errno); } if (setgid(g_root_group_id) != 0) { - D("set root group id failed (errno: %d)\n", errno); + E("set root group id failed (errno: %d)\n", errno); } if (setuid(g_root_user_id) != 0) { - D("set root user id failed (errno: %d)\n", errno); + E("set root user id failed (errno: %d)\n", errno); } if (chdir(g_root_home_dir) < 0) { - D("unable to change root working directory to %s\n", g_sdk_home_dir); + E("unable to change root working directory to %s\n", g_sdk_home_dir); } // TODO: use pam later @@ -1533,7 +1604,7 @@ static int init_sdb_default_groups() { bufsize = get_group_bufsize(); buf = malloc(bufsize); if (buf == NULL) { - D("failed to allocate gruop buf(%ld)\n", bufsize); + E("failed to allocate gruop buf(%ld)\n", bufsize); return -1; } @@ -1542,7 +1613,7 @@ static int init_sdb_default_groups() { if (sdbd_get_group(g_default_groups[i].name, &grp, buf, bufsize) == 0) { g_default_groups[i].gid = grp.gr_gid; } else { - D("failed get group info.(errno: %d)\n", errno); + E("failed get group info.(errno: %d)\n", errno); } } @@ -1570,11 +1641,11 @@ static int init_root_userinfo() { bufsize = get_passwd_bufsize(); buf = malloc(bufsize); if (buf == NULL) { - D("failed to allocate passwd buf(%ld)\n", bufsize); + E("failed to allocate passwd buf(%ld)\n", bufsize); set_static_root_userinfo(); } else { if (sdbd_get_user_pwd(ROOT_USER_NAME, &pwd, buf, bufsize) < 0) { - D("failed to get root user passwd info.(errno: %d)\n", errno); + E("failed to get root user passwd info.(errno: %d)\n", errno); set_static_root_userinfo(); } else { D("username=%s, uid=%d, gid=%d, dir=%s\n", pwd.pw_name, pwd.pw_uid, pwd.pw_gid, pwd.pw_dir); @@ -1589,7 +1660,7 @@ static int init_root_userinfo() { int env_size = strlen("HOME=") + strlen(g_root_home_dir) + 1; g_root_home_dir_env = malloc(env_size); if(g_root_home_dir_env == NULL) { - D("failed to allocate for home dir env string\n"); + E("failed to allocate for home dir env string\n"); } else { snprintf(g_root_home_dir_env, env_size, "HOME=%s", g_root_home_dir); } @@ -1607,17 +1678,17 @@ static int init_sdk_userinfo() { } if (init_sdb_default_groups() < 0) { - D("failed to initialize default groups.\n"); + E("failed to initialize default groups.\n"); } bufsize = get_passwd_bufsize(); buf = malloc(bufsize); if (buf == NULL) { - D("failed to allocate passwd buf(%ld)\n", bufsize); + E("failed to allocate passwd buf(%ld)\n", bufsize); set_static_sdk_userinfo(); } else { if (sdbd_get_user_pwd(SDK_USER_NAME, &pwd, buf, bufsize) < 0) { - D("get user passwd info.(errno: %d)\n", errno); + E("get user passwd info.(errno: %d)\n", errno); set_static_sdk_userinfo(); } else { D("username=%s, uid=%d, gid=%d, dir=%s\n", pwd.pw_name, pwd.pw_uid, pwd.pw_gid, pwd.pw_dir); @@ -1632,7 +1703,7 @@ static int init_sdk_userinfo() { int env_size = strlen("HOME=") + strlen(g_sdk_home_dir) + 1; g_sdk_home_dir_env = malloc(env_size); if(g_sdk_home_dir_env == NULL) { - D("failed to allocate for home dir env string\n"); + E("failed to allocate for home dir env string\n"); } else { snprintf(g_sdk_home_dir_env, env_size, "HOME=%s", g_sdk_home_dir); } @@ -1641,6 +1712,7 @@ static int init_sdk_userinfo() { return 0; } +#if 0 static int safe_system(char *cmd, char *argv[], char *envp[]) { pid_t pid; int status; @@ -1651,7 +1723,7 @@ static int safe_system(char *cmd, char *argv[], char *envp[]) { return -1; case 0: execve(cmd, argv, envp); - D("- exec '%s' failed: (errno:%d) -\n", cmd, errno); + E("- exec '%s' failed: (errno:%d) -\n", cmd, errno); exit(-1); default: for (;;) { @@ -1663,10 +1735,9 @@ static int safe_system(char *cmd, char *argv[], char *envp[]) { } return 0; } +#endif static void init_sdk_requirements() { - struct stat st; - // set env variable for temporary // TODO: should use pam instead later!! putenv("TERM=linux"); @@ -1675,40 +1746,6 @@ static void init_sdk_requirements() { init_sdk_userinfo(); init_root_userinfo(); - if (g_sdk_home_dir != NULL && stat(g_sdk_home_dir, &st) == 0) { - if (st.st_uid != g_sdk_user_id || st.st_gid != g_sdk_group_id) { - char* cmd = "/usr/bin/chown"; - char params[128]; - char* envp[128]; - int envp_cnt = 0; - int i = 0; - - envp[envp_cnt++] = g_strdup("TERM=linux"); - envp[envp_cnt++] = g_strdup("DISPLAY=:0"); - envp[envp_cnt] = NULL; - - snprintf(params, sizeof(params), "%s %s:%s %s -R", cmd, SDK_USER_NAME, SDK_USER_NAME, g_sdk_home_dir); - - char* args[] = { - cmd, - params, - NULL, - }; - if (safe_system(cmd, args, envp) < 0) { - D("failed to change ownership to sdk user to %s\n", g_sdk_home_dir); - } - - /* free environment variables */ - if (envp_cnt > 0) { - for (i = 0; i < envp_cnt; i++) { - if (envp[i]) { - g_free(envp[i]); - } - } - } - } - } - if (is_emulator()) { register_bootdone_cb(); } @@ -1720,16 +1757,42 @@ static void init_capabilities(void) { memset(&g_capabilities, 0, sizeof(g_capabilities)); + // architecture support + char* arch = get_platfrom_architecture(); + snprintf(g_capabilities.architecture, sizeof(g_capabilities.architecture), + "%s", arch); + // CPU Architecture of model ret = system_info_get_platform_string("http://tizen.org/feature/platform.core.cpu.arch", &value); if (ret != SYSTEM_INFO_ERROR_NONE) { snprintf(g_capabilities.cpu_arch, sizeof(g_capabilities.cpu_arch), "%s", UNKNOWN); - D("fail to get the CPU architecture of model:%d\n", errno); + E("fail to get the CPU architecture of model:%d\n", errno); + } else { + if (value != NULL) { + // check for armv8 and 32 bit architecture, for it make the cpu arch as armv7l + if(!strncmp(value,"armv8",sizeof("armv8")+1) && !strncmp(arch,"32",sizeof("32")+1)) + { + D("Changing cpu arch in capability from %s to %s for %s bit\n",value,"armv7l",arch); + snprintf(g_capabilities.cpu_arch, sizeof(g_capabilities.cpu_arch), + "%s", "armv7l"); + } else { + snprintf(g_capabilities.cpu_arch, sizeof(g_capabilities.cpu_arch), + "%s", value); + } + free(value); + } + } + + // Core ABI (That value can be a "arm_32", "arm_64", "riscv_32", "riscv_64", "x86", "x86_64") + ret = system_info_get_platform_string("http://tizen.org/feature/platform.core.abi", &value); + if (ret != SYSTEM_INFO_ERROR_NONE) { + snprintf(g_capabilities.core_abi, sizeof(g_capabilities.core_abi), + "%s", UNKNOWN); + E("fail to get the core abi:%d\n", errno); } else { - snprintf(g_capabilities.cpu_arch, sizeof(g_capabilities.cpu_arch), - "%s", value); if (value != NULL) { + snprintf(g_capabilities.core_abi, sizeof(g_capabilities.core_abi), "%s", value); free(value); } } @@ -1738,7 +1801,7 @@ static void init_capabilities(void) { // Secure protocol support if(!request_capability_to_plugin(CAPABILITY_SECURE, g_capabilities.secure_protocol, sizeof(g_capabilities.secure_protocol))) { - D("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_SECURE); + E("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_SECURE); snprintf(g_capabilities.secure_protocol, sizeof(g_capabilities.secure_protocol), "%s", DISABLED); } @@ -1747,7 +1810,7 @@ static void init_capabilities(void) { // Interactive shell support if(!request_capability_to_plugin(CAPABILITY_INTER_SHELL, g_capabilities.intershell_support, sizeof(g_capabilities.intershell_support))) { - D("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_INTER_SHELL); + E("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_INTER_SHELL); snprintf(g_capabilities.intershell_support, sizeof(g_capabilities.intershell_support), "%s", DISABLED); } @@ -1756,7 +1819,7 @@ static void init_capabilities(void) { // File push/pull support if(!request_capability_to_plugin(CAPABILITY_FILESYNC, g_capabilities.filesync_support, sizeof(g_capabilities.filesync_support))) { - D("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_FILESYNC); + E("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_FILESYNC); snprintf(g_capabilities.filesync_support, sizeof(g_capabilities.filesync_support), "%s", DISABLED); } @@ -1765,7 +1828,7 @@ static void init_capabilities(void) { // USB protocol support if(!request_capability_to_plugin(CAPABILITY_USB_PROTOCOL, g_capabilities.usbproto_support, sizeof(g_capabilities.usbproto_support))) { - D("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_USB_PROTOCOL); + E("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_USB_PROTOCOL); snprintf(g_capabilities.usbproto_support, sizeof(g_capabilities.usbproto_support), "%s", DISABLED); } @@ -1774,7 +1837,7 @@ static void init_capabilities(void) { // Socket protocol support if(!request_capability_to_plugin(CAPABILITY_SOCK_PROTOCOL, g_capabilities.sockproto_support, sizeof(g_capabilities.sockproto_support))) { - D("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_SOCK_PROTOCOL); + E("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_SOCK_PROTOCOL); snprintf(g_capabilities.sockproto_support, sizeof(g_capabilities.sockproto_support), "%s", DISABLED); } @@ -1786,7 +1849,7 @@ static void init_capabilities(void) { // Root command support if(!request_capability_to_plugin(CAPABILITY_ROOT_ONOFF, g_capabilities.rootonoff_support, sizeof(g_capabilities.rootonoff_support))) { - D("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_ROOT_ONOFF); + E("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_ROOT_ONOFF); snprintf(g_capabilities.rootonoff_support, sizeof(g_capabilities.rootonoff_support), "%s", DISABLED); } @@ -1795,7 +1858,7 @@ static void init_capabilities(void) { // Encryption support if(!request_capability_to_plugin(CAPABILITY_ENCRYPTION, g_capabilities.encryption_support, sizeof(g_capabilities.encryption_support))) { - D("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_ENCRYPTION); + E("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_ENCRYPTION); snprintf(g_capabilities.encryption_support, sizeof(g_capabilities.encryption_support), "%s", DISABLED); } @@ -1825,7 +1888,7 @@ static void init_capabilities(void) { // SDK Tool path if (SDK_TOOL_PATH == NULL) { - D("fail to get SDK tool path.\n"); + E("fail to get SDK tool path.\n"); snprintf(g_capabilities.sdk_toolpath, sizeof(g_capabilities.sdk_toolpath), "%s", UNKNOWN); } else { @@ -1838,7 +1901,7 @@ static void init_capabilities(void) { if (ret != SYSTEM_INFO_ERROR_NONE) { snprintf(g_capabilities.profile_name, sizeof(g_capabilities.profile_name), "%s", UNKNOWN); - D("fail to get profile name:%d\n", errno); + E("fail to get profile name:%d\n", errno); } else { snprintf(g_capabilities.profile_name, sizeof(g_capabilities.profile_name), "%s", value); @@ -1853,7 +1916,7 @@ static void init_capabilities(void) { if (ret != SYSTEM_INFO_ERROR_NONE) { snprintf(g_capabilities.vendor_name, sizeof(g_capabilities.vendor_name), "%s", UNKNOWN); - D("fail to get the Vendor name:%d\n", errno); + E("fail to get the Vendor name:%d\n", errno); } else { snprintf(g_capabilities.vendor_name, sizeof(g_capabilities.vendor_name), "%s", value); @@ -1866,7 +1929,7 @@ static void init_capabilities(void) { // Target name of the launch possible if(!request_capability_to_plugin(CAPABILITY_CAN_LAUNCH, g_capabilities.can_launch, sizeof(g_capabilities.can_launch))) { - D("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_CAN_LAUNCH); + E("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_CAN_LAUNCH); snprintf(g_capabilities.can_launch, sizeof(g_capabilities.can_launch), "%s", UNKNOWN); } @@ -1883,7 +1946,7 @@ static void init_capabilities(void) { } else { snprintf(g_capabilities.device_name, sizeof(g_capabilities.device_name), "%s", UNKNOWN); - D("fail to get the Device name:%d\n", errno); + E("fail to get the Device name:%d\n", errno); } @@ -1892,7 +1955,7 @@ static void init_capabilities(void) { if (ret != SYSTEM_INFO_ERROR_NONE) { snprintf(g_capabilities.platform_version, sizeof(g_capabilities.platform_version), "%s", UNKNOWN); - D("fail to get platform version:%d\n", errno); + E("fail to get platform version:%d\n", errno); } else { snprintf(g_capabilities.platform_version, sizeof(g_capabilities.platform_version), "%s", value); @@ -1905,7 +1968,7 @@ static void init_capabilities(void) { // Product version if(!request_capability_to_plugin(CAPABILITY_PRODUCT_VER, g_capabilities.product_version, sizeof(g_capabilities.product_version))) { - D("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_PRODUCT_VER); + E("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_PRODUCT_VER); snprintf(g_capabilities.product_version, sizeof(g_capabilities.product_version), "%s", UNKNOWN); } @@ -1919,7 +1982,7 @@ static void init_capabilities(void) { // Sdbd plugin version if(!request_capability_to_plugin(CAPABILITY_PLUGIN_VER, g_capabilities.sdbd_plugin_version, sizeof(g_capabilities.sdbd_plugin_version))) { - D("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_PLUGIN_VER); + E("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_PLUGIN_VER); snprintf(g_capabilities.sdbd_plugin_version, sizeof(g_capabilities.sdbd_plugin_version), "%s", UNKNOWN); } @@ -1928,7 +1991,7 @@ static void init_capabilities(void) { // sdbd log enable if(!request_capability_to_plugin(CAPABILITY_LOG_ENABLE, g_capabilities.log_enable, sizeof(g_capabilities.log_enable))) { - D("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_LOG_ENABLE); + E("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_LOG_ENABLE); snprintf(g_capabilities.log_enable, sizeof(g_capabilities.log_enable), "%s", DISABLED); } @@ -1936,7 +1999,7 @@ static void init_capabilities(void) { // sdbd log path if(!request_capability_to_plugin(CAPABILITY_LOG_PATH, g_capabilities.log_path, sizeof(g_capabilities.log_path))) { - D("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_LOG_PATH); + E("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_LOG_PATH); snprintf(g_capabilities.log_path, sizeof(g_capabilities.log_path), "%s", UNKNOWN); } @@ -1944,7 +2007,7 @@ static void init_capabilities(void) { // Application command support if(!request_capability_to_plugin(CAPABILITY_APPCMD, g_capabilities.appcmd_support, sizeof(g_capabilities.appcmd_support))) { - D("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_APPCMD); + E("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_APPCMD); snprintf(g_capabilities.appcmd_support, sizeof(g_capabilities.appcmd_support), "%s", UNKNOWN); } @@ -1957,11 +2020,16 @@ static void init_capabilities(void) { // pkgcmd debug mode support if(!request_capability_to_plugin(CAPABILITY_DEBUGMODE, g_capabilities.pkgcmd_debugmode, sizeof(g_capabilities.pkgcmd_debugmode))) { - D("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_DEBUGMODE); + E("failed to request. (%d:%d) \n", PLUGIN_SYNC_CMD_CAPABILITY, CAPABILITY_DEBUGMODE); snprintf(g_capabilities.pkgcmd_debugmode, sizeof(g_capabilities.pkgcmd_debugmode), "%s", ENABLED); } + // netcore debugger support + ret = is_netcoredbg_supported(); + snprintf(g_capabilities.netcoredbg_support, sizeof(g_capabilities.netcoredbg_support), + "%s", ret == 1 ? ENABLED : DISABLED); + // Capability version snprintf(g_capabilities.sdbd_cap_version, sizeof(g_capabilities.sdbd_cap_version), "%d.%d", SDBD_CAP_VERSION_MAJOR, SDBD_CAP_VERSION_MINOR); @@ -1969,12 +2037,12 @@ static void init_capabilities(void) { static int is_support_usbproto() { - return (!strncmp(g_capabilities.usbproto_support, PLUGIN_RET_ENABLED, strlen(PLUGIN_RET_ENABLED))); + return (!strncmp(g_capabilities.usbproto_support, PLUGIN_RET_ENABLED, strlen(PLUGIN_RET_ENABLED)+1)); } static int is_support_sockproto() { - return (!strncmp(g_capabilities.sockproto_support, PLUGIN_RET_ENABLED, strlen(PLUGIN_RET_ENABLED))); + return (!strncmp(g_capabilities.sockproto_support, PLUGIN_RET_ENABLED, strlen(PLUGIN_RET_ENABLED)+1)); } #define EMULATOR_MODEL_NAME "Emulator" @@ -1986,16 +2054,16 @@ static void check_emulator_or_device() // Get the model name from model_config.xml ret = get_device_name(model_name, sizeof model_name); if (ret == 0) { - if(!strncmp(model_name, EMULATOR_MODEL_NAME, sizeof(EMULATOR_MODEL_NAME))){ + if(!strncmp(model_name, EMULATOR_MODEL_NAME, strlen("Emulator")+1)){ g_is_emulator = 1; - D("This target type is Emulator\n"); + I("This target type is Emulator\n"); } else { g_is_emulator = 0; - D("This target type is Device\n"); + I("This target type is Device\n"); } } else { g_is_emulator = -1; - D("failed to get the model name.\n"); + E("failed to get the model name.\n"); } } @@ -2022,13 +2090,13 @@ int sdb_main(int server_port) init_capabilities(); - sdb_trace_init(); - start_device_log(); + //sdb_trace_init(); + //start_device_log(); init_drop_privileges(); init_sdk_requirements(); if (!request_validity_to_plugin(PLUGIN_SYNC_CMD_VERIFY_LAUNCH, NULL)) { - D("sdbd should be launched in develop mode.\n"); + E("sdbd should be launched in develop mode.\n"); return -1; } @@ -2079,7 +2147,7 @@ int sdb_main(int server_port) cap.inheritable = 0; capset(&header, &cap); #endif - D("Local port disabled\n"); + I("Local port disabled\n"); } else { char local_name[30]; build_local_name(local_name, sizeof(local_name), server_port); @@ -2127,7 +2195,9 @@ int sdb_main(int server_port) D("sdb_main(): post init_jdwp()\n"); #endif - D("Event loop starting\n"); + sdb_notify_startup(0, "READY=1"); + + I("Event loop starting\n"); fdevent_loop(); @@ -2138,15 +2208,23 @@ int sdb_main(int server_port) return 0; } +void sdb_main_service() +{ + load_sdbd_plugin(); + init_capabilities(); + init_sdk_requirements(); + atexit(sdb_service_cleanup); +} + int copy_packet(apacket* dest, apacket* src) { if(dest == NULL) { - D("dest packet is NULL\n"); + E("dest packet is NULL\n"); return -1; } if(src == NULL) { - D("src packet is NULL\n"); + E("src packet is NULL\n"); return -1; } @@ -2232,43 +2310,3 @@ int handle_host_request(char *service, transport_type ttype, char* serial, int r } return -1; } - -int recovery_mode = 0; - -int main(int argc, char **argv) -{ - /* If sdbd runs inside the emulator this will enable sdb tracing via - * sdb-debug qemud service in the emulator. */ -#if 0 /* tizen specific */ - sdb_qemu_trace_init(); - if((argc > 1) && (!strcmp(argv[1],"recovery"))) { - sdb_device_banner = "recovery"; - recovery_mode = 1; - } -#endif - - apply_sdbd_commandline_defaults(&sdbd_commandline_args); - int parse_ret = parse_sdbd_commandline(&sdbd_commandline_args, argc, argv); - - // TODO: Add detailed error messages - // TODO: Add individual messages for help and usage - if(parse_ret != SDBD_COMMANDLINE_SUCCESS) { - if (parse_ret == SDBD_COMMANDLINE_HELP - || parse_ret == SDBD_COMMANDLINE_USAGE) { - // User requested help or usage - print_sdbd_usage_message(stdout); - return EXIT_SUCCESS; - } - - // Print usage message because of invalid options - print_sdbd_usage_message(stderr); - return EXIT_FAILURE; - } - - D("Handling main()\n"); - - //sdbd will never die on emulator! - signal(SIGTERM, handle_sig_term); /* tizen specific */ - return sdb_main(DEFAULT_SDB_PORT); -} -