2 Copyright (C) 2005 Georgia Public Library Service
3 Bill Erickson <highfalutin@gmail.com>
4 Mike Rylander <mrylander@gmail.com>
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License
8 as published by the Free Software Foundation; either version 2
9 of the License, or (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
21 inline void* safe_malloc( int size ) {
22 void* ptr = (void*) malloc( size );
24 perror("safe_malloc(): Out of Memory" );
27 memset( ptr, 0, size );
32 char** __global_argv = NULL;
33 int __global_argv_size = 0;
35 int init_proc_title( int argc, char* argv[] ) {
41 int len = strlen( __global_argv[i]);
42 bzero( __global_argv[i++], len );
43 __global_argv_size += len;
46 __global_argv_size -= 2;
50 int set_proc_title( char* format, ... ) {
51 VA_LIST_TO_STRING(format);
52 bzero( *(__global_argv), __global_argv_size );
53 return snprintf( *(__global_argv), __global_argv_size, VA_BUF );
57 /* utility method for profiling */
58 double get_timestamp_millis() {
60 gettimeofday(&tv, NULL);
61 double time = (int)tv.tv_sec + ( ((double)tv.tv_usec / 1000000) );
66 /* setting/clearing file flags */
67 int set_fl( int fd, int flags ) {
71 if( (val = fcntl( fd, F_GETFL, 0) ) < 0 ) {
72 fprintf(stderr, "fcntl F_GETFL error");
78 if( fcntl( fd, F_SETFL, val ) < 0 ) {
79 fprintf(stderr, "fcntl F_SETFL error");
85 int clr_fl( int fd, int flags ) {
89 if( (val = fcntl( fd, F_GETFL, 0) ) < 0 ) {
90 fprintf(stderr, "fcntl F_GETFL error" );
96 if( fcntl( fd, F_SETFL, val ) < 0 ) {
97 fprintf( stderr, "fcntl F_SETFL error" );
103 long va_list_size(const char* format, va_list args) {
105 len = vsnprintf(NULL, 0, format, args);
112 char* va_list_to_string(const char* format, ...) {
118 va_copy(a_copy, args);
120 va_start(args, format);
121 len = va_list_size(format, args);
126 va_start(a_copy, format);
127 vsnprintf(buf, len - 1, format, a_copy);
132 // ---------------------------------------------------------------------------------
133 // Flesh out a ubiqitous growing string buffer
134 // ---------------------------------------------------------------------------------
136 growing_buffer* buffer_init(int num_initial_bytes) {
138 if( num_initial_bytes > BUFFER_MAX_SIZE ) return NULL;
140 size_t len = sizeof(growing_buffer);
143 OSRF_MALLOC(gb, len);
145 gb->n_used = 0;/* nothing stored so far */
146 gb->size = num_initial_bytes;
147 OSRF_MALLOC(gb->buf, gb->size + 1);
153 int buffer_fadd(growing_buffer* gb, const char* format, ... ) {
155 if(!gb || !format) return 0;
161 va_copy(a_copy, args);
163 va_start(args, format);
164 len = va_list_size(format, args);
169 va_start(a_copy, format);
170 vsnprintf(buf, len - 1, format, a_copy);
173 return buffer_add(gb, buf);
178 int buffer_add(growing_buffer* gb, char* data) {
179 if(!(gb && data)) return 0;
181 int data_len = strlen( data );
183 if(data_len == 0) return 0;
185 int total_len = data_len + gb->n_used;
187 if( total_len >= gb->size ) {
188 while( total_len >= gb->size ) {
192 if( gb->size > BUFFER_MAX_SIZE ) {
193 fprintf(stderr, "Buffer reached MAX_SIZE of %d", BUFFER_MAX_SIZE );
199 OSRF_MALLOC(new_data, gb->size );
201 strcpy( new_data, gb->buf );
206 strcat( gb->buf, data );
207 gb->n_used = total_len;
212 int buffer_reset( growing_buffer *gb){
213 if( gb == NULL ) { return 0; }
214 if( gb->buf == NULL ) { return 0; }
215 memset( gb->buf, 0, gb->size );
220 int buffer_free( growing_buffer* gb ) {
228 char* buffer_data( growing_buffer *gb) {
229 return strdup( gb->buf );
234 #define OSRF_BUFFER_ADD_CHAR(gb, c)\
237 if(gb->n_used < gb->size - 1)\
238 gb->buf[gb->n_used++] = c;\
240 buffer_add_char(gb, c);\
245 int buffer_add_char(growing_buffer* gb, char c) {
255 char* uescape( const char* string, int size, int full_escape ) {
257 growing_buffer* buf = buffer_init(size + 64);
259 long unsigned int c = 0;
261 while (string[idx]) {
265 if ((string[idx] & 0xF0) == 0xF0) {
268 if( size - idx < 4 ) return NULL;
271 c |= (string[idx] & 0x3F)<<12;
274 c |= (string[idx] & 0x3F)<<6;
277 c |= (string[idx] & 0x3F);
281 buffer_fadd(buf, "\\u%0.4x", c);
283 } else if ((string[idx] & 0xE0) == 0xE0) {
285 if( size - idx < 3 ) return NULL;
288 c |= (string[idx] & 0x3F)<<6;
291 c |= (string[idx] & 0x3F);
295 buffer_fadd(buf, "\\u%0.4x", c);
297 } else if ((string[idx] & 0xC0) == 0xC0) {
300 if( size - idx < 2 ) return NULL;
303 c |= (string[idx] & 0x3F);
307 buffer_fadd(buf, "\\u%0.4x", c);
312 /* escape the usual suspects */
316 OSRF_BUFFER_ADD_CHAR(buf, '\\');
317 OSRF_BUFFER_ADD_CHAR(buf, '"');
321 OSRF_BUFFER_ADD_CHAR(buf, '\\');
322 OSRF_BUFFER_ADD_CHAR(buf, 'b');
326 OSRF_BUFFER_ADD_CHAR(buf, '\\');
327 OSRF_BUFFER_ADD_CHAR(buf, 'f');
331 OSRF_BUFFER_ADD_CHAR(buf, '\\');
332 OSRF_BUFFER_ADD_CHAR(buf, 't');
336 OSRF_BUFFER_ADD_CHAR(buf, '\\');
337 OSRF_BUFFER_ADD_CHAR(buf, 'n');
341 OSRF_BUFFER_ADD_CHAR(buf, '\\');
342 OSRF_BUFFER_ADD_CHAR(buf, 'r');
346 OSRF_BUFFER_ADD_CHAR(buf, c);
350 OSRF_BUFFER_ADD_CHAR(buf, c);
357 char* d = buffer_data(buf);
363 // A function to turn a process into a daemon and set it's process name in ps/top
368 perror("Failed to fork!");
371 } else if (f == 0) { // We're in the child now...
375 } else { // We're in the parent...
380 int stringisnum(char* s) {
381 char* w = (char*) malloc(strlen(s) * sizeof(char*));
391 char* file_to_string(const char* filename) {
393 if(!filename) return NULL;
398 growing_buffer* gb = buffer_init(len);
400 FILE* file = fopen(filename, "r");
402 int l = strlen(filename) + 64;
404 snprintf(b,l,"Unable to open file [%s] in file_to_string()", filename);
409 while(fgets(buf, len - 1, file)) {
416 char* data = buffer_data(gb);
422 char* md5sum( char* text, ... ) {
425 unsigned char digest[16];
429 VA_LIST_TO_STRING(text);
432 for ( i=0 ; i != strlen(VA_BUF) ; i++ )
433 MD5_feed (&ctx, VA_BUF[i]);
435 MD5_stop (&ctx, digest);
443 for ( i=0 ; i<16 ; i++ ) {
444 sprintf(buf, "%02x", digest[i]);
445 strcat( final, buf );
448 return strdup(final);
452 int osrfUtilsCheckFileDescriptor( int fd ) {
462 if( select(fd + 1, &tmpset, NULL, NULL, &tv) == -1 ) {
463 if( errno == EBADF ) return -1;