From: yoonki.park Date: Fri, 28 Jun 2013 05:14:10 +0000 (+0900) Subject: notify to sdb server when sdbd is booting up X-Git-Tag: submit/tizen_2.2/20130628.120622~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=94b8c14c9b00186a85b51e14b2360196b81efb17;p=sdk%2Ftarget%2Fsdbd.git notify to sdb server when sdbd is booting up Change-Id: Id1cb623db97bbb31109b84d9f7b32e6fcf57347a Signed-off-by: yoonki.park --- diff --git a/src/sdb.h b/src/sdb.h index 99e05f3..0f30e0f 100644 --- a/src/sdb.h +++ b/src/sdb.h @@ -438,6 +438,8 @@ void sdb_qemu_trace(const char* fmt, ...); # define DEFAULT_SDB_PORT 26099 /* tizen specific */ #endif +# define QEMU_FORWARD_IP "10.0.2.2" + #define DEFAULT_SDB_LOCAL_TRANSPORT_PORT 26101 /* tizen specific */ #define SDB_CLASS 0xff diff --git a/src/strutils.c b/src/strutils.c index d56f70b..934cbdb 100644 --- a/src/strutils.c +++ b/src/strutils.c @@ -62,3 +62,24 @@ int read_line(const int fd, char* ptr, const unsigned int maxlen) } return -1; // no space } + +/** + * The standard strncpy() function does not guarantee that the resulting string is null terminated. + * char ntbs[NTBS_SIZE]; + * strncpy(ntbs, source, sizeof(ntbs)-1); + * ntbs[sizeof(ntbs)-1] = '\0' + */ +char *s_strncpy(char *dest, const char *source, size_t n) { + char *start = dest; + + while (n && (*dest++ = *source++)) { + n--; + } + if (n) { + while (--n) { + *dest++ = '\0'; + } + } + return start; +} + diff --git a/src/strutils.h b/src/strutils.h index d31cb2a..897579f 100644 --- a/src/strutils.h +++ b/src/strutils.h @@ -6,6 +6,6 @@ size_t tokenize(const char *str, const char *delim, char *tokens[], size_t max_tokens); void free_strings(char **array, int n); int read_line(const int fd, char* ptr, const unsigned int maxlen); - +char *s_strncpy(char *dest, const char *source, size_t n); #endif diff --git a/src/transport_local.c b/src/transport_local.c index 7c2a19a..c6250c9 100644 --- a/src/transport_local.c +++ b/src/transport_local.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "sysdeps.h" #include @@ -30,6 +31,7 @@ #define TRACE_TAG TRACE_TRANSPORT #include "sdb.h" +#include "strutils.h" #ifdef HAVE_BIG_ENDIAN #define H4(x) (((x) & 0xFF000000) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | (((x) & 0x000000FF) << 24) @@ -58,6 +60,11 @@ SDB_MUTEX_DEFINE( local_transports_lock ); static atransport* local_transports[ SDB_LOCAL_TRANSPORT_MAX ]; #endif /* SDB_HOST */ +SDB_MUTEX_DEFINE( register_noti_lock ); +#ifndef _WIN32 +static pthread_cond_t noti_cond = PTHREAD_COND_INITIALIZER; +#endif + static int remote_read(apacket *p, atransport *t) { if(readx(t->sfd, &p->msg, sizeof(amessage))){ @@ -263,6 +270,9 @@ static void *server_socket_thread(void * arg) alen = sizeof(addr); D("server: trying to get new connection from %d\n", port); + // im ready to accept new client! + pthread_cond_broadcast(¬i_cond); + fd = sdb_socket_accept(serverfd, &addr, &alen); if(fd >= 0) { D("server: new connection on fd %d\n", fd); @@ -390,6 +400,95 @@ static const char _ok_resp[] = "ok"; #endif // !SDB_HOST #endif +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) { + printf("buffer size should be over %d\n", len+1); + return -1; + } + + s_strncpy(str, s + strlen(dest), len); + return len; +} + +static void notify_sdbd_startup() { + int ret, s; + struct sockaddr_in server; + char buffer[1024]; + char request[1024]; + int len; + + memset( &server, 0, sizeof(server) ); + server.sin_family = AF_INET; + server.sin_port = htons(DEFAULT_SDB_PORT); + server.sin_addr.s_addr = inet_addr(QEMU_FORWARD_IP); + + s = socket(AF_INET, SOCK_STREAM, 0); + if (s < 0) { + D("could not create socket\n"); + return; + } + ret = connect( s, (struct sockaddr*) &server, sizeof(server) ); + if (ret < 0) { + D("could not connect to server\n"); + sdb_close(s); + return; + } + + // send the request + char cmdline[512]; + int fd = unix_open("/proc/cmdline", O_RDONLY); + char *port_str = "sdb_port="; + char *name_str = "vm_name="; + char port[7]={0,}; + char vm_name[256]={0,}; + + if (fd < 0) { + sdb_close(s); + return; + } + if(read_line(fd, cmdline, sizeof(cmdline))) { + D("qemu cmd: %s\n", cmdline); + ret = get_str_cmdline(cmdline, port_str, port, sizeof(port)); + if (ret < 1) { + D("could not get port from cmdline\n"); + sdb_close(fd); + sdb_close(s); + return; + } + // FIXME: remove comma! + port[strlen(port)-1]='\0'; + + ret = get_str_cmdline(cmdline, name_str, vm_name, sizeof(vm_name)); + if (ret < 1) { + D("could not get port from cmdline\n"); + sdb_close(fd); + sdb_close(s); + return; + } + int base_port = strtol(port, NULL, 10); + snprintf(request, sizeof request, "host:emulatoR:%d:%s",base_port + 1, vm_name); + + len = snprintf( buffer, sizeof buffer, "%04x%s", strlen(request), request ); + D("[%s]\n", buffer); + if (sdb_write(s, buffer, len) < 0) { + D("could not send sdbd noti request\n"); + } + } + sdb_close(fd); + sdb_close(s); +} + void local_init(int port) { sdb_thread_t thr; @@ -424,6 +523,17 @@ void local_init(int port) fatal_errno("cannot create local socket %s thread", HOST ? "client" : "server"); } + + /* + * wait until server socket thread made! + * get noti from server_socket_thread + */ + + sdb_mutex_lock(®ister_noti_lock); + pthread_cond_wait(¬i_cond, ®ister_noti_lock); + + notify_sdbd_startup(); + sdb_mutex_unlock(®ister_noti_lock); } static void remote_kick(atransport *t)