241
|
1 /*
|
|
2 * utils.c -- Various utility functions
|
|
3 *
|
|
4 * Copyright (C) 2005 Mikael Berthe <bmikael@lists.lilotux.net>
|
|
5 * ut_* functions are derived from Cabber debug/log code.
|
|
6 * from_iso8601() comes from the Gaim project.
|
|
7 *
|
|
8 * This program is free software; you can redistribute it and/or modify
|
|
9 * it under the terms of the GNU General Public License as published by
|
|
10 * the Free Software Foundation; either version 2 of the License, or (at
|
|
11 * your option) any later version.
|
|
12 *
|
|
13 * This program is distributed in the hope that it will be useful, but
|
|
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
16 * General Public License for more details.
|
|
17 *
|
|
18 * You should have received a copy of the GNU General Public License
|
|
19 * along with this program; if not, write to the Free Software
|
|
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
21 * USA
|
|
22 */
|
|
23
|
24
|
24 #include <stdio.h>
|
|
25 #include <stdlib.h>
|
77
|
26 #include <string.h>
|
24
|
27 #include <stdarg.h>
|
|
28 #include <time.h>
|
|
29
|
241
|
30 #include <config.h>
|
|
31
|
76
|
32 static int DebugEnabled;
|
77
|
33 static char *FName;
|
24
|
34
|
138
|
35 void ut_InitDebug(unsigned int level, char *filename)
|
24
|
36 {
|
77
|
37 FILE *fp;
|
|
38
|
138
|
39 if (!level) {
|
|
40 DebugEnabled = 0;
|
|
41 FName = NULL;
|
|
42 return;
|
|
43 }
|
|
44
|
|
45 if (filename)
|
|
46 FName = strdup(filename);
|
77
|
47 else {
|
138
|
48 FName = getenv("HOME");
|
|
49 if (!FName)
|
|
50 FName = "/tmp/mcabberlog";
|
|
51 else {
|
|
52 char *tmpname = malloc(strlen(FName) + 12);
|
|
53 strcpy(tmpname, FName);
|
|
54 strcat(tmpname, "/mcabberlog");
|
|
55 FName = tmpname;
|
|
56 }
|
77
|
57 }
|
24
|
58
|
|
59 DebugEnabled = level;
|
76
|
60
|
77
|
61 fp = fopen(FName, "w");
|
76
|
62 if (!fp) return;
|
24
|
63 fprintf(fp, "Debugging mode started...\n"
|
|
64 "-----------------------------------\n");
|
|
65 fclose(fp);
|
|
66 }
|
|
67
|
|
68 void ut_WriteLog(const char *fmt, ...)
|
|
69 {
|
|
70 FILE *fp = NULL;
|
|
71 time_t ahora;
|
|
72 va_list ap;
|
|
73 char *buffer = NULL;
|
|
74
|
138
|
75 if (DebugEnabled && FName) {
|
77
|
76 fp = fopen(FName, "a+");
|
76
|
77 if (!fp) return;
|
24
|
78 buffer = (char *) calloc(1, 64);
|
|
79
|
|
80 ahora = time(NULL);
|
|
81 strftime(buffer, 64, "[%H:%M:%S] ", localtime(&ahora));
|
|
82 fprintf(fp, "%s", buffer);
|
|
83
|
|
84 va_start(ap, fmt);
|
|
85 vfprintf(fp, fmt, ap);
|
|
86 va_end(ap);
|
|
87
|
|
88 free(buffer);
|
|
89 fclose(fp);
|
|
90 }
|
|
91 }
|
|
92
|
241
|
93 // to_iso8601(dststr, timestamp)
|
|
94 // Convert timestamp to iso8601 format, and store it in dststr.
|
|
95 // NOTE: dststr should be at last 19 chars long.
|
|
96 // Return should be 0
|
|
97 int to_iso8601(char *dststr, time_t timestamp)
|
|
98 {
|
|
99 struct tm *tm_time;
|
|
100 int ret;
|
|
101
|
|
102 tm_time = gmtime(×tamp);
|
|
103
|
|
104 ret = snprintf(dststr, 19, "%.4d%02d%02dT%02d:%02d:%02dZ",
|
|
105 1900+tm_time->tm_year, tm_time->tm_mon+1, tm_time->tm_mday,
|
|
106 tm_time->tm_hour, tm_time->tm_min, tm_time->tm_sec);
|
|
107
|
|
108 return ((ret == -1) ? -1 : 0);
|
|
109 }
|
|
110
|
|
111 // from_iso8601(timestamp, utc)
|
|
112 // This function comes from the Gaim project, gaim_str_to_time().
|
|
113 // (Actually date may not be pure iso-8601)
|
|
114 // Thanks, guys!
|
|
115 time_t from_iso8601(const char *timestamp, int utc)
|
|
116 {
|
|
117 struct tm t;
|
|
118 time_t retval = 0;
|
|
119 char buf[32];
|
|
120 char *c;
|
|
121 int tzoff = 0;
|
|
122
|
|
123 time(&retval);
|
|
124 localtime_r(&retval, &t);
|
|
125
|
|
126 snprintf(buf, sizeof(buf), "%s", timestamp);
|
|
127 c = buf;
|
|
128
|
|
129 /* 4 digit year */
|
|
130 if (!sscanf(c, "%04d", &t.tm_year)) return 0;
|
|
131 c+=4;
|
|
132 if (*c == '-')
|
|
133 c++;
|
|
134
|
|
135 t.tm_year -= 1900;
|
|
136
|
|
137 /* 2 digit month */
|
|
138 if (!sscanf(c, "%02d", &t.tm_mon)) return 0;
|
|
139 c+=2;
|
|
140 if (*c == '-')
|
|
141 c++;
|
|
142
|
|
143 t.tm_mon -= 1;
|
|
144
|
|
145 /* 2 digit day */
|
|
146 if (!sscanf(c, "%02d", &t.tm_mday)) return 0;
|
|
147 c+=2;
|
|
148 if (*c == 'T' || *c == '.') { /* we have more than a date, keep going */
|
|
149 c++; /* skip the "T" */
|
|
150
|
|
151 /* 2 digit hour */
|
|
152 if (sscanf(c, "%02d:%02d:%02d", &t.tm_hour, &t.tm_min, &t.tm_sec) == 3 ||
|
|
153 sscanf(c, "%02d%02d%02d", &t.tm_hour, &t.tm_min, &t.tm_sec) == 3) {
|
|
154 int tzhrs, tzmins;
|
|
155 c+=8;
|
|
156 if (*c == '.') /* dealing with precision we don't care about */
|
|
157 c += 4;
|
|
158
|
|
159 if ((*c == '+' || *c == '-') &&
|
|
160 sscanf(c+1, "%02d:%02d", &tzhrs, &tzmins)) {
|
|
161 tzoff = tzhrs*60*60 + tzmins*60;
|
|
162 if (*c == '+')
|
|
163 tzoff *= -1;
|
|
164 }
|
|
165
|
|
166 if (tzoff || utc) {
|
|
167
|
|
168 //#ifdef HAVE_TM_GMTOFF
|
|
169 tzoff += t.tm_gmtoff;
|
|
170 //#else
|
|
171 //# ifdef HAVE_TIMEZONE
|
|
172 // tzset(); /* making sure */
|
|
173 // tzoff -= timezone;
|
|
174 //# endif
|
|
175 //#endif
|
|
176 }
|
|
177 }
|
|
178 }
|
|
179
|
|
180 t.tm_isdst = -1;
|
|
181
|
|
182 retval = mktime(&t);
|
|
183
|
|
184 retval += tzoff;
|
|
185
|
|
186 return retval;
|
|
187 }
|
|
188
|