static char *logs_prepare_path(session_t *session, const char *logs_path, const char *uid, time_t sent) { char *uidtmp, datetime[5]; struct tm *tm = NULL; string_t buf; if (!logs_path) return NULL; buf = string_init(NULL); while (*logs_path) { if ((char)*logs_path == '%' && (logs_path+1) != NULL) { switch (*(logs_path+1)) { case 'S': string_append_n(buf, session ? session->uid : "_null_", -1); break; case 'P': string_append_n(buf, config_profile ? config_profile : "_default_", -1); break; case 'u': uidtmp = xstrdup(get_uid(session, uid)); goto attach; /* avoid code duplication */ case 'U': uidtmp = xstrdup(get_nickname(session, uid)); attach: if (!uidtmp) uidtmp = xstrdup(uid); if (xstrchr(uidtmp, '/')) *(xstrchr(uidtmp, '/')) = 0; // strip resource string_append_n(buf, uidtmp ? uidtmp : uid, -1); xfree(uidtmp); break; case 'Y': if (!tm) tm = localtime(&sent); snprintf(datetime, 5, "%4d", tm->tm_year+1900); string_append_n(buf, datetime, 4); break; case 'M': if (!tm) tm = localtime(&sent); snprintf(datetime, 3, "%02d", tm->tm_mon+1); string_append_n(buf, datetime, 2); break; case 'D': if (!tm) tm = localtime(&sent); snprintf(datetime, 3, "%02d", tm->tm_mday); string_append_n(buf, datetime, 2); break; default: string_append_c(buf, *(logs_path+1)); }; logs_path++; } else if (*logs_path == '~' && (*(logs_path+1) == '/' || *(logs_path+1) == '\0')) { string_append_n(buf, home_dir, -1); //string_append_c(buf, '/'); } else string_append_c(buf, *logs_path); logs_path++; }; // sanityzacja sciezki - wywalic "../", zamienic znaki spec. na inne // zamieniamy szkodliwe znaki na minusy, spacje na podkreslenia // TODO xstrtr(buf->str, ' ', '_'); return string_free(buf, 0); }
/* * przygotowanie nazwy pliku z rozszerzeniem * %S - sesja nasza * %u - użytkownik (uid), z którym piszemy * %U - użytkownik (nick) -||- * %Y, %M, %D - rok, miesiąc, dzień * zwraca ścieżkę, która należy ręcznie zwolnić przez xfree() */ static char *logs_prepare_fname(logs_log_t *log) { session_t *s; const char *logs_path; struct tm *tm = NULL; string_t buf; time_t sent = time(NULL); g_return_val_if_fail(log != NULL, NULL); g_return_val_if_fail(log->format != LOG_FORMAT_NONE, NULL); logs_path = (LOG_FORMAT_RAW == log->format) ? EKG_RAW_LOGS_PATH : config_logs_path; g_return_val_if_fail(logs_path != NULL, NULL); buf = g_string_new(NULL); s = session_find(log->session); while (*logs_path) { if (*logs_path == '%' && *(logs_path+1) != '\0') { char *append = NULL; logs_path++; switch (*logs_path) { case 'S': append = g_strdup(s ? s->uid : "_null_"); break; case 'P': append = g_strdup(config_profile ? config_profile : "_default_"); break; case 'U': case 'u': append = g_strdup(*logs_path=='u' ? log->uid : get_nickname(s, log->uid)); if (!append) append = g_strdup(log->uid); break; case 'Y': if (!tm) tm = localtime(&sent); append = g_strdup_printf("%4d", tm->tm_year+1900); break; case 'M': if (!tm) tm = localtime(&sent); append = g_strdup_printf("%02d", tm->tm_mon+1); break; case 'D': if (!tm) tm = localtime(&sent); append = g_strdup_printf("%02d", tm->tm_mday); break; default: g_string_append_c(buf, *logs_path); }; if (append) { // XXX g_uri_escape_string( , , allow_utf8) ? char *tmp = g_uri_escape_string(append, G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT, TRUE); g_string_append(buf, tmp); g_free(tmp); g_free(append); } } else if (*logs_path == '~' && (*(logs_path+1) == '/' || *(logs_path+1) == '\0')) { g_string_append(buf, home_dir); } else string_append_c(buf, *logs_path); logs_path++; }; switch (log->format) { case LOG_FORMAT_RAW: g_string_append(buf, ".raw"); break; case LOG_FORMAT_SIMPLE: g_string_append(buf, ".txt"); break; case LOG_FORMAT_IRSSI: g_string_append(buf, ".log"); break; case LOG_FORMAT_XML: g_string_append(buf, ".xml"); break; } // TODO sanityzacja sciezki - wywalic "../", xstrtr(buf->str, ' ', '_'); return g_string_free(buf, FALSE); }