(player_init, player_accept): Move socket bind and listen from

player_accept() to player_init().  Acquiring resources during
initialization allows to exit unsuccessfully on errors.  Previously,
the daemon detached itself (exiting successfully), then failed in the
background.
(player_socket): New.
This commit is contained in:
Markus Armbruster 2005-03-08 16:51:19 +00:00
parent ab2bea5810
commit 30f2b2c4ea

View file

@ -60,13 +60,61 @@
#include <stdlib.h>
#include <stdio.h>
struct emp_qelem Players;
static struct emp_qelem Players;
static int player_socket;
void
player_init(void)
{
struct sockaddr_in sin;
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 ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
logerror("inet socket create");
exit(1);
}
val = 1;
#if !(defined(__linux__) && defined(__alpha__))
if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val))
< 0) {
logerror("inet socket setsockopt SO_REUSEADDR (%d)", errno);
exit(1);
}
#else
logerror("Alpha/Linux? You don't support SO_REUSEADDR yet, do you?\n");
#endif
if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
logerror("inet socket bind");
exit(1);
}
#ifdef LISTENMAXCONN /* because someone in linux world didn't want to use
* SOMAXCONN as defined in the header files... */
if (listen(s, LISTENMAXCONN) < 0) {
logerror("inet socket listen");
exit(1);
}
#else
if (listen(s, SOMAXCONN) < 0) {
logerror("inet socket listen");
exit(1);
}
#endif
player_socket = s;
}
struct player *
@ -196,10 +244,7 @@ void
player_accept(void *unused)
{
struct sockaddr_in sin;
struct servent *sp;
int s;
short port;
int val;
int s = player_socket;
struct player *np;
int len;
int ns;
@ -207,45 +252,6 @@ player_accept(void *unused)
int stacksize;
char buf[128];
player_init();
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 ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
logerror("inet socket create");
exit(1);
}
val = 1;
#if !(defined(__linux__) && defined(__alpha__))
if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val))
< 0) {
logerror("inet socket setsockopt SO_REUSEADDR (%d)", errno);
exit(1);
}
#else
logerror("Alpha/Linux? You don't support SO_REUSEADDR yet, do you?\n");
#endif
if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
logerror("inet socket bind");
exit(1);
}
#ifdef LISTENMAXCONN /* because someone in linux world didn't want to use
* SOMAXCONN as defined in the header files... */
if (listen(s, LISTENMAXCONN) < 0) {
logerror("inet socket listen");
exit(1);
}
#else
if (listen(s, SOMAXCONN) < 0) {
logerror("inet socket listen");
exit(1);
}
#endif
while (1) {
empth_select(s, EMPTH_FD_READ);
len = sizeof(sin);