SDB: Added 'forward-list' command 18/20118/6
authorshingil.kang <shingil.kang@samsung.com>
Mon, 28 Apr 2014 07:21:26 +0000 (16:21 +0900)
committershingil.kang <shingil.kang@samsung.com>
Mon, 28 Jul 2014 05:00:55 +0000 (14:00 +0900)
'forward-list' command shows list of forwarding ports

Change-Id: Ic0c1f52dc8fb2887998fec72501ed2b419dea00d
Signed-off-by: shingil.kang <shingil.kang@samsung.com>
src/auto_complete.c
src/command_function.c
src/command_function.h
src/commandline.c
src/listener.c
src/listener.h
src/sdb_constants.c
src/sdb_constants.h
src/sockets.c
src/transport.c
src/transport.h

index b56d33b49e4006542d5d0599f82d4b1c7c18d3f9..86e184bdef7d8d16855d8ece09d80e3244e67479 100644 (file)
@@ -43,6 +43,7 @@ static int parse_dev(int argc, char** argv);
 static int parse_serial(int argc, char** argv);
 static int no_parse(int argc, char** argv);
 static int parse_root(int argc, char** argv);
+static int parse_forward(int argc, char** argv);
 static int parse_install(int argc, char** argv);
 static int parse_uninstall(int argc, char** argv);
 static int parse_disconnect(int argc, char** argv);
