Merge pre-4-2-20-invasive. Summary of changes:
* Acquire resources before daemonizing, fail in foreground * Initialize threads and signals after daemonizing * Make most file names relative to data directory * emp_server and files make it their working directory * emp_config() no longer screws up some file names * Missing or incorrect econfig is now fatal * Don't log to default log file when econfig changes it
This commit is contained in:
commit
5b57f4c222
17 changed files with 201 additions and 267 deletions
|
@ -63,13 +63,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 *
|
||||
|
@ -199,10 +247,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;
|
||||
|
@ -210,45 +255,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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue