1 /* This file is part of GNU Radius.
2    Copyright (C) 2000,2001,2002,2003,2004,2005,
3    2006,2007,2008 Free Software Foundation, Inc.
4 
5    Written by Sergey Poznyakoff
6 
7    GNU Radius is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    GNU Radius is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with GNU Radius; if not, write to the Free Software Foundation,
19    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20 
21 #ifndef _gnu_radius_radius_h
22 #define _gnu_radius_radius_h
23 
24 #include <radius/types.h>
25 #include <radius/list.h>
26 #include <radius/envar.h>
27 #include <radius/mem.h>
28 #include <radius/dictionary.h>
29 #include <stdarg.h>
30 
31 #ifdef HAVE_SYS_TIME_H
32 # include <sys/time.h>
33 # ifdef TIME_WITH_SYS_TIME
34 #  include <time.h>
35 # endif
36 #else
37 # include <time.h>
38 #endif
39 
40 /* Length of an IPv4 address in 'dotted-quad' representation including
41    null terminator */
42 #define GRAD_IPV4_STRING_LENGTH        16
43 
44 /* Length of a RADIUS request authenticator */
45 #define GRAD_AUTHENTICATOR_LENGTH      16
46 /* Length of an MD5 digest */
47 #define GRAD_MD5_DIGEST_LENGTH         16
48 /* Maximum length of a string that can be carried by a RADIUS A/V pair */
49 #define GRAD_STRING_LENGTH            253
50 /* Length of a CHAP digest string */
51 #define GRAD_CHAP_VALUE_LENGTH         16
52 
53 typedef struct {
54         u_char code;            /* Request code (see RT_ macros below)*/
55         u_char id;              /* Request ID */
56         u_short length;         /* Request length */
57         u_char authenticator[GRAD_AUTHENTICATOR_LENGTH];
58 	                        /* Request authenticator */
59 } grad_packet_header_t;
60 
61 /* Radius data types */
62 #define GRAD_TYPE_INVALID              -1
63 #define GRAD_TYPE_STRING                0
64 #define GRAD_TYPE_INTEGER               1
65 #define GRAD_TYPE_IPADDR                2
66 #define GRAD_TYPE_DATE                  3
67 
68 /* Request types */
69 #define RT_ACCESS_REQUEST               1
70 #define RT_ACCESS_ACCEPT                2
71 #define RT_ACCESS_REJECT                3
72 #define RT_ACCOUNTING_REQUEST           4
73 #define RT_ACCOUNTING_RESPONSE          5
74 #define RT_ACCOUNTING_STATUS            6
75 #define RT_PASSWORD_REQUEST             7
76 #define RT_PASSWORD_ACK                 8
77 #define RT_PASSWORD_REJECT              9
78 #define RT_ACCOUNTING_MESSAGE           10
79 #define RT_ACCESS_CHALLENGE             11
80 #define RT_STATUS_SERVER                12
81 #define RT_STATUS_CLIENT                13
82 
83 /* These are not implemented yet */
84 #define RT_ASCEND_TERMINATE_SESSION     31
85 #define RT_ASCEND_EVENT_REQUEST         33
86 #define RT_ASCEND_EVENT_RESPONSE        34
87 #define RT_ASCEND_ALLOCATE_IP           51
88 #define RT_ASCEND_RELEASE_IP            52
89 
90 /* Basic structures */
91 
92 enum grad_operator {
93         grad_operator_equal = 0,             /* = */
94         grad_operator_not_equal,             /* != */
95         grad_operator_less_than,             /* < */
96         grad_operator_greater_than,          /* > */
97         grad_operator_less_equal,            /* <= */
98         grad_operator_greater_equal,         /* >= */
99 	grad_operator_invalid                /* Invalid operator */
100 #define GRAD_NUM_OPERATORS grad_operator_invalid /* number of operators */
101 };
102 
103 /* ************************** Data structures ****************************** */
104 
105 #define GRAD_MAX_DICTNAME  32
106 #define GRAD_MAX_SECRETLEN 32
107 #define GRAD_MAX_REALMNAME 256
108 #define GRAD_MAX_LONGNAME  256
109 #define GRAD_MAX_SHORTNAME 32
110 
111 /* Attribute flags and properties:
112 
113     0                   1                   2                   3
114     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
115    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
116    | A | E |   P   | LHS | RHS |     USER FLAGS    |               |
117    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
118 
119    A - Additivity bits
120    E - Encryption bits
121    P - Property flags
122    LHS - Syntax flags for LHS
123    RHS - Syntax flags for RHS
124 
125    Bits 7 and 24-31 are unused */
126 
127 /* Attribute properties */
128 #define GRAD_AP_ADD_REPLACE   0
129 #define GRAD_AP_ADD_APPEND    1
130 #define GRAD_AP_ADD_NONE      2
131 
132 /* Encryption bits */
133 #define GRAD_AP_ENCRYPT_RFC2138 0x4 /* Encrypted per RFC 2138 */
134 #define GRAD_AP_ENCRYPT_RFC2868 0x8 /* Encrypted per RFC 2868 */
135 
136 #define GRAD_AP_ENCRYPT (GRAD_AP_ENCRYPT_RFC2138|GRAD_AP_ENCRYPT_RFC2868)
137 
138 #define GRAD_AP_PROPAGATE     0x10 /* Propagate attribute through the proxy
139 				      chain */
140 #define GRAD_AP_INTERNAL      0x20 /* Internal attribute. */
141 #define GRAD_AP_BINARY_STRING 0x40 /* Binary string value. No str..()
142 				      functions should be used */
143 #define GRAD_AP_TRANSLATE     0x80 /* Attribute has dictionary translations */
144 
145 #define GRAD_AP_USER_FLAG(n) (0x4000<<(n))
146 
147 #define GRAD_GET_ADDITIVITY(val) ((val) & 0x3)
148 #define GRAD_SET_ADDITIVITY(val,a) ((val) = ((val) & ~0x3) | (a))
149 
150 /* Configuration files types */
151 #define GRAD_CF_USERS      0
152 #define GRAD_CF_HINTS      1
153 #define GRAD_CF_HUNTGROUPS 2
154 #define GRAD_CF_MAX        3
155 
156 #define GRAD_AF_LHS(cf) (0x0100<<(cf))
157 #define GRAD_AF_RHS(cf) (0x0800<<(cf))
158 
159 #define GRAD_AF_DEFAULT_FLAGS (GRAD_AF_LHS(0)|GRAD_AF_LHS(1)|GRAD_AF_LHS(2)\
160                                |GRAD_AF_RHS(0)|GRAD_AF_RHS(1)|GRAD_AF_RHS(2))
161 #define GRAD_AP_DEFAULT_ADD   GRAD_AP_ADD_APPEND
162 
163 
164 #define GRAD_PORT_AUTH 0
165 #define GRAD_PORT_ACCT 1
166 #define GRAD_PORT_MAX  2
167 
168 typedef struct {
169 	char *file;             /* File name */
170 	size_t line;            /* Line number */
171 } grad_locus_t;
172 
173 typedef struct {
174 	grad_uint32_t addr;     /* Server IP address */
175 	u_char id;              /* Current id */
176 } grad_server_id_t;
177 
178 typedef struct netdef grad_netdef_t;
179 struct netdef {
180         grad_uint32_t ipaddr;        /* IP address */
181         grad_uint32_t netmask;       /* Network mask */
182 };
183 
184 typedef struct radius_server grad_server_t;
185 struct radius_server {
186         char   *name;           /* Symbolic name of this server */
187         grad_uint32_t addr;     /* IP address of it */
188         int    port[GRAD_PORT_MAX];  /* Ports to use */
189         char   *secret;         /* Shared secret */
190 	off_t  id_offset;       /* Offset of the grad_server_id_t in the id
191 				   file */
192 };
193 
194 typedef struct {
195         grad_uint32_t source_ip; /* Source IP address for xmits */
196         unsigned timeout;        /* Amount of time to wait for the response */
197         unsigned retries;        /* Number of re-sends to each server before
198 				    giving up */
199 	size_t buffer_size;      /* Size of the recv buffer */
200         grad_list_t   *servers;  /* List of servers */
201 } grad_server_queue_t;
202 
203 struct grad_value_pair;
204 typedef int (*grad_attr_parser_fp)(struct grad_value_pair *p, char **s);
205 
206 /* Dictionary attribute */
207 
208 typedef struct dict_attr grad_dict_attr_t;
209 struct dict_attr {
210         char   *name;          /* Attribute name */
211 	int    value;          /* Attribute value */
212 	int    type;           /* Data type */
213 	int    vendor;         /* Vendor index */
214 	int    prop;           /* Properties */
215 	grad_attr_parser_fp parser; /* Not-NULL for "abinary" */
216 };
217 
218 /* Dictionary value */
219 typedef struct dict_value {
220         char *name;             /* Symbolic name */
221         grad_dict_attr_t *attr; /* Attribute for which this value is defined */
222         int value;              /* Numeric value */
223 } grad_dict_value_t;
224 
225 /* Dictionary vendor information */
226 typedef struct dict_vendor {
227         char *vendorname;       /* Symbolic name */
228         int  vendorpec;         /* PEC */
229         int  vendorcode;        /* Internal code of this vendor */
230 } grad_dict_vendor_t;
231 
232 /* Attribute evaluation type */
233 enum grad_avp_eval_type {
234 	grad_eval_const,     /* Value is a constant */
235 	grad_eval_interpret, /* avp_strvalue contains a Rewrite expression that
236 				must be interpreted */
237 	grad_eval_compiled   /* avp_strvalue contains a symbolic name of a
238 				compiled Rewrite expression. Use rewrite_eval()
239 				to evaluate it */
240 };
241 
242 typedef struct grad_string {
243 	size_t size;
244 	char *data;
245 } grad_string_t;
246 
247 typedef union grad_datum {
248 	grad_uint32_t   ival;       /* integer value */
249 	grad_string_t   sval;       /* string value */
250 } grad_datum_t;
251 
252 /* An attribute/value pair */
253 typedef struct grad_value_pair {
254         struct grad_value_pair  *next;      /* Link to next A/V pair in list */
255         char                    *name;      /* Attribute name */
256         int                     attribute;  /* Attribute value */
257         int                     type;       /* Data type */
258         enum grad_avp_eval_type eval_type;  /* Evaluation flag */
259         int                     prop;       /* Properties */
260         enum grad_operator operator;        /* Comparison operator */
261 	grad_datum_t            datum;      /* Actual data */
262 
263 #define avp_lvalue datum.ival
264 #define avp_strvalue datum.sval.data
265 #define avp_strlength datum.sval.size
266 
267 } grad_avp_t;
268 
269 typedef struct grad_nas {
270 	grad_netdef_t netdef;
271         char longname[GRAD_MAX_LONGNAME+1];
272         char shortname[GRAD_MAX_SHORTNAME+1];
273         char nastype[GRAD_MAX_DICTNAME+1];
274         grad_envar_t *args;
275         void *app_data;
276 } grad_nas_t;
277 
278 typedef struct grad_realm {
279         char realm[GRAD_MAX_REALMNAME+1];
280 	grad_envar_t *args;
281 	grad_server_queue_t *queue;
282 } grad_realm_t;
283 
284 typedef struct grad_request {
285         grad_uint32_t ipaddr;       /* Source IP address */
286         u_short       udp_port;     /* Source port */
287         u_char        id;           /* Request identifier */
288         u_char        code;         /* Request code */
289         u_char        authenticator[GRAD_AUTHENTICATOR_LENGTH];
290 	                            /* Request authenticator */
291         u_char        *secret;      /* Shared secret */
292         grad_avp_t    *avlist;      /* Request pairs */
293 } grad_request_t;
294 
295 typedef struct grad_keyword grad_keyword_t;
296 struct grad_keyword {
297         char *name;
298         int tok;
299 };
300 
301 typedef struct grad_matching_rule grad_matching_rule_t;
302 struct grad_matching_rule {
303         char *name;
304         grad_avp_t *lhs;
305         grad_avp_t *rhs;
306 	grad_locus_t loc;
307 };
308 
309 /* External variables */
310 
311 extern char *grad_config_dir;
312 extern char *grad_log_dir;
313 extern char *grad_acct_dir;
314 extern char *grad_utmp_file;
315 extern char *grad_wtmp_file;
316 extern char *grad_stat_file;
317 extern char *grad_msgid_file;
318 extern char *grad_pid_dir;
319 extern char *grad_bug_report_address;
320 extern int grad_source_info_option;
321 
322 /* Parser */
323 extern grad_locus_t grad_parser_source_locus;
324 
325 int grad_parser_lex_init(char *name);
326 void grad_parser_lex_finish();
327 int grad_parser_lex_sync();
328 
329 #define GRAD_NITEMS(a) sizeof(a)/sizeof((a)[0])
330 
331 size_t grad_create_pdu(void **rptr, int code, int id,
332 		       u_char *authenticator, u_char *secret,
333 		       grad_avp_t *pairlist, char *msg);
334 
335 grad_request_t *grad_decode_pdu(grad_uint32_t host,
336 				u_short udp_port, u_char *buffer,
337 				size_t length);
338 
339 int grad_server_send_reply(int fd, grad_request_t *radreq,
340 			   int reply_code, grad_avp_t *reply_pairs,
341 			   char *reply_msg);
342 int grad_server_send_challenge(int fd, grad_request_t *radreq,
343 			       grad_avp_t *reply_pairs, char *msg,
344 			       char *state);
345 
346 
347 /* dict.c */
348 #define GRAD_VENDOR_CODE(x) (x >> 16)
349 #define GRAD_VSA_ATTR_NUMBER(attrno,code) ((attrno) | (code) << 16)
350 
351 int grad_dict_init();
352 void grad_dict_free();
353 grad_dict_attr_t *grad_attr_number_to_dict(int);
354 grad_dict_attr_t *grad_attr_name_to_dict(const char *);
355 grad_dict_value_t *grad_value_name_to_value(const char *, int);
356 grad_dict_value_t *grad_value_lookup(grad_uint32_t, char *);
357 int grad_vendor_id_to_pec(int);
358 int grad_vendor_pec_to_id(int);
359 char *grad_vendor_pec_to_name(int);
360 int grad_vendor_name_to_id(char *);
361 
362 typedef int (*dict_iterator_fp)(void *data,
363 				char const *, grad_dict_attr_t const *);
364 void grad_dictionary_iterate(dict_iterator_fp fp, void *closure);
365 
366 typedef int (*dict_value_iterator_fp)(void *, grad_dict_value_t*);
367 void grad_dictionary_value_iterate(dict_value_iterator_fp fp, void *closure);
368 
369 /* md5crypt.c */
370 char *grad_md5crypt(const char *pw, const char *salt, char *pwbuf,
371 		    size_t pwlen);
372 
373 /* avl.c */
374 grad_avp_t *grad_avp_alloc();
375 void grad_avp_free();
376 void grad_avl_free(grad_avp_t *);
377 grad_avp_t *grad_avl_find(grad_avp_t *, int);
378 grad_avp_t *grad_avl_find_n(grad_avp_t *, int, int);
379 void grad_avl_delete(grad_avp_t **, int);
380 void grad_avl_delete_n(grad_avp_t **first, int attr, int n);
381 void grad_avl_add_list(grad_avp_t **, grad_avp_t *);
382 void grad_avl_add_pair(grad_avp_t **, grad_avp_t *);
383 grad_avp_t *grad_avl_dup(grad_avp_t *from);
384 grad_avp_t *grad_avp_dup(grad_avp_t *vp);
385 void grad_avl_merge(grad_avp_t **dst_ptr, grad_avp_t **src_ptr);
386 grad_avp_t *grad_avp_create(int attr);
387 grad_avp_t *grad_avp_create_integer(int attr, grad_uint32_t value);
388 grad_avp_t *grad_avp_create_string(int attr, char *value);
389 grad_avp_t *grad_avp_create_binary(int attr, int length, u_char *value);
390 void grad_avl_move_attr(grad_avp_t **to, grad_avp_t **from, int attr);
391 void grad_avl_move_pairs(grad_avp_t **to, grad_avp_t **from,
392 			 int (*fun)(void *, grad_avp_t *), void *closure);
393 int grad_avp_cmp(grad_avp_t *a, grad_avp_t *b);
394 int grad_avl_cmp(grad_avp_t *a, grad_avp_t *b, int prop);
395 int grad_avp_null_string_p(grad_avp_t *pair);
396 
397 extern int grad_resolve_hostnames;
398 
399 char *grad_ip_gethostname (grad_uint32_t, char *buf, size_t size);
400 grad_uint32_t grad_ip_gethostaddr (const char *);
401 char *grad_ip_iptostr(grad_uint32_t, char *);
402 grad_uint32_t grad_ip_strtoip(const char *);
403 int grad_ip_getnetaddr(const char *str, grad_netdef_t *netdef);
404 int grad_ip_in_net_p(const grad_netdef_t *netdef, grad_uint32_t ipaddr);
405 
406 /* nas.c */
407 grad_iterator_t *grad_nas_iterator();
408 int grad_nas_read_file(char *file);
409 grad_nas_t *grad_nas_lookup_name(char *name);
410 grad_nas_t *grad_nas_lookup_ip(grad_uint32_t ipaddr);
411 char *grad_nas_ip_to_name(grad_uint32_t ipaddr, char *buf, size_t size);
412 grad_nas_t *grad_nas_request_to_nas(const grad_request_t *radreq);
413 char *grad_nas_request_to_name(const grad_request_t *radreq, char *buf, size_t size);
414 
415 /* realms.c */
416 grad_realm_t *grad_realm_lookup_name(char *name);
417 grad_realm_t *grad_realm_lookup_ip(grad_uint32_t ip);
418 int grad_read_realms(char *filename, int auth_port, int acct_port,
419 		     int (*set_secret)());
420 int grad_realm_verify_ip(grad_realm_t *realm, grad_uint32_t ip);
421 int grad_realm_strip_p(grad_realm_t *r);
422 size_t grad_realm_get_quota(grad_realm_t *r);
423 grad_request_t *grad_request_alloc();
424 
425 /* raddb.c */
426 int grad_read_raddb_file(char *name, int vital,
427 			 char *delim,
428 			 int (*fun)(void*,int,char**,grad_locus_t*),
429 			 void *closure);
430 
431 /* radpaths.c */
432 void grad_path_init();
433 
434 /* users.y */
435 typedef int (*register_rule_fp) (void *, grad_locus_t *, char *,
436 				 grad_avp_t *, grad_avp_t *);
437 int grad_parse_rule_file(char *file, void *c, register_rule_fp f);
438 int grad_parse_time_string(char *valstr, struct tm *tm);
439 grad_avp_t *grad_create_pair(grad_locus_t *loc, char *name,
440 			     enum grad_operator op, char *valstr);
441 
442 
443 /* util.c */
444 void grad_request_free(grad_request_t *radreq);
445 void grad_lock_file(int fd, size_t size, off_t off, int whence);
446 void grad_unlock_file(int fd, size_t size, off_t off, int whence);
447 char *grad_mkfilename(char *, char*);
448 char *grad_mkfilename3(char *dir, char *subdir, char *name);
449 int grad_decode_backslash(int c);
450 void grad_string_copy(char *d, char *s, int  len);
451 #define GRAD_STRING_COPY(s,d) grad_string_copy(s,d,sizeof(s)-1)
452 char *grad_format_pair(grad_avp_t *pair, int typeflag, char **save);
453 int grad_format_string_visual(char *buf, int runlen, char *str, int len);
454 char *grad_op_to_str(enum grad_operator op);
455 enum grad_operator grad_str_to_op(char *str);
456 int grad_xlat_keyword(grad_keyword_t *kw, const char *str, int def);
457 int grad_astrcat(char **pptr, ...);
458 
459 struct timeval;
460 int grad_recompute_timeout(struct timeval *start, struct timeval *tval);
461 
462 /* c-strcase.c */
463 int grad_c_strcasecmp(const char *a, const char *b);
464 int grad_c_strncasecmp(const char *a, const char *b, size_t n);
465 
466 /* cryptpass.c */
467 void grad_encrypt_password(grad_avp_t *pair, char *password,
468 			   char *authenticator, char *secret);
469 void grad_decrypt_password(char *password, grad_avp_t *pair,
470 			   char *authenticator, char *secret);
471 void grad_decrypt_password_broken(char *password, grad_avp_t *pair,
472 				  char *authenticator, char *secret);
473 void grad_encrypt_tunnel_password(grad_avp_t *pair, u_char tag, char *password,
474 				  char *authenticator, char *secret);
475 void grad_decrypt_tunnel_password(char *password, u_char *tag,
476 				  grad_avp_t *pair,
477 				  char *authenticator, char *secret);
478 
479 /* gethost_r.c */
480 struct hostent *grad_gethostbyname_r(const char *name, struct hostent *result,
481 				     char *buffer, int buflen, int *h_errnop);
482 struct hostent *grad_gethostbyaddr_r(const char *addr, int length,
483 				     int type, struct hostent *result,
484 				     char *buffer, int buflen, int *h_errnop);
485 
486 struct passwd *grad_getpwnam_r(const char *name, struct passwd *result,
487 			       char *buffer, int buflen);
488 struct group *grad_getgrnam(const char *name);
489 
490 /* client.c */
491 #define RADCLT_ID            0x1
492 #define RADCLT_AUTHENTICATOR 0x2
493 
494 grad_request_t *grad_client_send0(grad_server_queue_t *config,
495 				  int port_type, int code,
496 				  grad_avp_t *pairlist, int flags, int *authid,
497 				  u_char *authvec);
498 grad_request_t *grad_client_send(grad_server_queue_t *config,
499 				 int port_type, int code,
500 				 grad_avp_t *pairlist);
501 unsigned grad_client_message_id(grad_server_t *server);
502 grad_server_queue_t *grad_client_create_queue(int read_cfg,
503 					      grad_uint32_t source_ip,
504 					      size_t bufsize);
505 void grad_client_destroy_queue(grad_server_queue_t *queue);
506 grad_server_t *grad_client_alloc_server(grad_server_t *src);
507 grad_server_t *grad_client_dup_server(grad_server_t *src);
508 
509 void grad_client_free_server(grad_server_t *server);
510 void grad_client_append_server(grad_server_queue_t *qp, grad_server_t *server);
511 void grad_client_clear_server_list(grad_server_queue_t *qp);
512 grad_server_t *grad_client_find_server(grad_server_queue_t *qp, char *name);
513 void grad_client_random_authenticator(char *authenticator);
514 grad_avp_t *grad_client_encrypt_pairlist(grad_avp_t *plist,
515 					 u_char *authenticator, u_char *secret);
516 grad_avp_t *grad_client_decrypt_pairlist(grad_avp_t *plist,
517 					 u_char *authenticator, u_char *secret);
518 
519 /* log.c */
520 char *rad_print_request(grad_request_t *req, char *outbuf, size_t size);
521 
522 /* ascend.c */
523 int grad_ascend_parse_filter(grad_avp_t *pair, char **errp);
524 
525 /* intl.c */
526 void grad_app_setup();
527 
528 /* Logging */
529 /* The category.priority system below is constructed after that
530    in <syslog.h> */
531 
532 /* log categories */
533 #define GRAD_LOG_MKCAT(n)       ((n)<<3)
534 #define GRAD_LOG_MAIN           GRAD_LOG_MKCAT(1)  /* Main server process */
535 #define GRAD_LOG_AUTH           GRAD_LOG_MKCAT(2)  /* Authentication process */
536 #define GRAD_LOG_ACCT           GRAD_LOG_MKCAT(3)  /* Accounting process */
537 #define GRAD_LOG_PROXY          GRAD_LOG_MKCAT(4)  /* Proxy */
538 #define GRAD_LOG_SNMP           GRAD_LOG_MKCAT(5)  /* SNMP process */
539 #define GRAD_LOG_NCAT           8           /* Number of categories */
540 #define GRAD_LOG_CATMASK        0x38        /* Mask to extract category part */
541 
542 /* log priorities */
543 #define GRAD_LOG_EMERG    0    /* system is unusable */
544 #define GRAD_LOG_ALERT    1    /* action must be taken immediately */
545 #define GRAD_LOG_CRIT     2    /* critical conditions */
546 #define GRAD_LOG_ERR      3    /* error conditions */
547 #define GRAD_LOG_WARN     4    /* warning conditions */
548 #define GRAD_LOG_NOTICE   5    /* normal but signification condition */
549 #define GRAD_LOG_INFO     6    /* informational */
550 #define GRAD_LOG_DEBUG    7    /* debug-level messages */
551 #define GRAD_LOG_PRIMASK  0x0007  /* mask to extract priority part */
552 
553 #define GRAD_LOG_CAT(v)   (((v)&GRAD_LOG_CATMASK)>>3)
554 #define GRAD_LOG_PRI(v)   ((v)&GRAD_LOG_PRIMASK)
555 #define GRAD_LOG_MASK(pri) (1<<(pri))
556 #define GRAD_LOG_UPTO(pri) ((1<<((pri)+1))-1)
557 /* Additional flags */
558 #define GRAD_LOG_PERROR  0x8000
559 
560 #define GRAD_MKSTRING(x) #x
561 #define grad_insist(cond) \
562  ((void) ((cond) || \
563  __grad_insist_failure(GRAD_MKSTRING(cond), __FILE__, __LINE__)))
564 #define grad_insist_fail(str) \
565  __grad_insist_failure(GRAD_MKSTRING(str), __FILE__, __LINE__)
566 
567 /* Function prototypes */
568 typedef void (*grad_logger_fp) (int lvl,
569 				const grad_request_t *req,
570 				const grad_locus_t *loc,
571 				const char *func_name,
572 				int en,
573 				const char *fmt,
574 				va_list ap);
575 grad_logger_fp grad_set_logger(grad_logger_fp fp);
576 void grad_default_logger(int level,  const grad_request_t *req,
577 			 const grad_locus_t *loc,
578 			 const char *func_name, int en,
579 			 const char *fmt, va_list ap);
580 
581 void grad_log(int level, const char *fmt, ...);
582 int __grad_insist_failure(const char *, const char *, int);
583 void grad_log_req(int level, grad_request_t *req, const char *fmt, ...);
584 void grad_log_loc(int lvl, grad_locus_t *loc, const char *msg, ...);
585 
586 /* sysdep.h */
587 int grad_set_nonblocking(int fd);
588 int grad_max_fd();
589 grad_uint32_t grad_first_ip();
590 
591 /* Loadable Modules Suppert */
592 #define __s_cat3__(a,b,c) a ## b ## c
593 #define GRAD_DL_EXPORT(module,name) __s_cat3__(module,_LTX_,name)
594 
595 typedef int (*grad_dl_init_t) (void);
596 typedef void (*grad_dl_done_t) (void);
597 
598 /* slist.c */
599 #define GRAD_SLIST_BUCKET_SIZE 1024
600 
601 typedef struct grad_slist *grad_slist_t;
602 
603 grad_slist_t grad_slist_create(void);
604 void grad_slist_clear(grad_slist_t slist);
605 void grad_slist_free(grad_slist_t *slist);
606 void grad_slist_append(grad_slist_t slist, void *str, size_t n);
607 void grad_slist_append_char(grad_slist_t slist, char c);
608 size_t grad_slist_size(grad_slist_t slist);
609 size_t grad_slist_coalesce(grad_slist_t slist);
610 void *grad_slist_finish(grad_slist_t slist);
611 void *grad_slist_head(grad_slist_t slist, size_t *psize);
612 void grad_slist_grow_backslash_num(grad_slist_t slist, char *text, char **pend,
613 				   int len, int base);
614 void grad_slist_grow_backslash(grad_slist_t slist, char *text, char **endp);
615 
616 /* *tostr.c */
617 size_t grad_inttostr(int, char *, size_t);
618 size_t grad_longtostr(int, char *, size_t);
619 size_t grad_offtostr(int, char *, size_t);
620 size_t grad_sizetostr(int, char *, size_t);
621 size_t grad_uinttostr(int, char *, size_t);
622 size_t grad_ulongtostr(int, char *, size_t);
623 
624 #endif /* !_gnu_radius_radius_h */
625