]>
jfr.im git - solanum.git/blob - librb/src/ratbox_lib.c
2 * ircd-ratbox: A slightly useful ircd.
3 * ratbox_lib.c: libircd initialization functions at the like
5 * Copyright (C) 2005,2006 ircd-ratbox development team
6 * Copyright (C) 2005,2006 Aaron Sethman <androsyn@ratbox.org>
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
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
23 * $Id: ratbox_lib.c 26282 2008-12-10 20:33:21Z androsyn $
26 #include <libratbox_config.h>
27 #include <ratbox_lib.h>
28 #include <commio-int.h>
29 #include <commio-ssl.h>
31 static log_cb
*rb_log
;
32 static restart_cb
*rb_restart
;
33 static die_cb
*rb_die
;
35 static struct timeval rb_time
;
36 static char errbuf
[512];
38 /* this doesn't do locales...oh well i guess */
40 static const char *months
[] = {
41 "January", "February", "March", "April",
42 "May", "June", "July", "August",
43 "September", "October", "November", "December"
46 static const char *weekdays
[] = {
47 "Sunday", "Monday", "Tuesday", "Wednesday",
48 "Thursday", "Friday", "Saturday"
51 static const char *s_month
[] = {
52 "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
53 "Aug", "Sep", "Oct", "Nov", "Dec"
56 static const char *s_weekdays
[] = {
57 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
61 rb_ctime(const time_t t
, char *buf
, size_t len
)
65 static char timex
[128];
67 #if defined(HAVE_GMTIME_R)
69 tp
= gmtime_r(&t
, &tmr
);
84 if(rb_unlikely(tp
== NULL
))
86 rb_strlcpy(p
, "", tlen
);
90 snprintf(p
, tlen
, "%s %s %d %02u:%02u:%02u %d",
91 s_weekdays
[tp
->tm_wday
], s_month
[tp
->tm_mon
],
92 tp
->tm_mday
, tp
->tm_hour
, tp
->tm_min
, tp
->tm_sec
, tp
->tm_year
+ 1900);
97 /* I hate this..but its sort of ircd standard now.. */
99 rb_date(const time_t t
, char *buf
, size_t len
)
102 #if defined(HAVE_GMTIME_R)
104 gm
= gmtime_r(&t
, &gmbuf
);
109 if(rb_unlikely(gm
== NULL
))
111 rb_strlcpy(buf
, "", len
);
115 snprintf(buf
, len
, "%s %s %d %d -- %02u:%02u:%02u +00:00",
116 weekdays
[gm
->tm_wday
], months
[gm
->tm_mon
], gm
->tm_mday
,
117 gm
->tm_year
+ 1900, gm
->tm_hour
, gm
->tm_min
, gm
->tm_sec
);
122 rb_current_time(void)
124 return rb_time
.tv_sec
;
127 const struct timeval
*
128 rb_current_time_tv(void)
134 rb_lib_log(const char *format
, ...)
139 va_start(args
, format
);
140 vsnprintf(errbuf
, sizeof(errbuf
), format
, args
);
146 rb_lib_die(const char *format
, ...)
151 va_start(args
, format
);
152 vsnprintf(errbuf
, sizeof(errbuf
), format
, args
);
158 rb_lib_restart(const char *format
, ...)
161 if(rb_restart
== NULL
)
163 va_start(args
, format
);
164 vsnprintf(errbuf
, sizeof(errbuf
), format
, args
);
173 struct timeval newtime
;
175 if(rb_unlikely(rb_gettimeofday(&newtime
, NULL
) == -1))
177 rb_lib_log("Clock Failure (%s)", strerror(errno
));
178 rb_lib_restart("Clock Failure");
181 if(newtime
.tv_sec
< rb_time
.tv_sec
)
182 rb_set_back_events(rb_time
.tv_sec
- newtime
.tv_sec
);
184 memcpy(&rb_time
, &newtime
, sizeof(struct timeval
));
187 extern const char *libratbox_serno
;
192 static char version_info
[512];
194 rb_get_ssl_info(ssl_info
, sizeof(ssl_info
));
195 snprintf(version_info
, sizeof(version_info
), "libratbox version: %s - %s", libratbox_serno
, ssl_info
);
200 rb_lib_init(log_cb
* ilog
, restart_cb
* irestart
, die_cb
* idie
, int closeall
, int maxcon
,
201 size_t dh_size
, size_t fd_heap_size
)
205 rb_restart
= irestart
;
209 rb_fdlist_init(closeall
, maxcon
, fd_heap_size
);
211 rb_init_rb_dlink_nodes(dh_size
);
212 if(rb_io_supports_event())
219 rb_lib_loop(long delay
)
224 if(rb_io_supports_event())
237 if((next
= rb_event_next()) > 0)
239 next
-= rb_current_time();
255 #ifndef HAVE_STRTOK_R
257 rb_strtok_r(char *s
, const char *delim
, char **save
)
264 /* Scan leading delimiters. */
265 s
+= strspn(s
, delim
);
274 s
= strpbrk(token
, delim
);
277 *save
= (token
+ strlen(token
));
287 rb_strtok_r(char *s
, const char *delim
, char **save
)
289 return strtok_r(s
, delim
, save
);
294 static const char base64_table
[] =
295 { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
296 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
297 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
298 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
299 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '\0'
302 static const char base64_pad
= '=';
304 static const short base64_reverse_table
[256] = {
305 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
306 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
307 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
308 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
309 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
310 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
311 -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
312 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
313 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
314 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
315 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
316 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
317 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
318 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
319 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
320 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
324 rb_base64_encode(const unsigned char *str
, int length
)
326 const unsigned char *current
= str
;
328 unsigned char *result
;
330 if((length
+ 2) < 0 || ((length
+ 2) / 3) >= (1 << (sizeof(int) * 8 - 2)))
335 result
= rb_malloc(((length
+ 2) / 3) * 5);
340 *p
++ = base64_table
[current
[0] >> 2];
341 *p
++ = base64_table
[((current
[0] & 0x03) << 4) + (current
[1] >> 4)];
342 *p
++ = base64_table
[((current
[1] & 0x0f) << 2) + (current
[2] >> 6)];
343 *p
++ = base64_table
[current
[2] & 0x3f];
351 *p
++ = base64_table
[current
[0] >> 2];
354 *p
++ = base64_table
[((current
[0] & 0x03) << 4) + (current
[1] >> 4)];
355 *p
++ = base64_table
[(current
[1] & 0x0f) << 2];
360 *p
++ = base64_table
[(current
[0] & 0x03) << 4];
370 rb_base64_decode(const unsigned char *str
, int length
, int *ret
)
372 const unsigned char *current
= str
;
373 int ch
, i
= 0, j
= 0, k
;
374 unsigned char *result
;
376 result
= rb_malloc(length
+ 1);
378 while((ch
= *current
++) != '\0' && length
-- > 0)
383 ch
= base64_reverse_table
[ch
];
393 result
[j
++] |= ch
>> 4;
394 result
[j
] = (ch
& 0x0f) << 4;
397 result
[j
++] |= ch
>> 2;
398 result
[j
] = (ch
& 0x03) << 6;