示例#1
0
文件: main.c 项目: 11mariom/ekg2
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);
}
示例#2
0
文件: main.c 项目: hiciu/ekg2
/*
 * 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);
}