/* * log.cpp * Functions to log various items in the game. * ____ _ * | _ \ ___ __ _| |_ __ ___ ___ * | |_) / _ \/ _` | | '_ ` _ \/ __| * | _ < __/ (_| | | | | | | \__ \ * |_| \_\___|\__,_|_|_| |_| |_|___/ * * Permission to use, modify and distribute is granted via the * Creative Commons - Attribution - Non Commercial - Share Alike 3.0 License * http://creativecommons.org/licenses/by-nc-sa/3.0/ * * Copyright (C) 2007-2012 Jason Mitchell, Randi Mitchell * Contributions by Tim Callahan, Jonathan Hseu * Based on Mordor (C) Brooke Paul, Brett J. Vickers, John P. Freeman * */ #include "mud.h" #include <fcntl.h> // TODO: Rework these to avoid redundant code //********************************************************************* // getTimeStr //********************************************************************* // gets the result of ctime but removes the trailing newline // Returns: the a static pointer to time string char *getTimeStr() { time_t t; static char timestr[40]; t = time(0); strcpy(timestr, ctime(&t)); // strip the newline at the end timestr[strlen(timestr)-1] = 0; return(timestr); } //********************************************************************** // logn //********************************************************************** // This function writes a formatted printf string to a logfile called // "name" in the log directory. void logn(const char *name, const char *fmt, ...) { char filename[80]; char *str; FILE *fp; va_list ap; va_start(ap, fmt); sprintf(filename, "%s/%s.txt", Path::Log, name); fp = fopen(filename, "a"); if(fp == NULL) { printf("Unable to open '%s'\n", filename); return; } if(vasprintf(&str, fmt, ap) == -1) { printf("Error in logn\n"); return; } va_end(ap); // TODO: put the \n at the end of this fprintf(fp, "%s: %s", getTimeStr(), str); free(str); fclose(fp); } //********************************************************************** // loge //********************************************************************** // This function writes a formatted printf string to a logfile called // "log" in the player directory. void loge(const char *fmt, ...) { char file[80]; char str[4048]; int fd; time_t t; va_list ap; va_start(ap, fmt); sprintf(file, "%s/log.txt", Path::Log); fd = open(file, O_RDWR, 0); if(fd < 0) { fd = open(file, O_RDWR | O_CREAT, ACC); if(fd < 0) return; } lseek(fd, 0L, 2); t = time(0); strcpy(str, ctime(&t)); str[24] = ':'; str[25] = ' '; vsnprintf(str + 26, 2000, fmt, ap); va_end(ap); // vsnprintf(str, 4000, fmt, ap); // va_end(ap); // snprintf(str, 4195, "%s: %s", getTimeStr(), str); write(fd, str, strlen(str)); close(fd); } //********************************************************************** // loga //********************************************************************** // Logs stuff in the active log void loga(const char *fmt,...) { char file[80]; char str[4048]; int fd; va_list ap; va_start(ap, fmt); sprintf(file, "%s/log.active.txt", Path::Log); fd = open(file, O_RDWR, 0); if(fd < 0) { fd = open(file, O_RDWR | O_CREAT, ACC); if(fd < 0) return; } lseek(fd, 0L, 2); vsnprintf(str, 4000, fmt, ap); va_end(ap); snprintf(str, 4195, "%s: %s", getTimeStr(), str); write(fd, str, strlen(str)); close(fd); }