On Wed, 28 Oct 2015 at 21:47:24 +0800, Matt Johnston wrote:
> I've changed the code to just print a warning for the time being. I'm
> intending for the next release to be soon with small bugfixes. Using getopt
> would probably be good though would require checking availability for the
> platforms where Dropbear is used.

In fact the current code can easily be tweaked to enable bundling.
(I've only touched svr-runopts for now; will proceed with cli-runopts if
you're fine with that patch.)  Refactoring the code to use getopt is
actually cumpersome due to the #ifdef changing the option string.

> By backwards compatibility I just meant the issue where the behaviour would
> change slightly.

---
 svr-runopts.c | 59 +++++++++++++++++++++++++++++++----------------------------
 1 file changed, 31 insertions(+), 28 deletions(-)

diff --git a/svr-runopts.c b/svr-runopts.c
index 26c199b..ec29883 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,37 @@ 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 (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 */
-- 
2.6.2

Reply via email to