Mercurial > ~mikael > mcabber > hg
annotate mcabber/src/histolog.c @ 1197:6f602d3270a4
Add /pgp [-]force
With this command it becomes possible to enforce PGP encryption without
checking if the remote client has PGP support. It can be used to send
encrypted offline messages too.
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Fri, 27 Apr 2007 00:37:57 +0200 |
parents | 9726c78a91f3 |
children | e802ec0c02d2 |
rev | line source |
---|---|
110 | 1 /* |
699 | 2 * histolog.c -- File history handling |
395
3e4f2f98c0bf
Whitespace cleanup (histolog.c)
Mikael Berthe <mikael@lilotux.net>
parents:
394
diff
changeset
|
3 * |
699 | 4 * Copyright (C) 2005, 2006 Mikael Berthe <bmikael@lists.lilotux.net> |
110 | 5 * |
6 * This program is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or (at | |
9 * your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, but | |
12 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 * General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | |
19 * USA | |
20 */ | |
21 | |
22 #include <string.h> | |
23 #include <stdlib.h> | |
24 #include <time.h> | |
113 | 25 #include <ctype.h> |
26 #include <sys/types.h> | |
27 #include <sys/stat.h> | |
28 #include <fcntl.h> | |
110 | 29 |
30 #include "histolog.h" | |
178 | 31 #include "hbuf.h" |
113 | 32 #include "jabglue.h" |
241 | 33 #include "utils.h" |
378
2e6c7b1440d1
Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents:
374
diff
changeset
|
34 #include "logprint.h" |
635
d4119cb85aeb
New "load_muc_logs" option
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
35 #include "settings.h" |
727
1c3620668857
Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
36 #include "utils.h" |
110 | 37 |
38 static guint UseFileLogging; | |
177 | 39 static guint FileLoadLogs; |
110 | 40 static char *RootDir; |
41 | |
42 | |
1058 | 43 // user_histo_file(jid) |
110 | 44 // Returns history filename for the given jid |
45 // Note: the caller *must* free the filename after use (if not null). | |
1058 | 46 static char *user_histo_file(const char *bjid) |
110 | 47 { |
48 char *filename; | |
1106 | 49 char *lowerid; |
50 | |
51 if (!(UseFileLogging || FileLoadLogs)) | |
52 return NULL; | |
110 | 53 |
1058 | 54 lowerid = g_strdup(bjid); |
1106 | 55 if (!lowerid) |
56 return NULL; | |
57 mc_strtolower(lowerid); | |
186 | 58 |
1106 | 59 filename = g_strdup_printf("%s%s", RootDir, lowerid); |
186 | 60 g_free(lowerid); |
110 | 61 return filename; |
62 } | |
63 | |
1155
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
64 char *hlog_get_log_jid(const char *bjid) |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
65 { |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
66 struct stat bufstat; |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
67 char *path; |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
68 char *log_jid = NULL; |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
69 |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
70 path = user_histo_file(bjid); |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
71 do { |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
72 /*scr_LogPrint(LPRINT_NORMAL, "path=%s", path);*/ |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
73 if(lstat(path, &bufstat) != 0) |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
74 break; |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
75 if(S_ISLNK(bufstat.st_mode)) { |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
76 g_free(log_jid); |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
77 log_jid = g_new(char, bufstat.st_size+1); |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
78 readlink(path, log_jid, bufstat.st_size); |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
79 g_free(path); |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
80 log_jid[bufstat.st_size] = '\0'; |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
81 path = user_histo_file(log_jid); |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
82 } else { |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
83 g_free(path); |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
84 path = NULL; |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
85 } |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
86 } while( path ); |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
87 |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
88 return log_jid; |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
89 } |
3b9bbf6c4c93
Added hlog_get_log_jid(): returns the value of a symlinked history file or NULL if it isn't symlinked
Frank Zschockelt
parents:
1144
diff
changeset
|
90 |
178 | 91 // write_histo_line() |
110 | 92 // Adds a history (multi-)line to the jid's history logfile |
1058 | 93 static void write_histo_line(const char *bjid, |
113 | 94 time_t timestamp, guchar type, guchar info, const char *data) |
110 | 95 { |
96 guint len = 0; | |
113 | 97 FILE *fp; |
110 | 98 time_t ts; |
113 | 99 const char *p; |
178 | 100 char *filename; |
241 | 101 char str_ts[20]; |
273 | 102 int err; |
110 | 103 |
1106 | 104 if (!UseFileLogging) |
105 return; | |
178 | 106 |
1144
b8f5fe2d666a
Add option "logging_ignore_status"
Mikael Berthe <mikael@lilotux.net>
parents:
1141
diff
changeset
|
107 // Do not log status messages when 'logging_ignore_status' is set |
b8f5fe2d666a
Add option "logging_ignore_status"
Mikael Berthe <mikael@lilotux.net>
parents:
1141
diff
changeset
|
108 if (type == 'S' && settings_opt_get_int("logging_ignore_status")) |
b8f5fe2d666a
Add option "logging_ignore_status"
Mikael Berthe <mikael@lilotux.net>
parents:
1141
diff
changeset
|
109 return; |
b8f5fe2d666a
Add option "logging_ignore_status"
Mikael Berthe <mikael@lilotux.net>
parents:
1141
diff
changeset
|
110 |
1058 | 111 filename = user_histo_file(bjid); |
110 | 112 |
113 // If timestamp is null, get current date | |
114 if (timestamp) | |
115 ts = timestamp; | |
116 else | |
117 time(&ts); | |
118 | |
119 if (!data) | |
120 data = ""; | |
121 | |
122 // Count number of extra lines | |
123 for (p=data ; *p ; p++) | |
124 if (*p == '\n') len++; | |
125 | |
241 | 126 /* Line format: "TI yyyymmddThh:mm:ssZ [data]" |
127 * (Old format: "TI DDDDDDDDDD LLL [data])" | |
128 * T=Type, I=Info, yyyymmddThh:mm:ssZ=date, LLL=0-padded-len | |
110 | 129 * |
130 * Types: | |
131 * - M message Info: S (send) R (receive) | |
352 | 132 * - S status Info: [_oifdna] |
110 | 133 * We don't check them, we'll trust the caller. |
134 */ | |
135 | |
113 | 136 fp = fopen(filename, "a"); |
155 | 137 g_free(filename); |
273 | 138 if (!fp) { |
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
366
diff
changeset
|
139 scr_LogPrint(LPRINT_LOGNORM, "Unable to write history " |
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
366
diff
changeset
|
140 "(cannot open logfile)"); |
273 | 141 return; |
142 } | |
178 | 143 |
241 | 144 to_iso8601(str_ts, ts); |
273 | 145 err = fprintf(fp, "%c%c %-18.18s %03d %s\n", type, info, str_ts, len, data); |
113 | 146 fclose(fp); |
273 | 147 if (err < 0) { |
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
366
diff
changeset
|
148 scr_LogPrint(LPRINT_LOGNORM, "Error while writing to log file: %s", |
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
366
diff
changeset
|
149 strerror(errno)); |
273 | 150 } |
110 | 151 } |
152 | |
178 | 153 // hlog_read_history() |
154 // Reads the jid's history logfile | |
1058 | 155 void hlog_read_history(const char *bjid, GList **p_buddyhbuf, guint width) |
178 | 156 { |
157 char *filename; | |
158 guchar type, info; | |
159 char *data, *tail; | |
727
1c3620668857
Expand tabs when reading history files
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset
|
160 char *xtext; |
184 | 161 time_t timestamp; |
162 guint prefix_flags; | |
178 | 163 guint len; |
164 FILE *fp; | |
197 | 165 struct stat bufstat; |
193 | 166 guint err = 0; |
248 | 167 guint ln = 0; // line number |
899
a833f3d6119a
Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents:
795
diff
changeset
|
168 time_t starttime; |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1106
diff
changeset
|
169 int max_num_of_blocks; |
178 | 170 |
1106 | 171 if (!FileLoadLogs) |
172 return; | |
178 | 173 |
1058 | 174 if ((roster_gettype(bjid) & ROSTER_TYPE_ROOM) && |
635
d4119cb85aeb
New "load_muc_logs" option
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
175 (settings_opt_get_int("load_muc_logs") != 1)) |
d4119cb85aeb
New "load_muc_logs" option
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
176 return; |
d4119cb85aeb
New "load_muc_logs" option
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset
|
177 |
178 | 178 data = g_new(char, HBB_BLOCKSIZE+32); |
179 if (!data) { | |
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
366
diff
changeset
|
180 scr_LogPrint(LPRINT_LOGNORM, "Not enough memory to read history file"); |
178 | 181 return; |
182 } | |
183 | |
1058 | 184 filename = user_histo_file(bjid); |
178 | 185 |
186 fp = fopen(filename, "r"); | |
187 g_free(filename); | |
1106 | 188 if (!fp) { |
189 g_free(data); | |
190 return; | |
191 } | |
178 | 192 |
394
4617d0f029ea
Update "large file" size value to 3MB
Mikael Berthe <mikael@lilotux.net>
parents:
378
diff
changeset
|
193 // If file is large (> 3MB here), display a message to inform the user |
197 | 194 // (it can take a while...) |
195 if (!fstat(fileno(fp), &bufstat)) { | |
394
4617d0f029ea
Update "large file" size value to 3MB
Mikael Berthe <mikael@lilotux.net>
parents:
378
diff
changeset
|
196 if (bufstat.st_size > 3145728) |
1058 | 197 scr_LogPrint(LPRINT_LOGNORM, "Reading <%s> history file...", bjid); |
197 | 198 } |
199 | |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1106
diff
changeset
|
200 max_num_of_blocks = get_max_history_blocks(); |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1106
diff
changeset
|
201 |
1106 | 202 starttime = 0L; |
899
a833f3d6119a
Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents:
795
diff
changeset
|
203 if (settings_opt_get_int("max_history_age") > 0) { |
a833f3d6119a
Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents:
795
diff
changeset
|
204 int maxdays = settings_opt_get_int("max_history_age"); |
a833f3d6119a
Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents:
795
diff
changeset
|
205 time(&starttime); |
1106 | 206 if (maxdays >= starttime/86400L) |
207 starttime = 0L; | |
899
a833f3d6119a
Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents:
795
diff
changeset
|
208 else |
1106 | 209 starttime -= maxdays * 86400L; |
899
a833f3d6119a
Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents:
795
diff
changeset
|
210 } |
a833f3d6119a
Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents:
795
diff
changeset
|
211 |
178 | 212 /* See write_histo_line() for line format... */ |
213 while (!feof(fp)) { | |
795
b16acadd7d53
Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset
|
214 guint dataoffset = 25; |
1106 | 215 |
216 if (fgets(data, HBB_BLOCKSIZE+27, fp) == NULL) | |
217 break; | |
248 | 218 ln++; |
178 | 219 |
220 for (tail = data; *tail; tail++) ; | |
221 | |
222 type = data[0]; | |
223 info = data[1]; | |
241 | 224 |
395
3e4f2f98c0bf
Whitespace cleanup (histolog.c)
Mikael Berthe <mikael@lilotux.net>
parents:
394
diff
changeset
|
225 if ((type != 'M' && type != 'S') || |
259 | 226 ((data[11] != 'T') || (data[20] != 'Z') || |
795
b16acadd7d53
Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset
|
227 (data[21] != ' ') || |
b16acadd7d53
Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset
|
228 (data[25] != ' ' && data[26] != ' '))) { |
193 | 229 if (!err) { |
795
b16acadd7d53
Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset
|
230 scr_LogPrint(LPRINT_LOGNORM, |
1058 | 231 "Error in history file format (%s), l.%u", bjid, ln); |
193 | 232 err = 1; |
233 } | |
186 | 234 continue; |
178 | 235 } |
795
b16acadd7d53
Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset
|
236 // The number of lines can be written with 3 or 4 bytes. |
b16acadd7d53
Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset
|
237 if (data[25] != ' ') dataoffset = 26; |
b16acadd7d53
Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset
|
238 data[21] = data[dataoffset] = 0; |
259 | 239 timestamp = from_iso8601(&data[3], 1); |
240 len = (guint) atoi(&data[22]); | |
395
3e4f2f98c0bf
Whitespace cleanup (histolog.c)
Mikael Berthe <mikael@lilotux.net>
parents:
394
diff
changeset
|
241 |
178 | 242 // Some checks |
243 if (((type == 'M') && (info != 'S' && info != 'R')) || | |
277
4d7040cff8ee
Remove busy/occupied status, which does not really exist
Mikael Berthe <mikael@lilotux.net>
parents:
273
diff
changeset
|
244 ((type == 'I') && (!strchr("OAIFDN", info)))) { |
193 | 245 if (!err) { |
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
366
diff
changeset
|
246 scr_LogPrint(LPRINT_LOGNORM, "Error in history file format (%s), l.%u", |
1058 | 247 bjid, ln); |
193 | 248 err = 1; |
249 } | |
186 | 250 continue; |
178 | 251 } |
252 | |
197 | 253 // XXX This will fail when a message is too big |
178 | 254 while (len--) { |
248 | 255 ln++; |
259 | 256 if (fgets(tail, HBB_BLOCKSIZE+27 - (tail-data), fp) == NULL) |
249 | 257 break; |
178 | 258 |
259 while (*tail) tail++; | |
260 } | |
248 | 261 // Small check for too long messages |
795
b16acadd7d53
Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset
|
262 if (tail >= HBB_BLOCKSIZE+dataoffset+1 + data) { |
249 | 263 // Maybe we will have a parse error on next, because this |
264 // message is big (maybe too big). | |
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
366
diff
changeset
|
265 scr_LogPrint(LPRINT_LOGNORM, "A message could be too big " |
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
366
diff
changeset
|
266 "in history file..."); |
248 | 267 } |
251 | 268 // Remove last CR (we keep it if the line is empty, too) |
795
b16acadd7d53
Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset
|
269 if ((tail > data+dataoffset+1) && (*(tail-1) == '\n')) |
178 | 270 *(tail-1) = 0; |
271 | |
899
a833f3d6119a
Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents:
795
diff
changeset
|
272 // Check if the data is older than max_history_age |
a833f3d6119a
Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents:
795
diff
changeset
|
273 if (starttime) { |
a833f3d6119a
Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents:
795
diff
changeset
|
274 if (timestamp > starttime) |
1106 | 275 starttime = 0L; // From now on, load everything |
899
a833f3d6119a
Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents:
795
diff
changeset
|
276 else |
a833f3d6119a
Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents:
795
diff
changeset
|
277 continue; |
a833f3d6119a
Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents:
795
diff
changeset
|
278 } |
a833f3d6119a
Add option 'max_history_age'
Mikael Berthe <mikael@lilotux.net>
parents:
795
diff
changeset
|
279 |
178 | 280 if (type == 'M') { |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
281 char *converted; |
178 | 282 if (info == 'S') |
729
39f67cade02c
Use bold font for outgoing messages
Mikael Berthe <mikael@lilotux.net>
parents:
727
diff
changeset
|
283 prefix_flags = HBB_PREFIX_OUT | HBB_PREFIX_HLIGHT; |
178 | 284 else |
184 | 285 prefix_flags = HBB_PREFIX_IN; |
795
b16acadd7d53
Improve support for long messages
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset
|
286 converted = from_utf8(&data[dataoffset+1]); |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
287 if (converted) { |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
288 xtext = ut_expand_tabs(converted); // Expand tabs |
1141
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1106
diff
changeset
|
289 hbuf_add_line(p_buddyhbuf, xtext, timestamp, prefix_flags, width, |
5be2408a6534
Add option "max_history_blocks"
Mikael Berthe <mikael@lilotux.net>
parents:
1106
diff
changeset
|
290 max_num_of_blocks); |
772
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
291 if (xtext != converted) |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
292 g_free(xtext); |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
293 g_free(converted); |
464be13343a9
Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents:
729
diff
changeset
|
294 } |
193 | 295 err = 0; |
178 | 296 } |
297 } | |
298 fclose(fp); | |
299 g_free(data); | |
300 } | |
301 | |
110 | 302 // hlog_enable() |
303 // Enable logging to files. If root_dir is NULL, then $HOME/.mcabber is used. | |
177 | 304 // If loadfiles is TRUE, we will try to load buddies history logs from file. |
281
f562b9af2de7
Add "const" specifier in prototypes
Mikael Berthe <mikael@lilotux.net>
parents:
277
diff
changeset
|
305 void hlog_enable(guint enable, const char *root_dir, guint loadfiles) |
110 | 306 { |
307 UseFileLogging = enable; | |
177 | 308 FileLoadLogs = loadfiles; |
110 | 309 |
177 | 310 if (enable || loadfiles) { |
110 | 311 if (root_dir) { |
1167
9726c78a91f3
Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents:
1155
diff
changeset
|
312 char *xp_root_dir; |
110 | 313 int l = strlen(root_dir); |
314 if (l < 1) { | |
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
366
diff
changeset
|
315 scr_LogPrint(LPRINT_LOGNORM, "Error: logging dir name too short"); |
362
d8f147d6e872
Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents:
352
diff
changeset
|
316 UseFileLogging = FileLoadLogs = FALSE; |
110 | 317 return; |
318 } | |
1167
9726c78a91f3
Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents:
1155
diff
changeset
|
319 xp_root_dir = expand_filename(root_dir); |
110 | 320 // RootDir must be slash-terminated |
1167
9726c78a91f3
Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents:
1155
diff
changeset
|
321 if (root_dir[l-1] == '/') { |
9726c78a91f3
Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents:
1155
diff
changeset
|
322 RootDir = xp_root_dir; |
9726c78a91f3
Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents:
1155
diff
changeset
|
323 } else { |
9726c78a91f3
Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents:
1155
diff
changeset
|
324 RootDir = g_strdup_printf("%s/", xp_root_dir); |
9726c78a91f3
Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents:
1155
diff
changeset
|
325 g_free(xp_root_dir); |
9726c78a91f3
Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents:
1155
diff
changeset
|
326 } |
110 | 327 } else { |
328 char *home = getenv("HOME"); | |
1106 | 329 const char *dir = "/.mcabber/histo/"; |
330 RootDir = g_strdup_printf("%s%s", home, dir); | |
110 | 331 } |
362
d8f147d6e872
Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents:
352
diff
changeset
|
332 // Check directory permissions (should not be readable by group/others) |
d8f147d6e872
Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents:
352
diff
changeset
|
333 if (checkset_perm(RootDir, TRUE) == -1) { |
d8f147d6e872
Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents:
352
diff
changeset
|
334 // The directory does not actually exists |
d8f147d6e872
Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents:
352
diff
changeset
|
335 g_free(RootDir); |
1106 | 336 RootDir = NULL; |
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
366
diff
changeset
|
337 scr_LogPrint(LPRINT_LOGNORM, "ERROR: Cannot access " |
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
366
diff
changeset
|
338 "history log directory, logging DISABLED"); |
362
d8f147d6e872
Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents:
352
diff
changeset
|
339 UseFileLogging = FileLoadLogs = FALSE; |
d8f147d6e872
Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents:
352
diff
changeset
|
340 } |
d8f147d6e872
Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents:
352
diff
changeset
|
341 } else { // Disable history logging |
774
46304b773a44
Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents:
772
diff
changeset
|
342 g_free(RootDir); |
1106 | 343 RootDir = NULL; |
110 | 344 } |
345 } | |
346 | |
1058 | 347 inline void hlog_write_message(const char *bjid, time_t timestamp, int sent, |
113 | 348 const char *msg) |
349 { | |
1058 | 350 write_histo_line(bjid, timestamp, 'M', ((sent) ? 'S' : 'R'), msg); |
113 | 351 } |
352 | |
1058 | 353 inline void hlog_write_status(const char *bjid, time_t timestamp, |
221 | 354 enum imstatus status, const char *status_msg) |
113 | 355 { |
356 // #1 XXX Check status value? | |
357 // #2 We could add a user-readable comment | |
1058 | 358 write_histo_line(bjid, timestamp, 'S', toupper(imstatus2char[status]), |
221 | 359 status_msg); |
113 | 360 } |
361 | |
580 | 362 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ |