Added SILC Thread Queue API
[runtime.git] / apps / irssi / src / core / log.c
index 9a131f9680d5f573e13132a668e7f8f0233fe227..4d49402e371798e8ae452729ac54dfef5667bc84 100644 (file)
@@ -47,6 +47,7 @@ static const char *log_item_types[] = {
 
 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)
@@ -100,6 +101,8 @@ static char *log_filename(LOG_REC *log)
 
 int log_start_logging(LOG_REC *log)
 {
+       char *dir;
+
        g_return_val_if_fail(log != NULL, FALSE);
 
        if (log->handle != -1)
@@ -108,6 +111,16 @@ int log_start_logging(LOG_REC *log)
        /* 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);
@@ -165,7 +178,7 @@ void log_stop_logging(LOG_REC *log)
 
 static void log_rotate_check(LOG_REC *log)
 {
-       char *new_fname, *dir;
+       char *new_fname;
 
        g_return_if_fail(log != NULL);
 
@@ -178,10 +191,6 @@ static void log_rotate_check(LOG_REC *log)
                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);
@@ -237,18 +246,28 @@ void log_write_rec(LOG_REC *log, const char *str, int level)
         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;
@@ -549,6 +568,11 @@ static void read_settings(void)
 {
        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)