1 /***********************************************************************
5 * Utility functions for l2tp
7 * Copyright (C) 2002 Roaring Penguin Software Inc.
9 * This software may be distributed under the terms of the GNU General
10 * Public License, Version 2, or (at your option) any later version.
14 ***********************************************************************/
16 static char const RCSID
[] =
17 "$Id: utils.c,v 1.1.48.1 2005/08/08 12:05:25 honor Exp $";
19 #include <sys/types.h>
33 #define MAX_ERRMSG_LEN 512
35 static int random_fd
= -1;
36 static char errmsg
[MAX_ERRMSG_LEN
];
43 static struct sd_handler shutdown_handlers
[16];
45 static int n_shutdown_handlers
= 0;
48 l2tp_register_shutdown_handler(l2tp_shutdown_func f
, void *data
)
50 if (n_shutdown_handlers
== 16) return -1;
51 shutdown_handlers
[n_shutdown_handlers
].f
= f
;
52 shutdown_handlers
[n_shutdown_handlers
].data
= data
;
53 n_shutdown_handlers
++;
54 return n_shutdown_handlers
;
61 for (i
=0; i
<n_shutdown_handlers
; i
++) {
62 shutdown_handlers
[i
].f(shutdown_handlers
[i
].data
);
72 /**********************************************************************
73 * %FUNCTION: set_errmsg
75 * fmt -- printf format
80 * Sets static errmsg string
81 ***********************************************************************/
83 l2tp_set_errmsg(char const *fmt
, ...)
87 vsnprintf(errmsg
, MAX_ERRMSG_LEN
, fmt
, ap
);
89 errmsg
[MAX_ERRMSG_LEN
-1] = 0;
90 fprintf(stderr
, "Error: %s\n", errmsg
);
93 /**********************************************************************
94 * %FUNCTION: random_init
100 * Sets up random-number generator
101 ***********************************************************************/
103 l2tp_random_init(void)
105 /* Prefer /dev/urandom; fall back on rand() */
106 random_fd
= open("/dev/urandom", O_RDONLY
);
108 srand(time(NULL
) + getpid()*getppid());
113 /**********************************************************************
114 * %FUNCTION: bad random_fill
116 * ptr -- pointer to a buffer
117 * size -- size of buffer
121 * Fills buffer with "size" random bytes. This function is not
122 * cryptographically strong; it's used as a fallback for systems
123 * without /dev/urandom.
124 ***********************************************************************/
126 bad_random_fill(void *ptr
, size_t size
)
128 unsigned char *buf
= ptr
;
130 *buf
++ = rand() & 0xFF;
134 /**********************************************************************
135 * %FUNCTION: random_fill
137 * ptr -- pointer to a buffer
138 * size -- size of buffer
142 * Fills buffer with "size" random bytes.
143 ***********************************************************************/
145 l2tp_random_fill(void *ptr
, size_t size
)
150 unsigned char *buf
= ptr
;
153 bad_random_fill(ptr
, size
);
158 n
= read(random_fd
, buf
+ndone
, nleft
);
162 bad_random_fill(buf
+ndone
, nleft
);
172 fprintf(stderr
, "FATAL: %s\n", errmsg
);
177 /**********************************************************************
178 * %FUNCTION: load_handler
180 * fname -- filename to load
182 * -1 on error, 0 if OK
184 * Dynamically-loads a handler and initializes it. If fname is not
185 * an absolute path name, we load the handler from /usr/lib/l2tp/plugins
186 ***********************************************************************/
188 l2tp_load_handler(EventSelector
*es
,
194 void (*init_fn
)(EventSelector
*);
197 handle
= dlopen(fname
, RTLD_NOW
);
199 snprintf(buf
, sizeof(buf
), "%s/lib/l2tp/%s", PREFIX
, fname
); //2005-04-14 by kanki
200 buf
[sizeof(buf
)-1] = 0;
201 handle
= dlopen(buf
, RTLD_NOW
);
205 l2tp_set_errmsg("Could not dload %s: %s",
210 init
= dlsym(handle
, "handler_init");
213 l2tp_set_errmsg("No handler_init found in %s", fname
);
216 init_fn
= (void (*)(EventSelector
*)) init
;