RET_SYS was used for commands failing due to internal or environmental errors, but not really systematically. The difference to RET_FAIL is how dispatch() treats them: RET_SYS got logged, and cost no BTUs. More specific logging is possible at the point of failure than in dispatch(). Make sure that's done for all failures that used to return RET_SYS. The change in BTU charging affects commands consider, offer, repay, trade failing due to internal errors. It also affects deity commands reload and turn (irrelevant because deities get unlimited BTUs), and commands apropos, info and motd (irrelevant because they cost no BTUs).
127 lines
3.6 KiB
C
127 lines
3.6 KiB
C
/*
|
|
* Empire - A multi-player, client/server Internet based war game.
|
|
* Copyright (C) 1986-2008, Dave Pare, Jeff Bailey, Thomas Ruschak,
|
|
* Ken Stevens, Steve McClure
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
* ---
|
|
*
|
|
* See files README, COPYING and CREDITS in the root of the source
|
|
* tree for related information and legal notices. It is expected
|
|
* that future projects/authors will amend these files as needed.
|
|
*
|
|
* ---
|
|
*
|
|
* turn.c: Turn the game on, off, or set the login message.
|
|
*
|
|
* Known contributors to this file:
|
|
* Marc Olzheim, 2004
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
#include <errno.h>
|
|
#include <unistd.h>
|
|
#include "tel.h"
|
|
#include "commands.h"
|
|
#include "optlist.h"
|
|
|
|
/*
|
|
* Enable / disable logins and set the message of the day.
|
|
*/
|
|
int
|
|
turn(void)
|
|
{
|
|
FILE *fptr;
|
|
struct telstr tgm;
|
|
char *p;
|
|
char buf[1024];
|
|
char msgbuf[MAXTELSIZE + 1]; /* UTF-8 */
|
|
char *msgfilepath;
|
|
|
|
p = getstarg(player->argp[1], "on, off or motd? ", buf);
|
|
if (!p)
|
|
return RET_SYN;
|
|
if (strcmp(p, "off") == 0) {
|
|
msgfilepath = downfil;
|
|
} else if (strcmp(p, "on") == 0) {
|
|
pr("Removing no-login message and re-enabling logins.\n");
|
|
if ((unlink(downfil) == -1) && (errno != ENOENT)) {
|
|
pr("Could not remove no-login file, logins still disabled.\n");
|
|
logerror("Could not remove no-login file (%s).\n", downfil);
|
|
return RET_FAIL;
|
|
}
|
|
return RET_OK;
|
|
} else {
|
|
msgfilepath = motdfil;
|
|
}
|
|
|
|
if (msgfilepath == downfil)
|
|
pr("Enter a message shown to countries trying to log in.\n");
|
|
else
|
|
pr("Enter a new message of the day.\n");
|
|
|
|
time(&tgm.tel_date);
|
|
tgm.tel_length = getele("The World", msgbuf);
|
|
|
|
if (tgm.tel_length < 0) {
|
|
pr("Ignored\n");
|
|
if (msgfilepath == downfil)
|
|
pr("NOT disabling logins.\n");
|
|
return RET_SYN;
|
|
} else if (tgm.tel_length == 0) {
|
|
if (msgfilepath == motdfil) {
|
|
pr("Removing exsting motd.\n");
|
|
if ((unlink(msgfilepath) == -1) && (errno != ENOENT)) {
|
|
pr("Could not remove motd.\n");
|
|
logerror("Could not remove motd file (%s).\n",
|
|
msgfilepath);
|
|
return RET_FAIL;
|
|
}
|
|
return RET_OK;
|
|
} else
|
|
pr("Writing empty no-login message.\n");
|
|
}
|
|
|
|
fptr = fopen(msgfilepath, "wb");
|
|
if (fptr == NULL) {
|
|
pr("Something went wrong opening the message file.\n");
|
|
logerror("Could not open message file (%s).\n", msgfilepath);
|
|
return RET_FAIL;
|
|
}
|
|
|
|
if (msgfilepath == downfil)
|
|
pr("Logins disabled.\n");
|
|
|
|
if ((fwrite(&tgm, sizeof(tgm), 1, fptr) != 1) ||
|
|
(fwrite(msgbuf, tgm.tel_length, 1, fptr) != 1)) {
|
|
fclose(fptr);
|
|
pr("Something went wrong writing the message file.\n");
|
|
logerror("Could not properly write message file (%s).\n",
|
|
msgfilepath);
|
|
return RET_FAIL;
|
|
}
|
|
if (fclose(fptr)) {
|
|
pr("Something went wrong closing the message.\n");
|
|
logerror("Could not properly close message file (%s).\n",
|
|
msgfilepath);
|
|
return RET_FAIL;
|
|
}
|
|
|
|
pr("\n");
|
|
|
|
return RET_OK;
|
|
}
|