#include "copyright.h"
#include "config.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <signal.h>
#include <errno.h>
#include "mudconf.h"
#include "externs.h"
#include "interface.h"
#include "flags.h"
#include "command.h"
#include "attrs.h"
#include "rbtree.h"
#include "debug.h"
Include dependency graph for logcache.c:
Go to the source code of this file.
Data Structures | |
struct | logfile_t |
Defines | |
#define | LOGFILE_TIMEOUT 300 |
Functions | |
static int | logcache_compare (void *vleft, void *vright, void *arg) |
static int | logcache_close (struct logfile_t *log) |
static void | logcache_expire (int fd, short event, void *arg) |
static int | _logcache_list (void *key, void *data, int depth, void *arg) |
void | logcache_list (dbref player) |
static int | logcache_open (char *filename) |
void | logcache_init () |
static int | _logcache_destruct (void *key, void *data, int depth, void *arg) |
void | logcache_destruct () |
int | logcache_writelog (char *fname, char *fdata) |
Variables | |
rbtree | logfiles = NULL |
#define LOGFILE_TIMEOUT 300 |
static int _logcache_destruct | ( | void * | key, | |
void * | data, | |||
int | depth, | |||
void * | arg | |||
) | [static] |
Definition at line 140 of file logcache.c.
References logcache_close().
Referenced by logcache_destruct().
00141 { 00142 struct logfile_t *log = (struct logfile_t *) data; 00143 logcache_close(log); 00144 return 1; 00145 }
static int _logcache_list | ( | void * | key, | |
void * | data, | |||
int | depth, | |||
void * | arg | |||
) | [static] |
Definition at line 75 of file logcache.c.
References logfile_t::ev, logfile_t::filename, mudstate, notify_printf(), and statedata::now.
Referenced by logcache_list().
00076 { 00077 struct timeval tv; 00078 struct logfile_t *log = (struct logfile_t *) data; 00079 dbref player = *(dbref *) arg; 00080 evtimer_pending(&log->ev, &tv); 00081 notify_printf(player, "%-40s%d", log->filename, tv.tv_sec - mudstate.now); 00082 return 1; 00083 }
static int logcache_close | ( | struct logfile_t * | log | ) | [static] |
Definition at line 53 of file logcache.c.
References dprintk, logfile_t::ev, logfile_t::fd, logfile_t::filename, logfiles, and rb_delete().
Referenced by _logcache_destruct(), logcache_expire(), and logcache_writelog().
00054 { 00055 dprintk("closing logfile '%s'.", log->filename); 00056 if(evtimer_pending(&log->ev, NULL)) { 00057 evtimer_del(&log->ev); 00058 } 00059 close(log->fd); 00060 rb_delete(logfiles, log->filename); 00061 if(log->filename) 00062 free(log->filename); 00063 log->filename = NULL; 00064 log->fd = -1; 00065 free(log); 00066 return 1; 00067 }
static int logcache_compare | ( | void * | vleft, | |
void * | vright, | |||
void * | arg | |||
) | [static] |
void logcache_destruct | ( | ) |
Definition at line 147 of file logcache.c.
References _logcache_destruct(), dprintk, logfiles, rb_destroy(), rb_walk(), and WALK_INORDER.
Referenced by main(), and shutdown_services().
00148 { 00149 dprintk("logcache destructing."); 00150 if(!logfiles) { 00151 dprintk("logcache_destruct() CALLED WHILE UNITIALIZED!"); 00152 return; 00153 } 00154 rb_walk(logfiles, WALK_INORDER, _logcache_destruct, NULL); 00155 rb_destroy(logfiles); 00156 logfiles = NULL; 00157 }
static void logcache_expire | ( | int | fd, | |
short | event, | |||
void * | arg | |||
) | [static] |
Definition at line 69 of file logcache.c.
References dprintk, and logcache_close().
Referenced by logcache_open().
00070 { 00071 dprintk("Expiring '%s'.", ((struct logfile_t *) arg)->filename); 00072 logcache_close((struct logfile_t *) arg); 00073 }
void logcache_init | ( | ) |
Definition at line 130 of file logcache.c.
References dprintk, logcache_compare(), logfiles, and rb_init().
Referenced by logcache_writelog(), and main().
00131 { 00132 if(!logfiles) { 00133 dprintk("logcache initialized."); 00134 logfiles = rb_init(logcache_compare, NULL); 00135 } else { 00136 dprintk("REDUNDANT CALL TO logcache_init()!"); 00137 } 00138 }
void logcache_list | ( | dbref | player | ) |
Definition at line 85 of file logcache.c.
References _logcache_list(), logfiles, notify, rb_size(), rb_walk(), and WALK_INORDER.
Referenced by do_list().
00086 { 00087 notify(player, "/--------------------------- Open Logfiles"); 00088 if(rb_size(logfiles) == 0) { 00089 notify(player, "- There are no open logfile handles."); 00090 return; 00091 } 00092 notify(player, "Filename Timeout"); 00093 rb_walk(logfiles, WALK_INORDER, _logcache_list, &player); 00094 }
static int logcache_open | ( | char * | filename | ) | [static] |
Definition at line 96 of file logcache.c.
References dprintk, logfile_t::ev, logfile_t::fd, logfile_t::filename, log_perror(), logcache_expire(), LOGFILE_TIMEOUT, logfiles, rb_exists(), and rb_insert().
Referenced by logcache_writelog().
00097 { 00098 int fd; 00099 struct logfile_t *newlog; 00100 struct timeval tv = { LOGFILE_TIMEOUT, 0 }; 00101 00102 if(rb_exists(logfiles, filename)) { 00103 fprintf(stderr, 00104 "Serious braindamage, logcache_open() called for already open logfile.\n"); 00105 return 0; 00106 } 00107 00108 fd = open(filename, O_RDWR | O_APPEND | O_CREAT, 0644); 00109 if(fd < 0) { 00110 fprintf(stderr, 00111 "Failed to open logfile %s because open() failed with code: %d - %s\n", 00112 filename, errno, strerror(errno)); 00113 return 0; 00114 } 00115 if(fcntl(fd, F_SETFD, FD_CLOEXEC) < 0) { 00116 log_perror("LOGCACHE", "FAIL", NULL, 00117 "fcntl(fd, F_SETFD, FD_CLOEXEC)"); 00118 } 00119 00120 newlog = malloc(sizeof(struct logfile_t)); 00121 newlog->fd = fd; 00122 newlog->filename = strdup(filename); 00123 evtimer_set(&newlog->ev, logcache_expire, newlog); 00124 evtimer_add(&newlog->ev, &tv); 00125 rb_insert(logfiles, newlog->filename, newlog); 00126 dprintk("opened logfile '%s' fd = %d.", filename, fd); 00127 return 1; 00128 }
int logcache_writelog | ( | char * | fname, | |
char * | fdata | |||
) |
Definition at line 159 of file logcache.c.
References logfile_t::ev, logfile_t::fd, logfile_t::filename, logcache_close(), logcache_init(), logcache_open(), LOGFILE_TIMEOUT, logfiles, and rb_find().
00160 { 00161 struct logfile_t *log; 00162 struct timeval tv = { LOGFILE_TIMEOUT, 0 }; 00163 int len; 00164 00165 if(!logfiles) 00166 logcache_init(); 00167 00168 len = strlen(fdata); 00169 00170 log = rb_find(logfiles, fname); 00171 00172 if(!log) { 00173 if(logcache_open(fname) < 0) { 00174 return 0; 00175 } 00176 log = rb_find(logfiles, fname); 00177 if(!log) { 00178 return 0; 00179 } 00180 } 00181 00182 if(evtimer_pending(&log->ev, NULL)) { 00183 event_del(&log->ev); 00184 event_add(&log->ev, &tv); 00185 } 00186 00187 if(write(log->fd, fdata, len) < 0) { 00188 fprintf(stderr, 00189 "System failed to write data to file with error '%s' on logfile '%s'. Closing.\n", 00190 strerror(errno), log->filename); 00191 logcache_close(log); 00192 } 00193 return 1; 00194 }
Definition at line 46 of file logcache.c.
Referenced by logcache_close(), logcache_destruct(), logcache_init(), logcache_list(), logcache_open(), and logcache_writelog().