diff --git a/include/econfig-spec.h b/include/econfig-spec.h index 69fb01a9..f69838cd 100644 --- a/include/econfig-spec.h +++ b/include/econfig-spec.h @@ -28,7 +28,7 @@ * * Known contributors to this file: * Marc Olzheim, 2004 - * Markus Armbruster, 2004-2011 + * Markus Armbruster, 2004-2012 */ /* @@ -200,6 +200,8 @@ EMPCFBOTH("max_btus", max_btus, int, NSC_INT, 0, "Maximum number of BTUs a country can have") EMPCFBOTH("max_idle", max_idle, int, NSC_INT, 0, "Maximum number of minutes a player can sit idle while logged in") +EMPCFBOTH("login_grace_time", login_grace_time, int, NSC_INT, 0, + "Grace time for clients to complete login and logout (seconds)") EMPCFBOTH("players_at_00", players_at_00, int, NSC_INT, 0, "Players have their coordinate system at deity 0,0 (0 - no, 1 - yes)") EMPCFBOTH("at_least_one_100", at_least_one_100, int, NSC_INT, KM_INTERNAL, diff --git a/include/prototypes.h b/include/prototypes.h index 5dd3fbbd..ffe87a5e 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -338,6 +338,7 @@ extern struct player *player_next(struct player *); extern struct player *player_prev(struct player *); extern struct player *getplayer(natid); extern void player_accept(void *); +extern time_t player_io_deadline(struct player *, int); /* dispatch.c */ extern int dispatch(char *, char *); /* empdis.c */ diff --git a/src/lib/global/constants.c b/src/lib/global/constants.c index fafb4055..e051fd78 100644 --- a/src/lib/global/constants.c +++ b/src/lib/global/constants.c @@ -29,7 +29,7 @@ * Known contributors to this file: * Ken Stevens, 1995 * Steve McClure, 1996 - * Markus Armbruster, 2004-2011 + * Markus Armbruster, 2004-2012 */ #include @@ -65,6 +65,7 @@ char *game_days = ""; /* days game is running */ char *game_hours = ""; /* hours game is running */ char *pre_update_hook = ""; int max_idle = 15; /* session dies after max_idle minutes idle */ +int login_grace_time = 120; /* Grace time for completing login (sec) */ int sect_mob_max = 127; /* sector mobility limits */ float sect_mob_scale = 1.0; /* accumulation multiplier */ diff --git a/src/lib/player/accept.c b/src/lib/player/accept.c index 8d459182..f32548e0 100644 --- a/src/lib/player/accept.c +++ b/src/lib/player/accept.c @@ -99,7 +99,7 @@ player_delete(struct player *lp) if (lp->iop) { /* it's a real player */ - io_close(lp->iop, player->curup + minutes(max_idle)); + io_close(lp->iop, player->curup + login_grace_time); lp->iop = NULL; } back = (struct player *)lp->queue.q_back; @@ -152,6 +152,16 @@ getplayer(natid cnum) return NULL; } +time_t +player_io_deadline(struct player *pl, int write) +{ + if (pl->may_sleep < (write ? PLAYER_SLEEP_FREELY : PLAYER_SLEEP_ON_INPUT)) + return 0; + if (pl->state != PS_PLAYING) + return pl->curup + login_grace_time; + return pl->curup + minutes(max_idle); +} + /*ARGSUSED*/ void player_accept(void *unused) diff --git a/src/lib/player/login.c b/src/lib/player/login.c index ba415d8b..aa0033be 100644 --- a/src/lib/player/login.c +++ b/src/lib/player/login.c @@ -88,7 +88,7 @@ player_login(void *ud) pr_id(player, C_INIT, "Empire server ready\n"); for (;;) { - deadline = player->curup + minutes(max_idle); + deadline = player_io_deadline(player, 0); if (io_outputwaiting(player->iop)) { if (io_output(player->iop, deadline) <= 0) break; diff --git a/src/lib/player/recvclient.c b/src/lib/player/recvclient.c index f9f34534..b89bbef6 100644 --- a/src/lib/player/recvclient.c +++ b/src/lib/player/recvclient.c @@ -36,7 +36,6 @@ #include "empio.h" #include "journal.h" -#include "optlist.h" #include "player.h" #include "prototypes.h" @@ -81,20 +80,15 @@ recvclient(char *cmd, int size) * Flush all queued output before potentially sleeping in * io_input(), to make sure player sees the prompt. */ - deadline = player->curup + minutes(max_idle); - if (player->may_sleep < PLAYER_SLEEP_ON_INPUT) - deadline = 0; + deadline = player_io_deadline(player, 0); while (io_output(player->iop, deadline) > 0) ; /* - * Try to receive some input. Need to check player->may_sleep - * again; command abortion during io_output() might have - * changed it. + * Try to receive some input. Need to recompute deadline; + * command abortion during io_output() might have changed it. */ - deadline = player->curup + minutes(max_idle); - if (player->may_sleep < PLAYER_SLEEP_ON_INPUT) - deadline = 0; + deadline = player_io_deadline(player, 0); res = io_input(player->iop, deadline); if (res > 0) ; diff --git a/src/lib/subs/pr.c b/src/lib/subs/pr.c index fb46bef0..6413a5e6 100644 --- a/src/lib/subs/pr.c +++ b/src/lib/subs/pr.c @@ -58,7 +58,6 @@ #include "journal.h" #include "misc.h" #include "nat.h" -#include "optlist.h" #include "player.h" #include "proto.h" #include "prototypes.h" @@ -332,11 +331,8 @@ outid(struct player *pl, int n) static void player_output_some(void) { - time_t deadline; + time_t deadline = player_io_deadline(player, 1); - deadline = player->curup + minutes(max_idle); - if (player->may_sleep != PLAYER_SLEEP_FREELY) - deadline = 0; while (io_output_if_queue_long(player->iop, deadline) > 0) ; }