/****************************************************************************
* [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame | \\._.// *
* -----------------------------------------------------------| (0...0) *
* SMAUG 1.4 (C) 1994, 1995, 1996, 1998 by Derek Snider | ).:.( *
* -----------------------------------------------------------| {o o} *
* SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus, | / ' ' \ *
* Scryn, Rennard, Swordbearer, Gorog, Grishnakh, Nivek, |~'~.VxvxV.~'~*
* Tricops and Fireblade | *
* ------------------------------------------------------------------------ *
* Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* ------------------------------------------------------------------------ *
* Pfile autocleanup code *
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include "mud.h"
/* Globals */
time_t pfile_time;
HOUR_MIN_SEC set_pfile_time_struct;
HOUR_MIN_SEC *set_pfile_time;
struct tm *new_pfile_time;
struct tm new_pfile_struct;
time_t new_pfile_time_t;
void init_pfile_scan_time(void)
{
/*
* Init pfile scan time.
*/
set_pfile_time = &set_pfile_time_struct;
new_pfile_time = update_time(localtime(¤t_time));
/* Copies *new_pfile_time to new_pfile_struct, and then points
new_pfile_time to new_pfile_struct again. -- Alty */
new_pfile_struct = *new_pfile_time;
new_pfile_time = &new_pfile_struct;
new_pfile_time->tm_mday += 1;
if (new_pfile_time->tm_hour > 12)
new_pfile_time->tm_mday += 1;
new_pfile_time->tm_sec = 0;
new_pfile_time->tm_min = 0;
new_pfile_time->tm_hour = 3;
/* Update new_pfile_time (due to day increment) */
new_pfile_time = update_time(new_pfile_time);
new_pfile_struct = *new_pfile_time;
new_pfile_time = &new_pfile_struct;
/* Bug fix submitted by Gabe Yoder */
new_pfile_time_t = mktime(new_pfile_time);
/* check_pfiles(mktime(new_pfile_time)); */
return;
}
time_t now_time;
int deleted = 0;
int days = 0;
#if defined(KEY)
#undef KEY
#endif
#define KEY( literal, field, value ) \
if ( !strcmp( word, literal ) ) \
{ \
field = value; \
fMatch = TRUE; \
break; \
}
void fread_pfile(FILE * fp, time_t tdiff, char *fname)
{
char *word;
char *name = NULL;
int level = 0;
int file_ver = 0;
bool fMatch;
for (;;)
{
word = feof(fp) ? "End" : fread_word(fp);
fMatch = FALSE;
switch (UPPER(word[0]))
{
case '*':
fMatch = TRUE;
fread_to_eol(fp);
break;
case 'E':
if (!strcmp(word, "End"))
goto timecheck;
break;
case 'L':
KEY("Level", level, fread_number(fp));
break;
case 'N':
KEY("Name", name, fread_string(fp));
break;
case 'V':
KEY("Version", file_ver, fread_number(fp));
break;
}
if (!fMatch)
fread_to_eol(fp);
}
timecheck:
if (tdiff > sysdata.newbie_purge)
{
if (level < LEVEL_IMMORTAL)
{
if (unlink(fname) == -1)
perror("Unlink");
else
{
days = sysdata.newbie_purge;
sprintf(log_buf, "Player %s was deleted. Exceeded time limit of %d days.", name, days);
log_string(log_buf);
#ifdef AUTO_AUTH
remove_from_auth(name);
#endif
++deleted;
return;
}
}
}
}
void read_pfile(char *dirname, char *filename)
{
FILE *fp;
char fname[MSL];
struct stat fst;
time_t tdiff;
now_time = time(0);
sprintf(fname, "%s/%s", dirname, filename);
if (stat(fname, &fst) != -1)
{
tdiff = (now_time - fst.st_mtime) / 86400;
if ((fp = fopen(fname, "r")) != NULL)
{
for (;;)
{
char letter;
char *word;
letter = fread_letter(fp);
if (letter != '#')
continue;
word = fread_word(fp);
if (!str_cmp(word, "End"))
break;
if (!str_cmp(word, "PLAYER"))
fread_pfile(fp, tdiff, fname);
else if (!str_cmp(word, "END")) /* Done */
break;
}
FCLOSE(fp);
}
}
return;
}
void pfile_scan(void)
{
DIR *dp;
struct dirent *dentry;
char dir_name[100];
int alpha_loop;
int cou = 0;
#ifdef RENTCODE
extern int num_pfiles;
#endif
now_time = time(0);
nice(20);
for (alpha_loop = 0; alpha_loop <= 25; alpha_loop++)
{
sprintf(dir_name, "%s%c", PLAYER_DIR, 'a' + alpha_loop);
dp = opendir(dir_name);
dentry = readdir(dp);
while (dentry)
{
if (dentry->d_name[0] != '.')
{
read_pfile(dir_name, dentry->d_name);
cou++;
}
dentry = readdir(dp);
}
closedir(dp);
}
log_string("Pfile cleanup completed.");
sprintf(log_buf, "Total pfiles scanned: %d", cou);
log_string(log_buf);
sprintf(log_buf, "Total pfiles deleted: %d", deleted);
log_string(log_buf);
sprintf(log_buf, "Total pfiles remaining: %d", cou - deleted);
#ifdef RENTCODE
num_pfiles = cou - deleted;
#endif
log_string(log_buf);
return;
}
void do_pfiles(CHAR_DATA * ch, char *argument)
{
char buf[MSL];
if (IS_NPC(ch))
{
send_to_char("Mobs cannot use this command!\n\r", ch);
return;
}
/* Makes a backup copy of existing pfiles just in case - Samson */
strcpy(buf, "tar -cf ");
strcat(buf, PLAYER_DIR);
strcat(buf, "pfiles.tar ");
strcat(buf, PLAYER_DIR);
strcat(buf, "*/*");
/* GAH, the shell pipe won't process the command that gets pieced
together in the preceeding lines! God only knows why. - Samson */
system(buf);
sprintf(log_buf, "Manual pfile cleanup started by %s.", ch->name);
log_string(log_buf);
pfile_scan();
return;
}
void save_sysdata args((SYSTEM_DATA sys));
void check_pfiles(time_t reset)
{
if (new_pfile_time_t <= current_time)
{
if (sysdata.CLEANPFILES == TRUE)
{
char buf[MSL];
/* Makes a backup copy of existing pfiles just in case - Samson */
strcpy(buf, "tar -cf ");
strcat(buf, PLAYER_DIR);
strcat(buf, "pfiles.tar ");
strcat(buf, PLAYER_DIR);
strcat(buf, "*/*");
/* Would use the shell pipe for this, but alas, it requires a ch in order
to work, and I can't figure a way to get around that. Not that it
matters anyway, the shell pipe didn't like the command for some
reason that's WAY over my head. - Samson */
system(buf);
new_pfile_time_t = current_time + 86400;
sysdata.purgetime = new_pfile_time_t;
save_sysdata(sysdata);
log_string("Automated pfile cleanup beginning....");
pfile_scan();
}
else
{
new_pfile_time_t = current_time + 86400;
sysdata.purgetime = new_pfile_time_t;
save_sysdata(sysdata);
}
}
return;
}