const char *log_timestamp;
static int log_file_create_mode;
+static int log_dir_create_mode;
static int rotate_tag;
static int log_item_str2type(const char *type)
int log_start_logging(LOG_REC *log)
{
+ char *dir;
+
g_return_val_if_fail(log != NULL, FALSE);
if (log->handle != -1)
/* Append/create log file */
g_free_not_null(log->real_fname);
log->real_fname = log_filename(log);
+
+ if (log->real_fname != NULL &&
+ strcmp(log->real_fname, log->fname) != 0) {
+ /* path may contain variables (%time, $vars),
+ make sure the directory is created */
+ dir = g_dirname(log->real_fname);
+ mkpath(dir, log_dir_create_mode);
+ g_free(dir);
+ }
+
log->handle = log->real_fname == NULL ? -1 :
open(log->real_fname, O_WRONLY | O_APPEND | O_CREAT,
log_file_create_mode);
static void log_rotate_check(LOG_REC *log)
{
- char *new_fname, *dir;
+ char *new_fname;
g_return_if_fail(log != NULL);
log_stop_logging(log);
signal_emit("log rotated", 1, log);
- dir = g_dirname(new_fname);
- mkpath(dir, LOG_DIR_CREATE_MODE);
- g_free(dir);
-
log_start_logging(log);
}
g_free(new_fname);
g_free_not_null(colorstr);
}
+static int itemcmp(const char *patt, const char *item)
+{
+ /* returns 0 on match, nonzero otherwise */
+
+ if (item == NULL)
+ return g_strcasecmp(patt, "*") != 0;
+ if (*patt == '*')
+ return 0;
+ return g_strcasecmp(patt, item);
+}
+
LOG_ITEM_REC *log_item_find(LOG_REC *log, int type, const char *item,
const char *servertag)
{
GSList *tmp;
g_return_val_if_fail(log != NULL, NULL);
- g_return_val_if_fail(item != NULL, NULL);
for (tmp = log->items; tmp != NULL; tmp = tmp->next) {
LOG_ITEM_REC *rec = tmp->data;
- if (rec->type == type && g_strcasecmp(rec->name, item) == 0 &&
+ if (rec->type == type && itemcmp(rec->name, item) == 0 &&
(rec->servertag == NULL || (servertag != NULL &&
g_strcasecmp(rec->servertag, servertag) == 0)))
return rec;
{
log_timestamp = settings_get_str("log_timestamp");
log_file_create_mode = octal2dec(settings_get_int("log_create_mode"));
+
+ log_dir_create_mode = log_file_create_mode;
+ if (log_file_create_mode & 0400) log_dir_create_mode |= 0100;
+ if (log_file_create_mode & 0040) log_dir_create_mode |= 0010;
+ if (log_file_create_mode & 0004) log_dir_create_mode |= 0001;
}
void log_init(void)