summaryrefslogtreecommitdiffhomepage
path: root/svr-runopts.c
diff options
context:
space:
mode:
authorGuilhem Moulin <guilhem@fripost.org>2015-11-06 23:54:24 +0800
committerGuilhem Moulin <guilhem@fripost.org>2015-11-06 23:54:24 +0800
commit7fb1bec84ab9386ae8638864b7832d52c3501942 (patch)
treeff28cb2610ebca381e9efe40750661d40376b198 /svr-runopts.c
parent1f308fb2b42066d9bd8292d3a05a6340451adb3c (diff)
Enable bundling
Diffstat (limited to 'svr-runopts.c')
-rw-r--r--svr-runopts.c61
1 files changed, 33 insertions, 28 deletions
diff --git a/svr-runopts.c b/svr-runopts.c
index 26c199b..bf5f8a6 100644
--- a/svr-runopts.c
+++ b/svr-runopts.c
@@ -112,13 +112,14 @@ static void printhelp(const char * progname) {
void svr_getopts(int argc, char ** argv) {
- unsigned int i;
+ unsigned int i, j;
char ** next = 0;
int nextisport = 0;
char* recv_window_arg = NULL;
char* keepalive_arg = NULL;
char* idle_timeout_arg = NULL;
char* keyfile = NULL;
+ char c;
/* see printhelp() for options */
@@ -168,33 +169,10 @@ void svr_getopts(int argc, char ** argv) {
#endif
for (i = 1; i < (unsigned int)argc; i++) {
- if (nextisport) {
- addportandaddress(argv[i]);
- nextisport = 0;
- continue;
- }
-
- if (next) {
- *next = argv[i];
- if (*next == NULL) {
- dropbear_exit("Invalid null argument");
- }
- next = 0x00;
+ if (argv[i][0] != '-' || argv[i][1] == '\0')
+ dropbear_exit("Invalid argument: %s", argv[i]);
- if (keyfile) {
- addhostkey(keyfile);
- keyfile = NULL;
- }
- continue;
- }
-
- if (argv[i][0] == '-') {
- char c = argv[i][1];
- if (strlen(argv[i]) != 2) {
- /* We only handle one flag per hyphen */
- fprintf(stderr, "Warning, trailing '%s' of '%s' is ignored.\n",
- &argv[i][2], argv[i]);
- }
+ for (j = 1; (c = argv[i][j]) != '\0' && !next && !nextisport; j++) {
switch (c) {
case 'b':
next = &svr_opts.bannerfile;
@@ -284,12 +262,39 @@ void svr_getopts(int argc, char ** argv) {
exit(EXIT_SUCCESS);
break;
default:
- fprintf(stderr, "Unknown argument %s\n", argv[i]);
+ fprintf(stderr, "Invalid option -%c\n", c);
printhelp(argv[0]);
exit(EXIT_FAILURE);
break;
}
}
+
+ if (!next && !nextisport)
+ continue;
+
+ if (c == '\0') {
+ i++;
+ j = 0;
+ if (!argv[i]) {
+ dropbear_exit("Missing argument");
+ }
+ }
+
+ if (nextisport) {
+ addportandaddress(&argv[i][j]);
+ nextisport = 0;
+ } else if (next) {
+ *next = &argv[i][j];
+ if (*next == NULL) {
+ dropbear_exit("Invalid null argument");
+ }
+ next = 0x00;
+
+ if (keyfile) {
+ addhostkey(keyfile);
+ keyfile = NULL;
+ }
+ }
}
/* Set up listening ports */