summaryrefslogtreecommitdiffhomepage
path: root/svr-runopts.c
diff options
context:
space:
mode:
Diffstat (limited to 'svr-runopts.c')
-rw-r--r--svr-runopts.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/svr-runopts.c b/svr-runopts.c
index 36ea26b..af966fb 100644
--- a/svr-runopts.c
+++ b/svr-runopts.c
@@ -351,6 +351,7 @@ void svr_getopts(int argc, char ** argv) {
if (svr_opts.portcount == 0) {
svr_opts.ports[0] = m_strdup(DROPBEAR_DEFPORT);
svr_opts.addresses[0] = m_strdup(DROPBEAR_DEFADDRESS);
+ svr_opts.devices[0] = NULL;
svr_opts.portcount = 1;
}
@@ -437,6 +438,7 @@ void svr_getopts(int argc, char ** argv) {
static void addportandaddress(const char* spec) {
char *spec_copy = NULL, *myspec = NULL, *port = NULL, *address = NULL;
+ char *device = NULL;
if (svr_opts.portcount < DROPBEAR_MAX_PORTS) {
@@ -444,7 +446,8 @@ static void addportandaddress(const char* spec) {
spec_copy = m_strdup(spec);
myspec = spec_copy;
- if (myspec[0] == '[') {
+ if ((myspec = strchr(myspec, '['))) {
+ myspec[0] = '\0';
myspec++;
port = strchr(myspec, ']');
if (!port) {
@@ -457,9 +460,26 @@ static void addportandaddress(const char* spec) {
/* Missing port -> exit */
dropbear_exit("Missing port");
}
+
+ device = spec_copy;
+ if (device[strlen(device)-1] == ':')
+ device[strlen(device)-1] = '\0';
} else {
+ myspec = spec_copy;
+
/* search for ':', that separates address and port */
port = strrchr(myspec, ':');
+
+ if (port) {
+ device = strchr(myspec, ':');
+ if (port == device) {
+ device = NULL;
+ } else if (device) /* always true */ {
+ device[0] = '\0';
+ myspec = device + 1;
+ device = spec_copy;
+ }
+ }
}
if (!port) {
@@ -483,6 +503,10 @@ static void addportandaddress(const char* spec) {
}
svr_opts.ports[svr_opts.portcount] = m_strdup(port);
svr_opts.addresses[svr_opts.portcount] = m_strdup(address);
+ if (device)
+ svr_opts.devices[svr_opts.portcount] = m_strdup(device);
+ else
+ svr_opts.devices[svr_opts.portcount] = NULL;
svr_opts.portcount++;
m_free(spec_copy);
}