# HG changeset patch # User Matt Johnston # Date 1093238854 0 # Node ID 72dc22f568589eafb80b6ea7f4a0382aa2382f06 # Parent c72f5c10125ddc98628054cc7cf3d3058eb2389e Change the way we load keys/ports so we don't print error messages into our socket. diff -r c72f5c10125d -r 72dc22f56858 runopts.h --- a/runopts.h Mon Aug 23 02:46:24 2004 +0000 +++ b/runopts.h Mon Aug 23 05:27:34 2004 +0000 @@ -52,7 +52,7 @@ int usingsyslog; /* ports is an array of the portcount listening ports */ - uint16_t *ports; + char *ports[DROPBEAR_MAX_PORTS]; unsigned int portcount; int inetdmode; @@ -81,6 +81,7 @@ extern svr_runopts svr_opts; void svr_getopts(int argc, char ** argv); +void loadhostkeys(); /* Uncompleted XXX matt */ typedef struct cli_runopts { diff -r c72f5c10125d -r 72dc22f56858 svr-main.c --- a/svr-main.c Mon Aug 23 02:46:24 2004 +0000 +++ b/svr-main.c Mon Aug 23 05:27:34 2004 +0000 @@ -139,6 +139,10 @@ commonsetup(); + /* Now we can setup the hostkeys - needs to be after logging is on, + * otherwise we might end up blatting error messages to the socket */ + loadhostkeys(); + /* should be done after syslog is working */ if (svr_opts.forkbg) { dropbear_log(LOG_INFO, "Running in background"); @@ -358,21 +362,23 @@ static int listensockets(int *sock, int sockcount, int *maxfd) { unsigned int i; - char portstring[NI_MAXSERV]; char* errstring = NULL; unsigned int sockpos = 0; int nsock; + TRACE(("listensockets: %d to try\n", svr_opts.portcount)); + for (i = 0; i < svr_opts.portcount; i++) { - snprintf(portstring, sizeof(portstring), "%d", svr_opts.ports[i]); - nsock = dropbear_listen(NULL, portstring, &sock[sockpos], + TRACE(("listening on '%s'", svr_opts.ports[i])); + + nsock = dropbear_listen(NULL, svr_opts.ports[i], &sock[sockpos], sockcount - sockpos, &errstring, maxfd); if (nsock < 0) { - dropbear_log(LOG_WARNING, "Failed listening on port %s: %s", - portstring, errstring); + dropbear_log(LOG_WARNING, "Failed listening on '%s': %s", + svr_opts.ports[i], errstring); m_free(errstring); continue; } diff -r c72f5c10125d -r 72dc22f56858 svr-runopts.c --- a/svr-runopts.c Mon Aug 23 02:46:24 2004 +0000 +++ b/svr-runopts.c Mon Aug 23 05:27:34 2004 +0000 @@ -31,8 +31,6 @@ svr_runopts svr_opts; /* GLOBAL */ -static sign_key * loadhostkeys(const char * dsskeyfile, - const char * rsakeyfile); static void printhelp(const char * progname); static void printhelp(const char * progname) { @@ -86,16 +84,13 @@ #ifdef DROPBEAR_RSA RSA_PRIV_FILENAME, #endif - DROPBEAR_MAX_PORTS, DROPBEAR_PORT); + DROPBEAR_MAX_PORTS, DROPBEAR_DEFPORT); } void svr_getopts(int argc, char ** argv) { unsigned int i; char ** next = 0; - unsigned int portnum = 0; - char *portstring[DROPBEAR_MAX_PORTS]; - unsigned int longport; /* see printhelp() for options */ svr_opts.rsakeyfile = NULL; @@ -107,6 +102,8 @@ svr_opts.noauthpass = 0; svr_opts.norootpass = 0; svr_opts.inetdmode = 0; + svr_opts.portcount = 0; + svr_opts.hostkey = NULL; opts.nolocaltcp = 0; opts.noremotetcp = 0; /* not yet @@ -169,10 +166,12 @@ break; #endif case 'p': - if (portnum < DROPBEAR_MAX_PORTS) { - portstring[portnum] = NULL; - next = &portstring[portnum]; - portnum++; + if (svr_opts.portcount < DROPBEAR_MAX_PORTS) { + svr_opts.ports[svr_opts.portcount] = NULL; + next = &svr_opts.ports[svr_opts.portcount]; + /* Note: if it doesn't actually get set, we'll + * decrement it after the loop */ + svr_opts.portcount++; } break; #ifdef DO_MOTD @@ -201,14 +200,6 @@ debug_trace = 1; break; #endif - /* - case '4': - svr_opts.ipv4 = 0; - break; - case '6': - svr_opts.ipv6 = 0; - break; - */ default: fprintf(stderr, "Unknown argument %s\n", argv[i]); printhelp(argv[0]); @@ -218,13 +209,24 @@ } } + /* Set up listening ports */ + if (svr_opts.portcount == 0) { + svr_opts.ports[0] = m_strdup(DROPBEAR_DEFPORT); + svr_opts.portcount = 1; + } else { + /* we may have been given a -p option but no argument to go with + * it */ + if (svr_opts.ports[svr_opts.portcount-1] == NULL) { + svr_opts.portcount--; + } + } + if (svr_opts.dsskeyfile == NULL) { svr_opts.dsskeyfile = DSS_PRIV_FILENAME; } if (svr_opts.rsakeyfile == NULL) { svr_opts.rsakeyfile = RSA_PRIV_FILENAME; } - svr_opts.hostkey = loadhostkeys(svr_opts.dsskeyfile, svr_opts.rsakeyfile); if (svr_opts.bannerfile) { struct stat buf; @@ -246,35 +248,6 @@ buf_setpos(svr_opts.banner, 0); } - /* not yet - if (!(svr_opts.ipv4 || svr_opts.ipv6)) { - fprintf(stderr, "You can't disable ipv4 and ipv6.\n"); - exit(1); - } - */ - - /* create the array of listening ports */ - if (portnum == 0) { - /* non specified */ - svr_opts.portcount = 1; - svr_opts.ports = m_malloc(sizeof(uint16_t)); - svr_opts.ports[0] = DROPBEAR_PORT; - } else { - svr_opts.portcount = portnum; - svr_opts.ports = (uint16_t*)m_malloc(sizeof(uint16_t)*portnum); - for (i = 0; i < portnum; i++) { - if (portstring[i]) { - longport = atoi(portstring[i]); - if (longport <= 65535 && longport > 0) { - svr_opts.ports[i] = (uint16_t)longport; - continue; - } - } - fprintf(stderr, "Bad port '%s'\n", - portstring[i] ? portstring[i] : "null"); - } - } - } static void disablekey(int type, const char* filename) { @@ -287,47 +260,45 @@ break; } } - fprintf(stderr, "Failed reading '%s', disabling %s\n", filename, + dropbear_log(LOG_WARNING, "Failed reading '%s', disabling %s", filename, type == DROPBEAR_SIGNKEY_DSS ? "DSS" : "RSA"); } -static sign_key * loadhostkeys(const char * dsskeyfile, - const char * rsakeyfile) { +/* Must be called after syslog/etc is working */ +void loadhostkeys() { - sign_key * hostkey; int ret; int type; TRACE(("enter loadhostkeys")); - hostkey = new_sign_key(); + svr_opts.hostkey = new_sign_key(); #ifdef DROPBEAR_RSA type = DROPBEAR_SIGNKEY_RSA; - ret = readhostkey(rsakeyfile, hostkey, &type); + ret = readhostkey(svr_opts.rsakeyfile, svr_opts.hostkey, &type); if (ret == DROPBEAR_FAILURE) { - disablekey(DROPBEAR_SIGNKEY_RSA, rsakeyfile); + disablekey(DROPBEAR_SIGNKEY_RSA, svr_opts.rsakeyfile); } #endif #ifdef DROPBEAR_DSS type = DROPBEAR_SIGNKEY_DSS; - ret = readhostkey(dsskeyfile, hostkey, &type); + ret = readhostkey(svr_opts.dsskeyfile, svr_opts.hostkey, &type); if (ret == DROPBEAR_FAILURE) { - disablekey(DROPBEAR_SIGNKEY_DSS, dsskeyfile); + disablekey(DROPBEAR_SIGNKEY_DSS, svr_opts.dsskeyfile); } #endif if ( 1 #ifdef DROPBEAR_DSS - && hostkey->dsskey == NULL + && svr_opts.hostkey->dsskey == NULL #endif #ifdef DROPBEAR_RSA - && hostkey->rsakey == NULL + && svr_opts.hostkey->rsakey == NULL #endif ) { dropbear_exit("No hostkeys available"); } TRACE(("leave loadhostkeys")); - return hostkey; }