Add --usage/--help commandline options
[sdk/target/sdbd.git] / src / sdb.c
index 563dd18..d61cdc0 100644 (file)
--- a/src/sdb.c
+++ b/src/sdb.c
 #include <sys/time.h>
 #include <signal.h>
 #include <grp.h>
+#include <netdb.h>
+
 
 #include "sysdeps.h"
 #include "sdb.h"
+#include "strutils.h"
+#if !SDB_HOST
+#include "commandline_sdbd.h"
+#endif
 
 #if !SDB_HOST
 #include <linux/prctl.h>
 #else
 #include "usb_vendors.h"
 #endif
-
+#include <system_info.h>
+#define PROC_CMDLINE_PATH "/proc/cmdline"
 #if SDB_TRACE
 SDB_MUTEX_DEFINE( D_lock );
 #endif
 
 int HOST = 0;
 
+#if !SDB_HOST
+SdbdCommandlineArgs sdbd_commandline_args;
+#endif
+
 int is_emulator(void) {
-    if (access(USB_NODE_FILE, F_OK) == 0) {
-        return 0;
-    } else {
-        return 1;
-    }
+#if SDB_HOST
+       return 0;
+#else
+       return sdbd_commandline_args.emulator.host != NULL;
+#endif
 }
 
 void handle_sig_term(int sig) {
@@ -298,7 +309,7 @@ static void send_close(unsigned local, unsigned remote, atransport *t)
     p->msg.arg1 = remote;
     send_packet(p, t);
 }
-
+static int device_status = 0; // 0:online, 1: password locked later
 static void send_connect(atransport *t)
 {
     D("Calling send_connect \n");
@@ -306,9 +317,24 @@ static void send_connect(atransport *t)
     cp->msg.command = A_CNXN;
     cp->msg.arg0 = A_VERSION;
     cp->msg.arg1 = MAX_PAYLOAD;
-    snprintf((char*) cp->data, sizeof cp->data, "%s::",
-            HOST ? "host" : sdb_device_banner);
+
+    char device_name[256]={0,};
+    int r = 0;
+
+    if (is_emulator()) {
+        r = get_emulator_name(device_name, sizeof device_name);
+    } else {
+        r = get_device_name(device_name, sizeof device_name);
+    }
+    if (r < 0) {
+        snprintf((char*) cp->data, sizeof cp->data, "%s::%s::%d", sdb_device_banner, DEFAULT_DEVICENAME, device_status);
+    } else {
+        snprintf((char*) cp->data, sizeof cp->data, "%s::%s::%d", sdb_device_banner, device_name, device_status);
+    }
+
+    D("CNXN data:%s\n", (char*)cp->data);
     cp->msg.data_length = strlen((char*) cp->data) + 1;
+
     send_packet(cp, t);
 #if SDB_HOST
         /* XXX why sleep here? */
@@ -335,6 +361,79 @@ static char *connection_state_name(atransport *t)
     }
 }
 
+static int get_str_cmdline(char *src, char *dest, char str[], int str_size) {
+    char *s = strstr(src, dest);
+    if (s == NULL) {
+        return -1;
+    }
+    char *e = strstr(s, " ");
+    if (e == NULL) {
+        return -1;
+    }
+
+    int len = e-s-strlen(dest);
+
+    if (len >= str_size) {
+        D("buffer size(%d) should be bigger than %d\n", str_size, len+1);
+        return -1;
+    }
+
+    s_strncpy(str, s + strlen(dest), len);
+    return len;
+}
+
+int get_emulator_forward_port() {
+    SdbdCommandlineArgs *sdbd_args = &sdbd_commandline_args; /* alias */
+
+    if (sdbd_args->emulator.host == NULL) {
+        return -1;
+    }
+
+    return sdbd_args->emulator.port;
+}
+
+int get_emulator_name(char str[], int str_size) {
+    SdbdCommandlineArgs *sdbd_args = &sdbd_commandline_args; /* alias */
+
+    if (sdbd_args->emulator.host == NULL) {
+        return -1;
+    }
+
+    s_strncpy(str, sdbd_args->emulator.host, str_size);
+    return 0;
+}
+
+int get_device_name(char str[], int str_size) {
+    char *value = NULL;
+    int r = system_info_get_value_string(SYSTEM_INFO_KEY_MODEL, &value);
+    if (r != SYSTEM_INFO_ERROR_NONE) {
+        D("fail to get system model:%d\n", errno);
+        return -1;
+    } else {
+        s_strncpy(str, value, str_size);
+        D("returns model_name:%s\n", value);
+        if (value != NULL) {
+            free(value);
+        }
+        return 0;
+    }
+    /*
+    int fd = unix_open(USB_SERIAL_PATH, O_RDONLY);
+    if (fd < 0) {
+        D("fail to read:%s (%d)\n", USB_SERIAL_PATH, errno);
+        return -1;
+    }
+
+    if(read_line(fd, str, str_size)) {
+        D("device serial name: %s\n", str);
+        sdb_close(fd);
+        return 0;
+    }
+    sdb_close(fd);
+    */
+    return -1;
+}
+
 void parse_banner(char *banner, atransport *t)
 {
     char *type, *product, *end;
@@ -697,6 +796,7 @@ static BOOL WINAPI ctrlc_handler(DWORD type)
 
 static void sdb_cleanup(void)
 {
+    clear_sdbd_commandline_args(&sdbd_commandline_args);
     usb_cleanup();
 //    if(required_pid > 0) {
 //        kill(required_pid, SIGKILL);
@@ -1503,6 +1603,25 @@ int main(int argc, char **argv)
         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;
+    }
+
 #if !SDB_HOST
     if (daemonize() < 0)
         fatal("daemonize() failed: %.200s", strerror(errno));