]>
jfr.im git - irc/rqf/shadowircd.git/blob - libratbox/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
25 #include <libratbox_config.h>
26 #include <ratbox_lib.h>
27 #include <commio-int.h>
28 #include <commio-ssl.h>
30 static log_cb
*rb_log
;
31 static restart_cb
*rb_restart
;
32 static die_cb
*rb_die
;
34 static struct timeval rb_time
;
35 static char errbuf
[512];
37 /* this doesn't do locales...oh well i guess */
39 static const char *months
[] = {
40 "January", "February", "March", "April",
41 "May", "June", "July", "August",
42 "September", "October", "November", "December"
45 static const char *weekdays
[] = {
46 "Sunday", "Monday", "Tuesday", "Wednesday",
47 "Thursday", "Friday", "Saturday"
50 static const char *s_month
[] = {
51 "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
52 "Aug", "Sep", "Oct", "Nov", "Dec"
55 static const char *s_weekdays
[] = {
56 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
60 rb_ctime(const time_t t
, char *buf
, size_t len
)
64 static char timex
[128];
66 #if defined(HAVE_GMTIME_R)
68 tp
= gmtime_r(&t
, &tmr
);
72 if(rb_unlikely(tp
== NULL
))
89 rb_snprintf(p
, tlen
, "%s %s %d %02u:%02u:%02u %d",
90 s_weekdays
[tp
->tm_wday
], s_month
[tp
->tm_mon
],
91 tp
->tm_mday
, tp
->tm_hour
, tp
->tm_min
, tp
->tm_sec
, tp
->tm_year
+ 1900);
96 /* I hate this..but its sort of ircd standard now.. */
98 rb_date(const time_t t
, char *buf
, size_t len
)
101 #if defined(HAVE_GMTIME_R)
103 gm
= gmtime_r(&t
, &gmbuf
);
108 if(rb_unlikely(gm
== NULL
))
110 rb_strlcpy(buf
, "", len
);
114 rb_snprintf(buf
, len
, "%s %s %d %d -- %02u:%02u:%02u +00:00",
115 weekdays
[gm
->tm_wday
], months
[gm
->tm_mon
], gm
->tm_mday
,
116 gm
->tm_year
+ 1900, gm
->tm_hour
, gm
->tm_min
, gm
->tm_sec
);
121 rb_current_time(void)
123 return rb_time
.tv_sec
;
126 const struct timeval
*
127 rb_current_time_tv(void)
133 rb_lib_log(const char *format
, ...)
138 va_start(args
, format
);
139 rb_vsnprintf(errbuf
, sizeof(errbuf
), format
, args
);
145 rb_lib_die(const char *format
, ...)
150 va_start(args
, format
);
151 rb_vsnprintf(errbuf
, sizeof(errbuf
), format
, args
);
157 rb_lib_restart(const char *format
, ...)
160 if(rb_restart
== NULL
)
162 va_start(args
, format
);
163 rb_vsnprintf(errbuf
, sizeof(errbuf
), format
, args
);
171 struct timeval newtime
;
173 if(rb_unlikely(rb_gettimeofday(&newtime
, NULL
) == -1))
175 rb_lib_log("Clock Failure (%s)", strerror(errno
));
176 rb_lib_restart("Clock Failure");
179 if(newtime
.tv_sec
< rb_time
.tv_sec
)
180 rb_set_back_events(rb_time
.tv_sec
- newtime
.tv_sec
);
182 memcpy(&rb_time
, &newtime
, sizeof(struct timeval
));
185 extern const char *libratbox_serno
;
190 static char version_info
[512];
192 rb_get_ssl_info(ssl_info
, sizeof(ssl_info
));
193 rb_snprintf(version_info
, sizeof(version_info
), "libratbox version: %s - %s", libratbox_serno
, ssl_info
);
198 rb_lib_init(log_cb
* ilog
, restart_cb
* irestart
, die_cb
* idie
, int closeall
, int maxcon
,
199 size_t dh_size
, size_t fd_heap_size
)
203 rb_restart
= irestart
;
207 rb_fdlist_init(closeall
, maxcon
, fd_heap_size
);
209 rb_init_rb_dlink_nodes(dh_size
);
210 if(rb_io_supports_event())
217 rb_lib_loop(long delay
)
222 if(rb_io_supports_event())
235 if((next
= rb_event_next()) > 0)
237 next
-= rb_current_time();
253 #ifndef HAVE_STRTOK_R
255 rb_strtok_r(char *s
, const char *delim
, char **save
)
262 /* Scan leading delimiters. */
263 s
+= strspn(s
, delim
);
272 s
= strpbrk(token
, delim
);
275 *save
= (token
+ strlen(token
));
285 rb_strtok_r(char *s
, const char *delim
, char **save
)
287 return strtok_r(s
, delim
, save
);
292 static const char base64_table
[] =
293 { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
294 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
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 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '\0'
300 static const char base64_pad
= '=';
302 static const short base64_reverse_table
[256] = {
303 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
304 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
305 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
306 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
307 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
308 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
309 -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
310 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
311 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
312 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -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
322 rb_base64_encode(const unsigned char *str
, int length
)
324 const unsigned char *current
= str
;
326 unsigned char *result
;
328 if((length
+ 2) < 0 || ((length
+ 2) / 3) >= (1 << (sizeof(int) * 8 - 2)))
333 result
= rb_malloc(((length
+ 2) / 3) * 5);
338 *p
++ = base64_table
[current
[0] >> 2];
339 *p
++ = base64_table
[((current
[0] & 0x03) << 4) + (current
[1] >> 4)];
340 *p
++ = base64_table
[((current
[1] & 0x0f) << 2) + (current
[2] >> 6)];
341 *p
++ = base64_table
[current
[2] & 0x3f];
349 *p
++ = base64_table
[current
[0] >> 2];
352 *p
++ = base64_table
[((current
[0] & 0x03) << 4) + (current
[1] >> 4)];
353 *p
++ = base64_table
[(current
[1] & 0x0f) << 2];
358 *p
++ = base64_table
[(current
[0] & 0x03) << 4];
368 rb_base64_decode(const unsigned char *str
, int length
, int *ret
)
370 const unsigned char *current
= str
;
371 int ch
, i
= 0, j
= 0, k
;
372 unsigned char *result
;
374 result
= rb_malloc(length
+ 1);
376 while((ch
= *current
++) != '\0' && length
-- > 0)
381 ch
= base64_reverse_table
[ch
];
391 result
[j
++] |= ch
>> 4;
392 result
[j
] = (ch
& 0x0f) << 4;
395 result
[j
++] |= ch
>> 2;
396 result
[j
] = (ch
& 0x03) << 6;