@@ -135,7 +136,7 @@ static struct ac_element ac_help = {
 
 static struct ac_element ac_forward = {
         .keyword = "forward",
-        .func = no_parse
+        .func = parse_forward
 };
 
 static struct ac_element ac_uninstall= {
@@ -306,6 +307,15 @@ static int parse_root(int argc, char** argv) {
     return -1;
 }
 
+static int parse_forward(int argc, char** argv) {
+    if(argc == 0) {
+        char* root_options[] = {"--list", "--remove", "--remove-all"};
+        int ropt_size = GET_ARRAY_SIZE(root_options, char*);
+        print_char_with_completion_flag(ropt_size, (char**)root_options, argv);
+    }
+    return -1;
+}
+
 static int parse_uninstall(int argc, char** argv) {
 
     if(argc == 0) {
index 055b30af18114db649e91cf1b8fbcff1e77c8fb9..69588556f84e2d0353feae9b9e514ab8eaac10ea 100644 (file)
@@ -422,16 +422,69 @@ int version(int argc, char ** argv) {
 
 int forward(int argc, char ** argv) {
 
-    char full_cmd[PATH_MAX];
-    char prefix[NAME_MAX];
+    if(argv[1] == NULL){
+        return -1;
+    }
+
+    if(!strcmp(argv[1],"--list")) {
+        forward_list();
+    } else if (!strcmp(argv[1],"--remove")) {
+        forward_remove(argv[2]);
+    } else if (!strcmp(argv[1],"--remove-all")) {
+        forward_remove_all();
+    } else {
+        char full_cmd[PATH_MAX];
+        char prefix[NAME_MAX];
 
-    get_host_prefix(prefix, NAME_MAX, target_ttype, target_serial, host);
-    snprintf(full_cmd, sizeof full_cmd, "%sforward:%s;%s",prefix, argv[1], argv[2]);
+        get_host_prefix(prefix, NAME_MAX, target_ttype, target_serial, host);
+        snprintf(full_cmd, sizeof full_cmd, "%sforward:%s;%s",prefix, argv[1], argv[2]);
 
-    D(COMMANDLINE_MSG_FULL_CMD, argv[0], full_cmd);
-    if(sdb_command(full_cmd) < 0) {
+        D(COMMANDLINE_MSG_FULL_CMD, argv[0], full_cmd);
+        if(sdb_command(full_cmd) < 0) {
+            return 1;
+        }
+    }
+
+    return 0;
+}
+
+int forward_list() {
+    char *tmp = NULL;
+    char full_cmd[PATH_MAX];
+
+    snprintf(full_cmd, sizeof full_cmd, "host:forward-list");
+    D(COMMANDLINE_MSG_FULL_CMD, "forward-list", full_cmd);
+    tmp = sdb_query(full_cmd);
+    if(tmp) {
+        printf("List of port forwarding\n");
+        printf("%-20s\t%-10s\t%s\n", "SERIAL", "LOCAL", "REMOTE");
+        printf("%s", tmp);
+        return 0;
+    } else {
         return 1;
     }
+}
+
+int forward_remove(char *local) {
+    char full_cmd[PATH_MAX];
+
+    snprintf(full_cmd, sizeof full_cmd, "host:forward-remove:%s", local);
+    D(COMMANDLINE_MSG_FULL_CMD, "forward --remove", full_cmd);
+    int result = sdb_connect(full_cmd);
+    if(result < 0) {
+        return -1;
+    }
+    return 0;
+}
+
+int forward_remove_all() {
+    char* full_cmd = "host:forward-remove-all";
+
+    D(COMMANDLINE_MSG_FULL_CMD, "forward --remove-all", full_cmd);
+    int result = sdb_connect(full_cmd);
+    if(result < 0) {
+        return -1;
+    }
     return 0;
 }
 
@@ -546,7 +599,6 @@ int forkserver(int argc, char** argv) {
         return 1;
     }
 }
-
 int install(int argc, char **argv) {
     char* srcpath = argv[1];
     const char* filename = sdb_dirstop(srcpath);
index 7722eb345a6d11dee3a748b0a516a1eb5a183bed..4e450067f54b0c512d5a730e9c60618180e50cf2 100644 (file)
@@ -48,6 +48,9 @@ int start_server(int argc, char ** argv);
 int kill_server(int argc, char ** argv);
 int version(int argc, char ** argv);
 int forward(int argc, char ** argv);
+int forward_list();
+int forward_remove(char *local);
+int forward_remove_all();
 int push(int argc, char ** argv);
 int pull(int argc, char ** argv);
 int dlog(int argc, char ** argv);
index 24ed40a82ddd54e1edec7cef4a5c37fdaf48dc4d..c95e22ab0a696be0ce9fd4c1449150d7a5424bd5 100755 (executable)
@@ -474,6 +474,21 @@ static void create_cmd_list(LIST_NODE** cmd_list) {
             COMMANDLINE_UNINSTALL_DESC_SIZE, COMMANDLINE_UNINSTALL_ARG_DESC, uninstall, COMMANDLINE_UNINSTALL_MAX_ARG, COMMANDLINE_UNINSTALL_MIN_ARG);
     prepend(cmd_list, uninstall_cmd);
 
+    COMMAND* forward_remove_all_cmd = NULL;
+    create_command(&forward_remove_all_cmd, COMMANDLINE_FORWARD_REMOVE_ALL_NAME, COMMANDLINE_FORWARD_REMOVE_ALL_DESC,
+            COMMANDLINE_FORWARD_REMOVE_ALL_DESC_SIZE, EMPTY_STRING, forward, COMMANDLINE_FORWARD_REMOVE_ALL_MAX_ARG, COMMANDLINE_FORWARD_REMOVE_ALL_MIN_ARG);
+    prepend(cmd_list, forward_remove_all_cmd);
+
+    COMMAND* forward_remove_cmd = NULL;
+    create_command(&forward_remove_cmd, COMMANDLINE_FORWARD_REMOVE_NAME, COMMANDLINE_FORWARD_REMOVE_DESC,
+            COMMANDLINE_FORWARD_REMOVE_DESC_SIZE, COMMANDLINE_FORWARD_REMOVE_ARG_DESC, forward, COMMANDLINE_FORWARD_REMOVE_MAX_ARG, COMMANDLINE_FORWARD_REMOVE_MIN_ARG);
+    prepend(cmd_list, forward_remove_cmd);
+
+    COMMAND* forward_list_cmd = NULL;
+    create_command(&forward_list_cmd, COMMANDLINE_FORWARD_LIST_NAME, COMMANDLINE_FORWARD_LIST_DESC,
+            COMMANDLINE_FORWARD_LIST_DESC_SIZE, EMPTY_STRING, forward, COMMANDLINE_FORWARD_LIST_MAX_ARG, COMMANDLINE_FORWARD_LIST_MIN_ARG);
+    prepend(cmd_list, forward_list_cmd);
+
     COMMAND* forward_cmd = NULL;
     create_command(&forward_cmd, COMMANDLINE_FORWARD_NAME, COMMANDLINE_FORWARD_DESC,
             COMMANDLINE_FORWARD_DESC_SIZE, COMMANDLINE_FORWARD_ARG_DESC, forward, COMMANDLINE_FORWARD_MAX_ARG, COMMANDLINE_FORWARD_MIN_ARG);
index 395e79851e0a4938467e5d64b826b2b70ba11145..cd6de76f8c38046123daaeae5de860de965c394a 100755 (executable)
@@ -99,15 +99,30 @@ int install_listener(int local_port, int connect_port, TRANSPORT* transport, LIS
     return 0;
 }
 
-int remove_listener(int local_port, int connect_port, TRANSPORT* transport)
+//int remove_listener(int local_port, int connect_port, TRANSPORT* transport)
+//{
+//    LOG_INFO("LN(%d)\n", local_port);
+//    LISTENER* listener = find_listener(local_port);
+//
+//    if(listener != NULL &&
+//            connect_port == listener->connect_port &&
+//            listener->transport != NULL &&
+//            listener->transport == transport) {
+//        remove_node(&listener_list, listener->node, free_listener);
+//        LOG_INFO("LN(%d) removed\n", local_port);
+//        return 0;
+//    }
+//
+//    LOG_ERROR("LN(%d) could not find\n", local_port);
+//    return -1;
+//}
+
+int remove_listener(int local_port)
 {
     LOG_INFO("LN(%d)\n", local_port);
     LISTENER* listener = find_listener(local_port);
 
-    if(listener != NULL &&
-            connect_port == listener->connect_port &&
-            listener->transport != NULL &&
-            listener->transport == transport) {
+    if(listener != NULL && listener->transport != NULL) {
         remove_node(&listener_list, listener->node, free_listener);
         LOG_INFO("LN(%d) removed\n", local_port);
         return 0;
index ee598105f97664bb214ec0f349322f00f377f50b..085ce8728ab34940d73e56bb35fb499f9a57f679 100644 (file)
@@ -30,8 +30,9 @@
 #include "common_modules.h"
 extern LIST_NODE* listener_list;
 
-int remove_listener(int local_port, int connect_port, TRANSPORT* transport);
 int install_listener(int local_port, int connect_port, TRANSPORT* transport, LISTENER_TYPE ltype);
+//int remove_listener(int local_port, int connect_port, TRANSPORT* transport);
+int remove_listener(int local_port);
 void  free_listener(void* data);
 
 #endif /* LISTENER_H_ */
index 13a181eb190c34f946a9795489f7391697a4aa38..038783a2df3545fcbd9172168a4986e280605fc9 100644 (file)
     const int COMMANDLINE_FORWARD_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_FORWARD_DESC, char*);
     const char* COMMANDLINE_FORWARD_ARG_DESC = "<local> <remote>";
     const int COMMANDLINE_FORWARD_MAX_ARG = 2;
-    const int COMMANDLINE_FORWARD_MIN_ARG = 2;
+    const int COMMANDLINE_FORWARD_MIN_ARG = 1;
+
+    const char* COMMANDLINE_FORWARD_LIST_NAME = "forward --list";
+        const char* COMMANDLINE_FORWARD_LIST_DESC[] = {
+                "list all forward socket connections",
+        };
+    const int COMMANDLINE_FORWARD_LIST_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_FORWARD_LIST_DESC, char*);
+    const int COMMANDLINE_FORWARD_LIST_MAX_ARG = 0;
+    const int COMMANDLINE_FORWARD_LIST_MIN_ARG = 0;
+
+    const char* COMMANDLINE_FORWARD_REMOVE_NAME = "forward --remove";
+        const char* COMMANDLINE_FORWARD_REMOVE_DESC[] = {
+                "remove a specific forward socket connections",
+        };
+    const int COMMANDLINE_FORWARD_REMOVE_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_FORWARD_REMOVE_DESC, char*);
+    const char* COMMANDLINE_FORWARD_REMOVE_ARG_DESC = "<local>";
+    const int COMMANDLINE_FORWARD_REMOVE_MAX_ARG = 1;
+    const int COMMANDLINE_FORWARD_REMOVE_MIN_ARG = 1;
+
+    const char* COMMANDLINE_FORWARD_REMOVE_ALL_NAME = "forward --remove-all";
+        const char* COMMANDLINE_FORWARD_REMOVE_ALL_DESC[] = {
+                "remove all forward socket connections",
+        };
+    const int COMMANDLINE_FORWARD_REMOVE_ALL_DESC_SIZE = GET_ARRAY_SIZE(COMMANDLINE_FORWARD_REMOVE_ALL_DESC, char*);
+    const int COMMANDLINE_FORWARD_REMOVE_ALL_MAX_ARG = 0;
+    const int COMMANDLINE_FORWARD_REMOVE_ALL_MIN_ARG = 0;
 
     const char* COMMANDLINE_PUSH_NAME = "push";
     const char* COMMANDLINE_PUSH_DESC[] = {
index 87cf223c5e804d6f12226623e6a5d58d13e021c8..ff637fd0d0ffe529d63ba8f75624b470ec250a78 100644 (file)
@@ -151,6 +151,25 @@ typedef enum host_type HOST_TYPE;
     extern const int COMMANDLINE_FORWARD_MAX_ARG;
     extern const int COMMANDLINE_FORWARD_MIN_ARG;
 
+    extern const char* COMMANDLINE_FORWARD_LIST_NAME;
+    extern const char* COMMANDLINE_FORWARD_LIST_DESC[];
+    extern const int COMMANDLINE_FORWARD_LIST_DESC_SIZE;
+    extern const int COMMANDLINE_FORWARD_LIST_MAX_ARG;
+    extern const int COMMANDLINE_FORWARD_LIST_MIN_ARG;
+
+    extern const char* COMMANDLINE_FORWARD_REMOVE_NAME;
+    extern const char* COMMANDLINE_FORWARD_REMOVE_DESC[];
+    extern const int COMMANDLINE_FORWARD_REMOVE_DESC_SIZE;
+    extern const char* COMMANDLINE_FORWARD_REMOVE_ARG_DESC;
+    extern const int COMMANDLINE_FORWARD_REMOVE_MAX_ARG;
+    extern const int COMMANDLINE_FORWARD_REMOVE_MIN_ARG;
+
+    extern const char* COMMANDLINE_FORWARD_REMOVE_ALL_NAME;
+    extern const char* COMMANDLINE_FORWARD_REMOVE_ALL_DESC[];
+    extern const int COMMANDLINE_FORWARD_REMOVE_ALL_DESC_SIZE;
+    extern const int COMMANDLINE_FORWARD_REMOVE_ALL_MAX_ARG;
+    extern const int COMMANDLINE_FORWARD_REMOVE_ALL_MIN_ARG;
+
     extern const char* COMMANDLINE_DLOG_NAME;
     extern const char* COMMANDLINE_DLOG_DESC[];
     extern const int COMMANDLINE_DLOG_DESC_SIZE;
index 6187dd54e3c7f07f6c922b25d8d134facc14c13c..82c864785c8d5b517e9783de6e8daa51d3b7be16 100755 (executable)
@@ -640,46 +640,55 @@ static int parse_host_service(char* host_str, char** service_ptr, TRANSPORT** t,
 
 static int handle_request_with_t(SDB_SOCKET* socket, char* service, TRANSPORT* t, char* err_str) {
     int forward = 0;
+    char* forward_err = NULL;
 
     if(!strncmp(service,"forward:",8)) {
         forward = 8;
     }
-    else if (!strncmp(service,"killforward:",12)) {
-        forward = 12;
+    else if (!strncmp(service,"forward-remove:",15)) {
+        forward = 15;
+    }
+    else if (!strncmp(service,"forward-remove-all",18)) {
+        forward = 18;
     }
 
-    if(forward) {
-        char* forward_err = NULL;
-
-        char *local, *remote = NULL;
-        local = service + forward;
-        remote = strchr(local,';');
+    if(forward  == 8 || forward == 15) {
+        char *request, *local, *remote = NULL;
+        request = service + forward;
 
-        if (t == NULL || t->connection_state == CS_OFFLINE) {
-            if(t != NULL) {
-                forward_err = (char*)ERR_TRANSPORT_TARGET_OFFLINE;
+        // if --remove option
+        if(strchr(request, ';') == NULL){
+            local = request;
+        }
+        // if no option
+        else{
+            local = strtok(request, ";");
+            remote = strtok(NULL , ";");
+            if(remote == 0 || remote[1] == '\0') {
+                forward_err = "malformed forward spec";
+                goto sendfail;
             }
-            else {
-                forward_err = err_str;
+            if(strncmp("tcp:", remote, 4)){
+                forward_err = (char*)ERR_FORWARD_UNKNOWN_REMOTE_PORT;
+                goto sendfail;
+            }
+
+            if (t == NULL || t->connection_state == CS_OFFLINE) {
+                if(t != NULL) {
+                    forward_err = (char*)ERR_TRANSPORT_TARGET_OFFLINE;
+                }
+                else {
+                    forward_err = err_str;
+                }
+                goto sendfail;
             }
-            goto sendfail;
-        }
-        if(remote == 0 || remote[1] == '\0') {
-            forward_err = "malformed forward spec";
-            goto sendfail;
         }
-        *remote++ = 0;
 
         if(strncmp("tcp:", local, 4)){
             forward_err = (char*)ERR_FORWARD_UNKNOWN_LOCAL_PORT;
             goto sendfail;
         }
 
-        if(strncmp("tcp:", remote, 4)){
-            forward_err = (char*)ERR_FORWARD_UNKNOWN_REMOTE_PORT;
-            goto sendfail;
-        }
-
         if (forward == 8) {
             if(!install_listener(atoi(local + 4), atoi(remote + 4), t, forwardListener)) {
                 writex(socket->fd, "OKAYOKAY", 8);
@@ -689,8 +698,8 @@ static int handle_request_with_t(SDB_SOCKET* socket, char* service, TRANSPORT* t
                 forward_err = (char*)ERR_FORWARD_INSTALL_FAIL;
                 goto sendfail;
             }
-        } else {
-            if(!remove_listener(atoi(local + 4), atoi(remote + 4), t)) {
+        } else if (forward == 15) {
+            if(!remove_listener(atoi(local + 4))) {
                 writex(socket->fd, "OKAYOKAY", 8);
                 return 0;
             } else {
@@ -702,6 +711,26 @@ sendfail:
         sendfailmsg(socket->fd, forward_err);
         return 0;
     }
+
+    else if (forward == 18) {
+         sdb_mutex_lock(&transport_lock, "transport remove_all_forwarding");
+
+         LIST_NODE* currentptr = listener_list;
+         while(currentptr != NULL) {
+             LISTENER* l = currentptr->data;
+             if (l->type == forwardListener) {
+                 if(remove_listener(l->local_port)){
+                     forward_err = (char*)ERR_FORWARD_REMOVE_FAIL;
+                     goto sendfail;
+                 }
+             }
+             currentptr = currentptr->next_ptr;
+         }
+         writex(socket->fd, "OKAYOKAY", 8);
+         sdb_mutex_unlock(&transport_lock, "transport remove_all_forwarding");
+         return 0;
+    }
+
     else if(!strncmp(service,"get-serialno",strlen("get-serialno"))) {
        if (t) {
            sendokmsg(socket->fd, t->serial);
@@ -856,6 +885,13 @@ static int handle_host_request(char *service, SDB_SOCKET* socket)
         return 0;
     }
 
+    // return a list of all forwarding ports
+    if(!strcmp(service, "forward-list")) {
+        list_forwarding(cmd_buf, cbuf_size);
+        sendokmsg(socket->fd, cmd_buf);
+        return 0;
+    }
+
     // add a new TCP transport, device or emulator
     if (!strncmp(service, "connect:", 8)) {
         char* host = service + 8;
index 8e771a0f9293388722534387105e22e7547ba6a7..c0b4d9793975a7bd40925de0b07d1389d088255d 100755 (executable)
@@ -612,6 +612,38 @@ int list_targets(char* buf, size_t bufsize, transport_type ttype) {
 
 }
 
+int list_forwarding(char* buf, size_t bufsize) {
+
+    char* p = buf;
+    char* end = buf + bufsize;
+    int len;
+    char localPort[10];
+    char remotePort[10];
+
+    sdb_mutex_lock(&transport_lock, "transport list_forwarding");
+
+    LIST_NODE* currentptr = listener_list;
+    while(currentptr != NULL) {
+        LISTENER* l = currentptr->data;
+        if (l->type == forwardListener) {
+            const char* device_serial = l->transport->serial;
+            snprintf(localPort, 10, "%s:%d", "tcp", l->local_port);
+            snprintf(remotePort, 10, "%s:%d", "tcp", l->connect_port);
+
+            len = snprintf(p, end - p, "%-20s\t%-10s\t%s\n", device_serial, localPort, remotePort);
+            if (p + len >= end) {
+                /* discard last line if buffer is too short */
+               break;
+            }
+            p += len;
+        }
+        currentptr = currentptr->next_ptr;
+    }
+    p[0] = 0;
+    sdb_mutex_unlock(&transport_lock, "transport list_forwarding");
+    return p - buf;
+}
+
 int register_device_con_transport(int s, const char *serial) {
 
     //TODO REMOTE_DEVICE_CONNECT complete device connect after resolving security issue
index f588c7dc4bc70572b752df7359c84110a9795fb9..95d55af7c8b3a6dccdc696417b8c4f9eb5084c52 100755 (executable)
@@ -64,6 +64,7 @@ void send_cmd(unsigned arg0, unsigned arg1, unsigned cmd, char* data, TRANSPORT*
 void close_usb_devices();
 int list_transports_msg(char*  buffer, size_t  bufferlen);
 int list_targets(char* buf, size_t bufsize, transport_type ttype);
+int list_forwarding(char* buf, size_t bufsize);
 int local_connect(int  port, const char *device_name);
 TRANSPORT *acquire_one_transport(transport_type ttype, const char* serial, char **error_out);
 void kick_transport( TRANSPORT*  t );