[log] Use canonical name to detect need for log rotation
Also reset store on part from server to close more file descriptor.
This commit is contained in:
parent
4532234426
commit
405f8b4afc
@ -1067,10 +1067,7 @@ static int irc_cli_part(struct link_client *irc, struct line *line)
|
|||||||
if (irc_line_count(line) != 2 && irc_line_count(line) != 3)
|
if (irc_line_count(line) != 2 && irc_line_count(line) != 3)
|
||||||
return ERR_PROTOCOL;
|
return ERR_PROTOCOL;
|
||||||
|
|
||||||
cname = irc_line_elem(line, 1);
|
cname = (char *)irc_line_elem(line, 1);
|
||||||
|
|
||||||
log_reset_store(LINK(irc)->log, cname);
|
|
||||||
log_drop(LINK(irc)->log, cname);
|
|
||||||
|
|
||||||
if ((ci = hash_remove_if_exists(&LINK(irc)->chan_infos,
|
if ((ci = hash_remove_if_exists(&LINK(irc)->chan_infos,
|
||||||
cname)) != NULL) {
|
cname)) != NULL) {
|
||||||
@ -1515,6 +1512,8 @@ static int irc_part(struct link_server *server, struct line *line)
|
|||||||
log_part(LINK(server)->log, line->origin, s_chan,
|
log_part(LINK(server)->log, line->origin, s_chan,
|
||||||
irc_line_count(line) == 3 ? irc_line_elem(line, 2) :
|
irc_line_count(line) == 3 ? irc_line_elem(line, 2) :
|
||||||
NULL);
|
NULL);
|
||||||
|
log_reset_store(LINK(server)->log, s_chan);
|
||||||
|
log_drop(LINK(server)->log, s_chan);
|
||||||
|
|
||||||
hash_remove(&server->channels, s_chan);
|
hash_remove(&server->channels, s_chan);
|
||||||
channel_free(channel);
|
channel_free(channel);
|
||||||
@ -1791,6 +1790,8 @@ static int irc_kick(struct link_server *server, struct line *line)
|
|||||||
irc_line_elem(line, 2),
|
irc_line_elem(line, 2),
|
||||||
irc_line_count(line) == 4 ?
|
irc_line_count(line) == 4 ?
|
||||||
irc_line_elem(line, 3) : NULL);
|
irc_line_elem(line, 3) : NULL);
|
||||||
|
log_reset_store(LINK(server)->log, channel->name);
|
||||||
|
log_drop(LINK(server)->log, channel->name);
|
||||||
|
|
||||||
if (LINK(server)->autojoin_on_kick) {
|
if (LINK(server)->autojoin_on_kick) {
|
||||||
if (!channel->key)
|
if (!channel->key)
|
||||||
|
36
src/log.c
36
src/log.c
@ -137,8 +137,8 @@ char *log_build_filename(log_t *logdata, const char *destination)
|
|||||||
struct tm *now;
|
struct tm *now;
|
||||||
time_t s;
|
time_t s;
|
||||||
char *dest = bip_strdup(destination);
|
char *dest = bip_strdup(destination);
|
||||||
strtolower(dest);
|
|
||||||
|
|
||||||
|
strtolower(dest);
|
||||||
logfile = (char *)bip_malloc(MAX_PATH_LEN + 1);
|
logfile = (char *)bip_malloc(MAX_PATH_LEN + 1);
|
||||||
|
|
||||||
time(&s);
|
time(&s);
|
||||||
@ -257,18 +257,23 @@ static int log_add_file(log_t *logdata, const char *destination,
|
|||||||
FILE *f;
|
FILE *f;
|
||||||
logstore_t *store;
|
logstore_t *store;
|
||||||
char *uniq_fname;
|
char *uniq_fname;
|
||||||
|
char *canonical_fname = NULL;
|
||||||
logfile_t *lf = NULL;
|
logfile_t *lf = NULL;
|
||||||
|
|
||||||
if (conf_log) {
|
if (conf_log) {
|
||||||
if (log_has_file(logdata, filename))
|
if (log_has_file(logdata, filename)) {
|
||||||
|
canonical_fname = bip_strdup(filename);
|
||||||
uniq_fname = filename_uniq(filename);
|
uniq_fname = filename_uniq(filename);
|
||||||
else
|
} else {
|
||||||
|
canonical_fname = bip_strdup(filename);
|
||||||
uniq_fname = bip_strdup(filename);
|
uniq_fname = bip_strdup(filename);
|
||||||
|
}
|
||||||
f = fopen(uniq_fname, "a+");
|
f = fopen(uniq_fname, "a+");
|
||||||
if (!f) {
|
if (!f) {
|
||||||
mylog(LOG_ERROR, "fopen(%s) %s", uniq_fname,
|
mylog(LOG_ERROR, "fopen(%s) %s", uniq_fname,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
free(uniq_fname);
|
free(uniq_fname);
|
||||||
|
free(canonical_fname);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -276,6 +281,7 @@ static int log_add_file(log_t *logdata, const char *destination,
|
|||||||
mylog(LOG_ERROR, "fseek(%s) %s", uniq_fname,
|
mylog(LOG_ERROR, "fseek(%s) %s", uniq_fname,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
free(uniq_fname);
|
free(uniq_fname);
|
||||||
|
free(canonical_fname);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -284,11 +290,11 @@ static int log_add_file(log_t *logdata, const char *destination,
|
|||||||
lf->file = f;
|
lf->file = f;
|
||||||
lf->len = ftell(f);
|
lf->len = ftell(f);
|
||||||
lf->filename = uniq_fname;
|
lf->filename = uniq_fname;
|
||||||
|
lf->canonical_filename = canonical_fname;
|
||||||
log_updatelast(lf);
|
log_updatelast(lf);
|
||||||
}
|
}
|
||||||
|
|
||||||
store = hash_get(&logdata->logfgs, destination);
|
store = hash_get(&logdata->logfgs, destination);
|
||||||
|
|
||||||
if (!store) {
|
if (!store) {
|
||||||
store = bip_calloc(sizeof(logstore_t), 1);
|
store = bip_calloc(sizeof(logstore_t), 1);
|
||||||
list_init(&store->file_group, NULL);
|
list_init(&store->file_group, NULL);
|
||||||
@ -322,6 +328,8 @@ void logfile_free(logfile_t *lf)
|
|||||||
fclose(lf->file);
|
fclose(lf->file);
|
||||||
if (lf->filename)
|
if (lf->filename)
|
||||||
free(lf->filename);
|
free(lf->filename);
|
||||||
|
if (lf->canonical_filename)
|
||||||
|
free(lf->canonical_filename);
|
||||||
free(lf);
|
free(lf);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -330,8 +338,6 @@ logstore_t *log_find_file(log_t *logdata, const char *destination)
|
|||||||
logfile_t *lf;
|
logfile_t *lf;
|
||||||
logstore_t *store;
|
logstore_t *store;
|
||||||
char *filename = NULL;
|
char *filename = NULL;
|
||||||
time_t t;
|
|
||||||
struct tm *ltime;
|
|
||||||
struct link *l;
|
struct link *l;
|
||||||
|
|
||||||
store = hash_get(&logdata->logfgs, destination);
|
store = hash_get(&logdata->logfgs, destination);
|
||||||
@ -373,10 +379,14 @@ logstore_t *log_find_file(log_t *logdata, const char *destination)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* This is reached if store already exists */
|
/* This is reached if store already exists */
|
||||||
|
lf = list_get_last(&store->file_group);
|
||||||
|
|
||||||
|
time_t t;
|
||||||
|
struct tm *ltime;
|
||||||
|
|
||||||
time(&t);
|
time(&t);
|
||||||
ltime = localtime(&t);
|
ltime = localtime(&t);
|
||||||
lf = list_get_last(&store->file_group);
|
if (ltime->tm_hour != lf->last_log.tm_hour) {
|
||||||
if (ltime->tm_mday != lf->last_log.tm_mday) {
|
|
||||||
logfile_t *oldlf;
|
logfile_t *oldlf;
|
||||||
|
|
||||||
/* day changed, we might want to rotate logfile */
|
/* day changed, we might want to rotate logfile */
|
||||||
@ -384,14 +394,16 @@ logstore_t *log_find_file(log_t *logdata, const char *destination)
|
|||||||
if (!filename)
|
if (!filename)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (strcmp(lf->filename, filename) == 0) {
|
if (strcmp(lf->canonical_filename, filename) == 0) {
|
||||||
/* finally we don't */
|
/* finally we don't */
|
||||||
free(filename);
|
free(filename);
|
||||||
return store;
|
return store;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we do want do rotate logfiles */
|
/* we do want to rotate logfiles */
|
||||||
mylog(LOG_DEBUG, "Rotating logfile for %s from", destination);
|
mylog(LOG_DEBUG, "Rotating logfile for %s %s %s", destination,
|
||||||
|
lf->filename, filename);
|
||||||
|
|
||||||
oldlf = list_get_last(&store->file_group);
|
oldlf = list_get_last(&store->file_group);
|
||||||
if (!log_add_file(logdata, destination, filename)) {
|
if (!log_add_file(logdata, destination, filename)) {
|
||||||
free(filename);
|
free(filename);
|
||||||
@ -662,7 +674,7 @@ void log_store_free(logstore_t *store)
|
|||||||
logfile_t *lf;
|
logfile_t *lf;
|
||||||
|
|
||||||
log_reset(store);
|
log_reset(store);
|
||||||
if ((lf = list_remove_first(&store->file_group)))
|
while ((lf = list_remove_first(&store->file_group)))
|
||||||
logfile_free(lf);
|
logfile_free(lf);
|
||||||
free(store->name);
|
free(store->name);
|
||||||
if (store->memlog)
|
if (store->memlog)
|
||||||
|
Loading…
Reference in New Issue
Block a user