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>
34 #define MAX_ERRMSG_LEN 512
36 static int random_fd
= -1;
37 static char errmsg
[MAX_ERRMSG_LEN
];
44 static struct sd_handler shutdown_handlers
[16];
46 static int n_shutdown_handlers
= 0;
49 l2tp_register_shutdown_handler(l2tp_shutdown_func f
, void *data
)
51 if (n_shutdown_handlers
== 16) return -1;
52 shutdown_handlers
[n_shutdown_handlers
].f
= f
;
53 shutdown_handlers
[n_shutdown_handlers
].data
= data
;
54 n_shutdown_handlers
++;
55 return n_shutdown_handlers
;
62 for (i
=0; i
<n_shutdown_handlers
; i
++) {
63 shutdown_handlers
[i
].f(shutdown_handlers
[i
].data
);
73 /**********************************************************************
74 * %FUNCTION: set_errmsg
76 * fmt -- printf format
81 * Sets static errmsg string
82 ***********************************************************************/
84 l2tp_set_errmsg(char const *fmt
, ...)
88 vsnprintf(errmsg
, MAX_ERRMSG_LEN
, fmt
, ap
);
90 errmsg
[MAX_ERRMSG_LEN
-1] = 0;
91 fprintf(stderr
, "Error: %s\n", errmsg
);
93 vsyslog(LOG_ERR
, fmt
, ap
);
96 /**********************************************************************
97 * %FUNCTION: random_init
103 * Sets up random-number generator
104 ***********************************************************************/
106 l2tp_random_init(void)
108 /* Prefer /dev/urandom; fall back on rand() */
109 random_fd
= open("/dev/urandom", O_RDONLY
);
111 srand(time(NULL
) + getpid()*getppid());
116 /**********************************************************************
117 * %FUNCTION: bad random_fill
119 * ptr -- pointer to a buffer
120 * size -- size of buffer
124 * Fills buffer with "size" random bytes. This function is not
125 * cryptographically strong; it's used as a fallback for systems
126 * without /dev/urandom.
127 ***********************************************************************/
129 bad_random_fill(void *ptr
, size_t size
)
131 unsigned char *buf
= ptr
;
133 *buf
++ = rand() & 0xFF;
137 /**********************************************************************
138 * %FUNCTION: random_fill
140 * ptr -- pointer to a buffer
141 * size -- size of buffer
145 * Fills buffer with "size" random bytes.
146 ***********************************************************************/
148 l2tp_random_fill(void *ptr
, size_t size
)
153 unsigned char *buf
= ptr
;
156 bad_random_fill(ptr
, size
);
161 n
= read(random_fd
, buf
+ndone
, nleft
);
165 bad_random_fill(buf
+ndone
, nleft
);
175 fprintf(stderr
, "FATAL: %s\n", errmsg
);
180 /**********************************************************************
181 * %FUNCTION: load_handler
183 * fname -- filename to load
185 * -1 on error, 0 if OK
187 * Dynamically-loads a handler and initializes it. If fname is not
188 * an absolute path name, we load the handler from /usr/lib/l2tp/plugins
189 ***********************************************************************/
191 l2tp_load_handler(EventSelector
*es
,
197 void (*init_fn
)(EventSelector
*);
200 handle
= dlopen(fname
, RTLD_NOW
);
202 snprintf(buf
, sizeof(buf
), "%s/lib/l2tp/%s", PREFIX
, fname
); //2005-04-14 by kanki
203 buf
[sizeof(buf
)-1] = 0;
204 handle
= dlopen(buf
, RTLD_NOW
);
208 l2tp_set_errmsg("Could not dload %s: %s",
213 init
= dlsym(handle
, "handler_init");
216 l2tp_set_errmsg("No handler_init found in %s", fname
);
219 init_fn
= (void (*)(EventSelector
*)) init
;