diff --git a/include/econfig-spec.h b/include/econfig-spec.h index 4c3fdd84..5d8548f3 100644 --- a/include/econfig-spec.h +++ b/include/econfig-spec.h @@ -58,6 +58,8 @@ EMPCFBOTH("data", datadir, char *, NSC_STRING, KM_INTERNAL, "Directory the data is stored in") EMPCFBOTH("info", infodir, char *, NSC_STRING, KM_INTERNAL, "Directory the info pages are stored in") +EMPCFBOTH("listen_addr", listen_addr, char *, NSC_STRING, KM_INTERNAL, + "Local address the server should listen on. \"\" listens on all.") EMPCFBOTH("port", loginport, char *, NSC_STRING, KM_INTERNAL, "TCP/IP port the server will start up on") EMPCFBOTH("privname", privname, char *, NSC_STRING, 0, diff --git a/src/lib/global/path.c b/src/lib/global/path.c index c18d7e12..d15c169b 100644 --- a/src/lib/global/path.c +++ b/src/lib/global/path.c @@ -50,4 +50,5 @@ char *banfil = "ban"; char *authfil = "auth"; char *timestampfil = "timestamp"; +char *listen_addr = ""; char *loginport = EMP_PORT; diff --git a/src/lib/player/accept.c b/src/lib/player/accept.c index 288dcb3b..b3d8c9d7 100644 --- a/src/lib/player/accept.c +++ b/src/lib/player/accept.c @@ -71,22 +71,37 @@ void player_init(void) { struct sockaddr_in sin; + struct hostent *hp; struct servent *sp; int s; - short port; int val; emp_initque(&Players); init_player_commands(); - sp = getservbyname("empire", "tcp"); - if (sp == 0) - port = htons(atoi(loginport)); - else - port = sp->s_port; - sin.sin_addr.s_addr = INADDR_ANY; - sin.sin_port = port; sin.sin_family = AF_INET; + if (!*listen_addr) + sin.sin_addr.s_addr = INADDR_ANY; + else if (isdigit(*listen_addr)) + sin.sin_addr.s_addr = inet_addr(listen_addr); + else { + hp = gethostbyname(listen_addr); + if (!hp) { + logerror("Can't resolve listen address %s", listen_addr); + exit(1); + } + memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr)); + } + if (isdigit(*loginport)) + sin.sin_port = htons(atoi(loginport)); + else { + sp = getservbyname(loginport, "tcp"); + if (!sp) { + logerror("Can't resolve service %s", loginport); + exit(1); + } + sin.sin_port = sp->s_port; + } if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { logerror("inet socket create"); exit(1);