(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:
parent
ab2bea5810
commit
30f2b2c4ea
1 changed files with 50 additions and 44 deletions
|
@ -60,13 +60,61 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
struct emp_qelem Players;
|
static struct emp_qelem Players;
|
||||||
|
static int player_socket;
|
||||||
|
|
||||||
void
|
void
|
||||||
player_init(void)
|
player_init(void)
|
||||||
{
|
{
|
||||||
|
struct sockaddr_in sin;
|
||||||
|
struct servent *sp;
|
||||||
|
int s;
|
||||||
|
short port;
|
||||||
|
int val;
|
||||||
|
|
||||||
emp_initque(&Players);
|
emp_initque(&Players);
|
||||||
init_player_commands();
|
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 *
|
struct player *
|
||||||
|
@ -196,10 +244,7 @@ void
|
||||||
player_accept(void *unused)
|
player_accept(void *unused)
|
||||||
{
|
{
|
||||||
struct sockaddr_in sin;
|
struct sockaddr_in sin;
|
||||||
struct servent *sp;
|
int s = player_socket;
|
||||||
int s;
|
|
||||||
short port;
|
|
||||||
int val;
|
|
||||||
struct player *np;
|
struct player *np;
|
||||||
int len;
|
int len;
|
||||||
int ns;
|
int ns;
|
||||||
|
@ -207,45 +252,6 @@ player_accept(void *unused)
|
||||||
int stacksize;
|
int stacksize;
|
||||||
char buf[128];
|
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) {
|
while (1) {
|
||||||
empth_select(s, EMPTH_FD_READ);
|
empth_select(s, EMPTH_FD_READ);
|
||||||
len = sizeof(sin);
|
len = sizeof(sin);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue