#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) {
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");
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? */
}
}
+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;
static void sdb_cleanup(void)
{
+ clear_sdbd_commandline_args(&sdbd_commandline_args);
usb_cleanup();
// if(required_pid > 0) {
// kill(required_pid, SIGKILL);
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));