/*
* file: modify.c Part of DIKUMUD
* Usage: Run-time modification (by users) of game variables
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information.
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
/* #include <unistd.h> */
#include <sys/types.h>
#include <signal.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include "global.h"
#include "bug.h"
#include "utils.h"
#include "interpreter.h"
#include "handler.h"
#include "db.h"
#include "comm.h"
#include "multiclass.h"
#define _MODIFY_C
#include "modify.h"
int REBOOT_HOUR = 23;
int REBOOT_MIN = 0; /* 0-N, 0-59, time of optional reboot if -e lib/reboot */
int REBOOT_FREQ = 0;
int REBOOT_LEFT = 0;
int REBOOT_LASTCHECK = 0;
struct room_data *world = NULL; /* dyn alloc'ed array of rooms */
const char *string_fields[] = {
"name",
"short",
"long",
"description",
"title",
"delete-description",
"\n"
};
const char *room_fields[] = {
"name", /* 1 */
"desc", /* 2 */
"flags", /* 3 */
"exit", /* 4 */
"xdesc", /* 5 */
"extra", /* 6 */
"rivr", /* 7 */
"tele", /* 8 */
"\n"
};
/* maximum length for text field x+1 */
int length[] = {
15,
60,
256,
240,
60
};
int room_length[] = {
80,
1024,
50,
50,
512,
512,
50,
100
};
const char *skill_fields[] = {
"learned",
"affected",
"duration",
"recognize",
"\n"
};
int max_value[] = {
255,
255,
10000,
1
};
/*
* modification of malloc'ed strings
*/
/* Add user input to the 'current' string (as defined by d->str) */
void string_add(struct descriptor_data *d, char *str)
{
char *scan = NULL;
int terminator = 0;
if (DEBUG > 2)
log_info("called %s with %08zx, %s", __PRETTY_FUNCTION__, (size_t) d, VNULL(str));
/*
* determine if this is the terminal string, and truncate if so
*/
for (scan = str; *scan; scan++)
if ((terminator = (*scan == '@'))) {
*scan = '\0';
break;
}
if (!(*d->str)) {
if (strlen(str) > d->max_str) {
cprintf(d->character, "String too long - Truncated.\r\n");
*(str + d->max_str) = '\0';
terminator = 1;
}
CREATE(*d->str, char, strlen (str) + 3);
strcpy(*d->str, str);
} else {
if (strlen(str) + strlen(*d->str) > d->max_str) {
cprintf(d->character, "String too long. Last line skipped.\r\n");
terminator = 1;
} else {
RECREATE(*d->str, char, strlen (*d->str) + strlen(str) + 3);
strcat(*d->str, str);
}
}
if (terminator) {
d->str = 0;
if (d->connected == CON_EDIT_DESCRIPTION) {
SEND_TO_Q(login_menu, d);
d->connected = CON_MENU_SELECT;
}
} else
strcat(*d->str, "\r\n");
}
/* interpret an argument for do_string */
void quad_arg(const char *arg, int *type, char *name, int *field, char *string)
{
char buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
if (DEBUG > 2)
log_info("called %s with %s, %08zx, %s, %08zx, %s", __PRETTY_FUNCTION__, VNULL(arg),
(size_t) type, VNULL(name), (size_t) field, VNULL(string));
/*
* determine type
*/
arg = one_argument(arg, buf);
if (is_abbrev(buf, "char"))
*type = TP_MOB;
else if (is_abbrev(buf, "obj"))
*type = TP_OBJ;
else {
*type = TP_ERROR;
return;
}
/*
* find name
*/
arg = one_argument(arg, name);
/*
* field name and number
*/
arg = one_argument(arg, buf);
if (!(*field = old_search_block(buf, 0, strlen(buf), string_fields, 0)))
return;
/*
* string
*/
for (; isspace(*arg); arg++);
for (; (*string = *arg); arg++, string++);
return;
}
/* modification of malloc'ed strings in chars/objects */
void do_string(struct char_data *ch, const char *arg, int cmd)
{
char name[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
char string[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
struct extra_descr_data *ed = NULL;
struct extra_descr_data *tmp = NULL;
int field = 0;
int type = 0;
struct char_data *mob = NULL;
struct obj_data *obj = NULL;
if (DEBUG > 2)
log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(arg),
cmd);
if (IS_NPC(ch))
return;
quad_arg(arg, &type, name, &field, string);
if (type == TP_ERROR) {
cprintf(ch, "Syntax:\r\nstring (char) <name> <field> [<string>].");
return;
}
if (!field) {
cprintf(ch, "No field by that name. Try 'help string'.\r\n");
return;
}
if (type == TP_MOB) {
/*
* locate the beast
*/
if (!(mob = get_char_vis(ch, name))) {
cprintf(ch, "I don't know anyone by that name...\r\n");
return;
}
switch (field) {
case 1:
if (!IS_NPC(mob) && GetMaxLevel(ch) < IMPLEMENTOR) {
cprintf(ch, "You can't change that field for players.");
return;
}
if (!*string) {
cprintf(ch, "You have to supply a name!\r\n");
return;
}
ch->desc->str = &mob->player.name;
if (!IS_NPC(mob))
cprintf(ch, "WARNING: You have changed the name of a player.\r\n");
break;
case 2:
if (!IS_NPC(mob)) {
cprintf(ch, "That field is for monsters only.\r\n");
return;
}
ch->desc->str = &mob->player.short_descr;
break;
case 3:
if (!IS_NPC(mob)) {
cprintf(ch, "That field is for monsters only.\r\n");
return;
}
ch->desc->str = &mob->player.long_descr;
break;
case 4:
ch->desc->str = &mob->player.description;
break;
case 5:
if (IS_NPC(mob)) {
cprintf(ch, "Monsters have no titles.\r\n");
return;
}
if ((GetMaxLevel(ch) > GetMaxLevel(mob)) && (ch != mob))
ch->desc->str = &mob->player.title;
else {
cprintf(ch, "Sorry, can't set the title of someone of highter level.\r\n");
return;
}
break;
default:
cprintf(ch, "That field is undefined for monsters.\r\n");
return;
break;
}
} else {
cprintf(ch, "Stringing of objects is no longer allowed for now.\r\n");
return;
/*
* type == TP_OBJ
*/
/*
* locate the object
*/
if (!(obj = get_obj_vis(ch, name))) {
cprintf(ch, "Can't find such a thing here..\r\n");
return;
}
switch (field) {
case 1:
if (!*string) {
cprintf(ch, "You have to supply a keyword.\r\n");
return;
} else {
ch->desc->str = &obj->name;
break;
}
break;
case 2:
ch->desc->str = &obj->short_description;
break;
case 3:
ch->desc->str = &obj->description;
break;
case 4:
if (!*string) {
cprintf(ch, "You have to supply a keyword.\r\n");
return;
}
/*
* try to locate extra description
*/
for (ed = obj->ex_description;; ed = ed->next)
if (!ed) {
CREATE(ed, struct extra_descr_data, 1);
ed->next = obj->ex_description;
obj->ex_description = ed;
CREATE(ed->keyword, char, strlen (string) + 1);
strcpy(ed->keyword, string);
ed->description = 0;
ch->desc->str = &ed->description;
cprintf(ch, "New field.\r\n");
break;
} else if (!str_cmp(ed->keyword, string)) { /* the field exists */
DESTROY(ed->description);
ed->description = 0;
ch->desc->str = &ed->description;
cprintf(ch, "Modifying description.\r\n");
break;
}
ch->desc->max_str = MAX_STRING_LENGTH;
return; /* the stndrd (see below) procedure does not apply here */
break;
case 6: /* deletion */
if (!*string) {
cprintf(ch, "You must supply a field name.\r\n");
return;
}
/*
* try to locate field
*/
for (ed = obj->ex_description;; ed = ed->next)
if (!ed) {
cprintf(ch, "No field with that keyword.\r\n");
return;
} else if (!str_cmp(ed->keyword, string)) {
DESTROY(ed->keyword);
if (ed->description)
DESTROY(ed->description);
/*
* delete the entry in the desr list
*/
if (ed == obj->ex_description)
obj->ex_description = ed->next;
else {
for (tmp = obj->ex_description; tmp->next != ed; tmp = tmp->next);
tmp->next = ed->next;
}
DESTROY(ed);
cprintf(ch, "Field deleted.\r\n");
return;
}
break;
default:
cprintf(ch, "That field is undefined for objects.\r\n");
return;
break;
}
}
if (*ch->desc->str) {
DESTROY(*ch->desc->str);
}
if (*string) { /* there was a string in the argument array */
if (strlen(string) > length[field - 1]) {
cprintf(ch, "String too long - truncated.\r\n");
*(string + length[field - 1]) = '\0';
}
CREATE(*ch->desc->str, char, strlen (string) + 1);
strcpy(*ch->desc->str, string);
ch->desc->str = 0;
cprintf(ch, "Ok.\r\n");
} else { /* there was no string. enter string mode */
cprintf(ch, "Enter string. terminate with '@'.\r\n");
*ch->desc->str = 0;
ch->desc->max_str = length[field - 1];
}
}
void bisect_arg(const char *arg, int *field, char *string)
{
char buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
if (DEBUG > 2)
log_info("called %s with %s, %08zx, %s", __PRETTY_FUNCTION__, VNULL(arg),
(size_t) field, VNULL(string));
/*
* field name and number
*/
arg = one_argument(arg, buf);
if (!(*field = old_search_block(buf, 0, strlen(buf), room_fields, 0)))
return;
/*
* string
*/
for (; isspace(*arg); arg++);
for (; (*string = *arg); arg++, string++);
return;
}
/*
* Modification of character skills
*/
void do_setskill(struct char_data *ch, const char *arg, int cmd)
{
struct char_data *vict = NULL;
char name[100] = "\0\0\0\0\0\0\0";
char num[100] = "\0\0\0\0\0\0\0";
char buf[100] = "\0\0\0\0\0\0\0";
char helpstr[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
int skill = 0;
int field = 0;
int value = 0;
int i = 0;
static const char *skills[] = {
"search", "frighten", "telepath", "detect-evil",
"sense-life", "cure", "bless", "remove",
"poison", "blind", "neutralize", "purify",
"hide", "cover", "backstab", "detect-invisible",
"detect-magic", "enchant", "teleport", "create",
"sanctuary", "resist", "drain", "turn",
"protect", "light", "charm", "floating",
"lightning-bolt", "sleep", "wake", "paralysis",
"recharge", "shield", "fireball", "knock",
"ventricolism", "double", "invisible", "death-ray",
"bash", "dodge", "kick", "uppercut",
"defend", "dirk", "listen", "missile", "detect", "\n"
};
if (DEBUG)
log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(arg),
cmd);
cprintf(ch, "This routine is disabled untill it fitts\r\n");
cprintf(ch, "The new structures (sorry Quinn) ....Bombman\r\n");
return;
arg = one_argument(arg, name);
if (!*name) { /* no arguments. print an informative text */
cprintf(ch, "Syntax:\r\nsetskill <name> <skill> <field> <value>\r\n");
strcpy(helpstr, "Skill being one of the following:\r\n\r\n");
for (i = 1; *skills[i] != '\n'; i++) {
sprintf(helpstr + strlen(helpstr), "%18s", skills[i]);
if (!(i % 4)) {
strcat(helpstr, "\r\n");
cprintf(ch, "%s", helpstr);
*helpstr = '\0';
}
}
if (*helpstr)
cprintf(ch, "%s", helpstr);
return;
}
if (!(vict = get_char_vis(ch, name))) {
cprintf(ch, "No living thing by that name.\r\n");
return;
}
arg = one_argument(arg, buf);
if (!*buf) {
cprintf(ch, "Skill name expected.\r\n");
return;
}
if ((skill = old_search_block(buf, 0, strlen(buf), skills, 1)) < 0) {
cprintf(ch, "No such skill is known. Try 'setskill' for list.\r\n");
return;
}
argument_interpreter(arg, buf, num);
if (!*num || !*buf) {
cprintf(ch, "Field name or value undefined.\r\n");
return;
}
if ((field = old_search_block(buf, 0, strlen(buf), skill_fields, 0)) < 0) {
cprintf(ch, "Unrecognized field.\r\n");
return;
}
value = atoi(num);
if (field == 3) {
if (value < -1) {
cprintf(ch, "Minimum value for that is -1.\r\n");
return;
}
} else if (value < 0) {
cprintf(ch, "Minimum value for that is 0.\r\n");
return;
}
if (value > max_value[field - 1]) {
cprintf(ch, "Max value for that is %d.\r\n", max_value[field - 1]);
return;
}
switch (field) {
case 1:
vict->skills[skill].learned = value;
break;
/*
* case 2: vict->skills[skill].affected_by = value; break;
*/
/*
* case 3: vict->skills[skill].duration = value; break;
*/
case 4:
vict->skills[skill].recognise = value;
break;
}
cprintf(ch, "Ok.\r\n");
}
/* db stuff *********************************************** */
/* One_Word is like one_argument, execpt that words in quotes "" are */
/* regarded as ONE word */
char *one_word(char *argument, char *first_arg)
{
int begin = 0;
int look_at = 0;
if (DEBUG > 2)
log_info("called %s with %s, %s", __PRETTY_FUNCTION__, VNULL(argument),
VNULL(first_arg));
do {
for (; isspace(*(argument + begin)); begin++);
if (*(argument + begin) == '\"') { /* is it a quote */
begin++;
for (look_at = 0; (*(argument + begin + look_at) >= ' ') &&
(*(argument + begin + look_at) != '\"'); look_at++)
*(first_arg + look_at) = LOWER(*(argument + begin + look_at));
if (*(argument + begin + look_at) == '\"')
begin++;
} else {
for (look_at = 0; *(argument + begin + look_at) > ' '; look_at++)
*(first_arg + look_at) = LOWER(*(argument + begin + look_at));
}
*(first_arg + look_at) = '\0';
begin += look_at;
}
while (fill_word(first_arg));
return (argument + begin);
}
struct help_index_element *build_help_index(FILE * fl, int *num)
{
int nr = -1;
int issorted = 0;
int i = 0;
struct help_index_element *list = NULL;
struct help_index_element mem;
char buf[81] = "\0\0\0\0\0\0\0";
char tmp[81] = "\0\0\0\0\0\0\0";
char *scan = NULL;
long pos = 0L;
if (DEBUG > 2)
log_info("called %s with %08zx, %08zx", __PRETTY_FUNCTION__, (size_t) fl, (size_t) num);
for (;;) {
pos = ftell(fl);
fgets(buf, 81, fl);
*(buf + strlen(buf) - 1) = '\0';
scan = buf;
for (;;) {
/*
* extract the keywords
*/
scan = one_word(scan, tmp);
if (!*tmp)
break;
if (!list) {
CREATE(list, struct help_index_element, 1);
nr = 0;
} else
RECREATE(list, struct help_index_element, ++nr + 1);
list[nr].pos = pos;
CREATE(list[nr].keyword, char, strlen (tmp) + 1);
strcpy(list[nr].keyword, tmp);
}
/*
* skip the text
*/
do
fgets(buf, 81, fl);
while (*buf != '#');
if (*(buf + 1) == '~')
break;
}
/*
* we might as well sort the stuff
*/
do {
issorted = 1;
for (i = 0; i < nr; i++)
if (str_cmp(list[i].keyword, list[i + 1].keyword) > 0) {
mem = list[i];
list[i] = list[i + 1];
list[i + 1] = mem;
issorted = 0;
}
}
while (!issorted);
*num = nr;
return (list);
}
void page_printf(struct char_data *ch, const char *Str, ...)
{
va_list arg;
char Result[MAX_STRING_LENGTH];
if (Str && *Str && ch && ch->desc) {
bzero(Result, MAX_STRING_LENGTH);
va_start(arg, Str);
vsprintf(Result, Str, arg);
va_end(arg);
page_string(ch->desc, Result, 1);
}
}
void page_string(struct descriptor_data *d, char *str, int keep_internal)
{
char buffer[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
struct pager_data *p = NULL;
char *nl = NULL;
char *sp = NULL;
if (DEBUG > 2)
log_info("called %s with %08zx, %s, %d", __PRETTY_FUNCTION__, (size_t) d, VNULL(str),
keep_internal);
/*
* log_info("called %s with %08zx, %s", __PRETTY_FUNCTION__, (size_t)d, VNULL(str));
*/
if (!d)
return;
for (sp = str; (nl = strpbrk(sp, "\n")); sp = nl + 1) {
if (!nl)
break;
if (nl - sp < 1) {
/*
* This means we are ON a "\n", blank line!
*/
if (!d->page_last || d->page_last->complete_line == TRUE) {
CREATE(p, struct pager_data, 1);
p->str = strdup("");
p->complete_line = TRUE;
LINK(p, d->page_first, d->page_last, next, prev);
} else {
d->page_last->complete_line = TRUE;
}
continue;
}
*buffer = '\0';
/*
* We know we have a complete line, but we may be adding onto an incomplete line from earlier.
*/
if (d->page_last && d->page_last->complete_line == FALSE)
strcpy(buffer, d->page_last->str);
if (*(nl - 1) == '\r') {
/*
* We had a "\r\n" sequence, don't keep the "\r".
*/
strncat(buffer, sp, nl - sp - 1);
buffer[nl - sp - 1] = '\0';
} else if (*sp == '\r') {
/*
* We had a "\n\r" diku-sequence, don't keep the "\r".
*/
strncat(buffer, sp + 1, nl - sp - 1);
buffer[nl - sp - 1] = '\0';
} else {
strncat(buffer, sp, nl - sp);
buffer[nl - sp] = '\0';
}
if (d->page_last && d->page_last->complete_line == FALSE) {
DESTROY(d->page_last->str);
d->page_last->str = strdup(buffer);
d->page_last->complete_line = TRUE;
} else {
CREATE(p, struct pager_data, 1);
p->str = strdup(buffer);
p->complete_line = TRUE;
LINK(p, d->page_first, d->page_last, next, prev);
}
*buffer = '\0';
}
if (*sp == '\r')
sp++;
if (*sp) {
int l = 0;
strcpy(buffer, sp);
l = strlen(buffer);
if (l > 0 && buffer[l - 1] == '\r')
buffer[l - 1] = '\0';
CREATE(p, struct pager_data, 1);
p->str = strdup(buffer);
p->complete_line = FALSE;
LINK(p, d->page_first, d->page_last, next, prev);
*buffer = '\0';
}
}
void show_page(struct descriptor_data *d)
{
char buffer[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
struct pager_data *p = NULL;
int i = 0;
int page_size = 23;
int use_pager =
IS_SET(d->character->specials.act, PLR_PAGER);
if (DEBUG > 2)
log_info("called %s with %08zx", __PRETTY_FUNCTION__, (size_t) d);
switch (d->page_control) {
default:
break;
case ' ':
case 'n': /* next */
case 'N':
case 'f': /* forward */
case 'F':
for (i = 0, p = d->page_first; p && (i < page_size || !use_pager);
i++, p = d->page_first) {
UNLINK(p, d->page_first, d->page_last, next, prev);
strcpy(buffer, p->str);
if (p->complete_line)
strcat(buffer, "\r\n");
SEND_TO_Q(buffer, d);
DESTROY(p->str);
DESTROY(p);
}
d->page_control = d->page_first ? '\0' : ' ';
break;
case 'q': /* quit */
case 'Q':
for (p = d->page_first; p; p = d->page_first) {
UNLINK(p, d->page_first, d->page_last, next, prev);
DESTROY(p->str);
DESTROY(p);
}
d->page_control = ' ';
break;
}
}
void control_page(struct descriptor_data *d, char *input)
{
char buffer[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
if (DEBUG > 2)
log_info("called %s with %08zx, %s", __PRETTY_FUNCTION__, (size_t) d, VNULL(input));
if (input) {
one_argument(input, buffer);
if (*buffer) {
d->page_control = *buffer;
} else {
d->page_control = ' ';
}
}
}
#if 0
void page_string(struct descriptor_data *d, char *str, int keep_internal)
{
static char Empty[1] = "";
if (DEBUG > 2)
log_info("called %s with %08zx, %s, %d", __PRETTY_FUNCTION__, (size_t) d, VNULL(str),
keep_internal);
if (!d)
return;
if (keep_internal) {
CREATE(d->showstr_head, char, strlen (str) + 1);
strcpy(d->showstr_head, str);
d->showstr_point = d->showstr_head;
} else
d->showstr_point = str;
show_string(d, Empty);
}
void show_string(struct descriptor_data *d, char *input)
{
char buffer[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
char buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
char *scan = NULL;
char *chk = NULL;
int lines = 0;
if (DEBUG > 2)
log_info("called %s with %08zx, %s", __PRETTY_FUNCTION__, (size_t) d, VNULL(input));
one_argument(input, buf);
if (*buf) {
if (d->showstr_head) {
DESTROY(d->showstr_head);
d->showstr_head = 0;
}
d->showstr_point = 0;
return;
}
/*
* show a chunk
*/
for (scan = buffer;; scan++, d->showstr_point++) {
*scan = *d->showstr_point;
if (*scan == '\r')
continue;
if (*scan == '\n')
lines++;
else if (!*scan || ((lines >= 22) && IS_SET(d->character->specials.act, PLR_PAGER))) {
*scan = '\0';
SEND_TO_Q(buffer, d);
/*
* see if this is the end (or near the end) of the string
*/
for (chk = d->showstr_point; isspace(*chk); chk++);
if (!*chk) {
if (d->showstr_head) {
DESTROY(d->showstr_head);
d->showstr_head = 0;
}
d->showstr_point = 0;
}
return;
}
}
}
#endif
void check_reboot(void)
{
time_t tc;
struct tm *t_info = NULL;
char *tmstr = NULL;
if (DEBUG > 2)
log_info("called %s with no arguments", __PRETTY_FUNCTION__);
tc = time(0);
//log_info("REBOOT_FREQ: %d\nREBOOT_LEFT: %d", REBOOT_FREQ, REBOOT_LEFT);
if (REBOOT_FREQ > 0) {
REBOOT_LEFT -= (tc - REBOOT_LASTCHECK);
REBOOT_LASTCHECK = tc;
if (REBOOT_LEFT <= 0) {
t_info = localtime(&tc);
tmstr = asctime(t_info);
*(tmstr + strlen(tmstr) - 1) = '\0';
allprintf("\x007\r\nBroadcast message from Quixadhal (tty0) %s...\r\n\r\n", tmstr);
allprintf("Automatic reboot. Come back in a few minutes!\r\n");
allprintf("\x007The system is going down NOW !!\r\n\x007\r\n");
diku_shutdown = diku_reboot = 1;
} else if (REBOOT_LEFT <= 60 * 60) {
if (((REBOOT_LEFT/60) < 10) && ((REBOOT_LEFT % 60) == 0)) {
WizLock = 1;
allprintf("\x007\r\nBroadcast message from Quixadhal (tty0) %s...\r\n\r\n", tmstr);
allprintf("Automatic reboot. Game is now Whizz-Locked!\r\n");
allprintf("\x007The system is going DOWN in %d minutes !!\r\n\x007\r\n", (REBOOT_LEFT/60));
} else if (((REBOOT_LEFT/60) <= 30) && ((REBOOT_LEFT % 300) == 0)) {
allprintf("\x007\r\nBroadcast message from Quixadhal (tty0) %s...\r\n\r\n", tmstr);
allprintf("Automatic reboot. Game is now Whizz-Locked!\r\n");
allprintf("\x007The system is going DOWN in %d minutes !!\r\n\x007\r\n", (REBOOT_LEFT/60));
} else if (((REBOOT_LEFT/60) <= 60) && ((REBOOT_LEFT % 600) == 0)) {
allprintf("\x007\r\nBroadcast message from Quixadhal (tty0) %s...\r\n\r\n", tmstr);
allprintf("Automatic reboot. Game is now Whizz-Locked!\r\n");
allprintf("\x007The system is going DOWN in %d minutes !!\r\n\x007\r\n", (REBOOT_LEFT/60));
}
}
}
}
#if 0
void check_reboot(void)
{
time_t tc;
struct tm *t_info = NULL;
char dummy = '\0';
FILE *boot = NULL;
char buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
char *tmstr = NULL;
if (DEBUG > 2)
log_info("called %s with no arguments", __PRETTY_FUNCTION__);
tc = time(0);
t_info = localtime(&tc);
tmstr = asctime(t_info);
*(tmstr + strlen(tmstr) - 1) = '\0';
if ((((t_info->tm_hour + 1) == REBOOT_AT1) ||
((t_info->tm_hour + 1) == REBOOT_AT2)) && (t_info->tm_min > 30))
if ((boot = fopen(REBOOT_FILE, "r"))) {
if (t_info->tm_min > 55) {
log_info("**** Reboot exists ****");
fread(&dummy, sizeof(dummy), 1, boot);
if (!feof(boot)) { /* the file is nonepty */
log_info("Reboot is nonempty.");
if (system(REBOOT_FILE)) {
log_info("Reboot script terminated abnormally");
allprintf("The reboot was cancelled.\r\n");
sprintf(buf, "mv %s %s.FAILED", REBOOT_FILE, REBOOT_FILE);
system(buf);
FCLOSE(boot);
return;
} else {
sprintf(buf, "mv %s %s.OK", REBOOT_FILE, REBOOT_FILE);
system(buf);
}
}
sprintf(buf, "touch %s", REBOOT_FILE);
system(buf);
allprintf("\x007\r\nBroadcast message from Quixadhal (tty0) %s...\r\n\r\n",
tmstr);
allprintf("Automatic reboot. Come back in a few minutes!\r\n");
allprintf("\x007The system is going down NOW !!\r\n\x007\r\n");
diku_shutdown = diku_reboot = 1;
} else if (t_info->tm_min > 40) {
allprintf("\x007\r\nBroadcast message from Quixadhal (tty0) %s...\r\n\r\n",
tmstr);
allprintf("Automatic reboot. Game is now Whizz-Locked!\r\n");
allprintf("\x007The system is going DOWN in %d minutes !!\r\n\x007\r\n",
55 - t_info->tm_min);
WizLock = 1;
}
FCLOSE(boot);
}
}
#endif