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);
static struct ac_element ac_forward = {
.keyword = "forward",
- .func = no_parse
+ .func = parse_forward
};
static struct ac_element ac_uninstall= {
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) {
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;
}
return 1;
}
}
-
int install(int argc, char **argv) {
char* srcpath = argv[1];
const char* filename = sdb_dirstop(srcpath);
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);
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);
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;
#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_ */
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[] = {
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;
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);
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 {
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);
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;
}
+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
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 );