/*
Calisto (c) 1998-2000 Peter Howkins, Matthew Howkins, Simon Howkins
$Id: playerdb.c,v 1.5 2000/01/10 22:23:01 peter Exp $
$Log: playerdb.c,v $
Revision 1.5 2000/01/10 22:23:01 peter
Now uses STRNCOPY and STRNAPPEND
Revision 1.4 2000/01/02 16:08:21 peter
Changed prototypes, and return values of load and save player
Added improved error handling to save
Revision 1.3 1999/12/29 20:25:33 peter
Changed PLAYERPATH to literal "lib/players/". Removed #include "cfg.h"
Revision 1.2 1999/12/18 17:21:09 peter
changed config.h to cfg.h
Revision 1.1 1999/11/29 22:04:40 peter
Initial revision
*/
static char rcsid[] = "$Id: playerdb.c,v 1.5 2000/01/10 22:23:01 peter Exp $";
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "config.h"
#include "globals.h"
#include "library.h"
#include "strplus.h"
#include "structs.h"
#define CURRENT_VERSION 1
int load_player(character *c, const char *name)
{
int version;
FILE *fd;
char path[256];
char n[MAX_NAME_LENGTH+1];
STRNCOPY(n, name, sizeof(n));
strlower(n);
STRNCOPY(path, "lib/players/", sizeof(path));
STRNAPPEND(path, n, sizeof(path));
fd = fopen(path, "r");
if (fd == NULL) {
/* error has occurred do something */
log(debug, "Error occured loading player '%s'", name);
return 1;
}
/* Actually read the file */
fscanf(fd, "%d\n", &version);
switch(version) {
case 1:
fscanf(fd, "%s %s\n", c->name, c->password);
/* if fgets finds a \n (it should do), we have to remove it */
fgets(c->prompt, MAX_PROMPT_LENGTH + 1, fd);
{
char *lastchar = &c->prompt[strlen(c->prompt) - 1];
if (*lastchar == '\n')
*lastchar = '\0';
}
fscanf(fd, "%lx\n", &c->privs);
fscanf(fd, "%lu\n", &c->prevtime);
break;
}
fclose(fd);
return 0;
}
int save_player(const character *c, const char *name)
{
FILE *fd;
char path[256];
char n[MAX_NAME_LENGTH+1];
time_t now;
unsigned long howlong;
STRNCOPY(n, name, sizeof(n));
strlower(n);
STRNCOPY(path, "lib/players/", sizeof(path));
STRNAPPEND(path, n, sizeof(path));
fd = fopen(path, "w+");
if (fd == NULL) {
/* error has occurred do something */
log(debug, "Failed to save character %s to %s", c->name, path);
return 1;
}
/* Actually write the file */
/* put on version stamp */
fprintf(fd, "%d\n", CURRENT_VERSION);
fprintf(fd, "%s %s\n", c->name, c->password);
fprintf(fd, "%s\n", c->prompt);
fprintf(fd, "%lx\n", c->privs);
now = time(NULL);
howlong = (unsigned long) difftime(now, c->logintime);
fprintf(fd, "%lu\n", c->prevtime + howlong);
fclose(fd);
return 0;
}