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