X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Finclude%2Fradiusd.h;h=92a363b90946ffc05046c31466e95e6d8b00239d;hb=e2eaf9194b16fdd15ebf274aafd05edc9fefb4bb;hp=524254bdf7cf29fc076027477d1695c65b0b2f2a;hpb=f5150361df8cd68b309f93e66f834065f7589f5e;p=freeradius.git diff --git a/src/include/radiusd.h b/src/include/radiusd.h index 524254b..92a363b 100644 --- a/src/include/radiusd.h +++ b/src/include/radiusd.h @@ -89,12 +89,24 @@ typedef struct auth_req REQUEST; #ifndef WITHOUT_COMMAND_SOCKET #ifdef HAVE_SYS_UN_H #define WITH_COMMAND_SOCKET (1) +#else +#define WITHOUT_COMMAND_SOCKET (1) +#endif +#endif + +#ifndef WITHOUT_COA +#define WITH_COA (1) +#ifndef WITH_PROXY +#error WITH_COA requires WITH_PROXY #endif #endif #include #include +#ifdef __cplusplus +extern "C" { +#endif /* * See util.c @@ -121,12 +133,25 @@ typedef struct radclient { #endif #endif + int proto; +#ifdef WITH_TCP + int max_connections; + int num_connections; +#endif + #ifdef WITH_DYNAMIC_CLIENTS int lifetime; int dynamic; /* was dynamically defined */ time_t created; time_t last_new_client; char *client_server; + int rate_limit; +#endif + +#ifdef WITH_COA + char *coa_name; + home_server *coa_server; + home_pool_t *coa_pool; #endif } RADCLIENT; @@ -156,6 +181,9 @@ typedef enum RAD_LISTEN_TYPE { #ifdef WITH_COMMAND_SOCKET RAD_LISTEN_COMMAND, #endif +#ifdef WITH_COA + RAD_LISTEN_COA, +#endif RAD_LISTEN_MAX } RAD_LISTEN_TYPE; @@ -193,7 +221,7 @@ struct auth_req { pthread_t child_pid; #endif time_t timestamp; - int number; /* internal server number */ + unsigned int number; /* internal server number */ rad_listen_t *listener; #ifdef WITH_PROXY @@ -239,6 +267,10 @@ struct auth_req { const char *server; REQUEST *parent; radlog_func_t radlog; /* logging function, if set */ +#ifdef WITH_COA + REQUEST *coa; + int num_coa_requests; +#endif }; /* REQUEST typedef */ #define RAD_REQUEST_OPTION_NONE (0) @@ -278,7 +310,7 @@ typedef struct pair_list { typedef int (*rad_listen_recv_t)(rad_listen_t *, RAD_REQUEST_FUNP *, REQUEST **); typedef int (*rad_listen_send_t)(rad_listen_t *, REQUEST *); -typedef int (*rad_listen_print_t)(rad_listen_t *, char *, size_t); +typedef int (*rad_listen_print_t)(const rad_listen_t *, char *, size_t); typedef int (*rad_listen_encode_t)(rad_listen_t *, REQUEST *); typedef int (*rad_listen_decode_t)(rad_listen_t *, REQUEST *); @@ -292,6 +324,9 @@ struct rad_listen_t { int fd; const char *server; int status; +#ifdef WITH_TCP + int count; +#endif rad_listen_recv_t recv; rad_listen_send_t send; @@ -306,10 +341,50 @@ struct rad_listen_t { #endif }; +/* + * This shouldn't really be exposed... + */ +typedef struct listen_socket_t { + /* + * For normal sockets. + */ + fr_ipaddr_t my_ipaddr; + int my_port; + + const char *interface; +#ifdef SO_BROADCAST + int broadcast; +#endif + + /* for outgoing sockets */ + home_server *home; + fr_ipaddr_t other_ipaddr; + int other_port; + + int proto; + +#ifdef WITH_TCP + /* for a proxy connecting to home servers */ + time_t last_packet; + time_t opened; + fr_event_t *ev; + + /* for clients connecting to the server */ + int max_connections; + int num_connections; + struct listen_socket_t *parent; + RADCLIENT *client; + + RADIUS_PACKET *packet; /* for reading partial packets */ +#endif + RADCLIENT_LIST *clients; +} listen_socket_t; + #define RAD_LISTEN_STATUS_INIT (0) #define RAD_LISTEN_STATUS_KNOWN (1) -#define RAD_LISTEN_STATUS_CLOSED (2) -#define RAD_LISTEN_STATUS_FINISH (3) +#define RAD_LISTEN_STATUS_REMOVE_FD (2) +#define RAD_LISTEN_STATUS_CLOSED (3) +#define RAD_LISTEN_STATUS_FINISH (4) typedef enum radlog_dest_t { RADLOG_STDOUT = 0, @@ -330,7 +405,9 @@ typedef struct main_config_t { int log_auth_goodpass; int allow_core_dumps; int debug_level; +#ifdef WITH_PROXY int proxy_requests; +#endif int reject_delay; int status_server; int max_request_time; @@ -348,11 +425,14 @@ typedef struct main_config_t { radlog_dest_t radlog_dest; CONF_SECTION *config; const char *name; + const char *auth_badpass_msg; + const char *auth_goodpass_msg; } MAIN_CONFIG_T; #define DEBUG if(debug_flag)log_debug #define DEBUG2 if (debug_flag > 1)log_debug #define DEBUG3 if (debug_flag > 2)log_debug +#define DEBUG4 if (debug_flag > 3)log_debug #if __GNUC__ >= 3 #define RDEBUG(fmt, ...) if(request && request->radlog) request->radlog(L_DBG, 1, request, fmt, ## __VA_ARGS__) @@ -421,7 +501,7 @@ extern int debug_flag; extern const char *radacct_dir; extern const char *radlog_dir; extern const char *radlib_dir; -extern const char *radius_dir; +extern char *radius_dir; extern const char *radius_libdir; extern uint32_t expiration_seconds; extern int log_stripped_names; @@ -467,6 +547,7 @@ int rad_checkfilename(const char *filename); void *rad_malloc(size_t size); /* calls exit(1) on error! */ REQUEST *request_alloc(void); REQUEST *request_alloc_fake(REQUEST *oldreq); +REQUEST *request_alloc_coa(REQUEST *request); int request_data_add(REQUEST *request, void *unique_ptr, int unique_int, void *opaque, void (*free_opaque)(void *)); @@ -488,7 +569,8 @@ void client_delete(RADCLIENT_LIST *clients, RADCLIENT *client); RADCLIENT *client_create(RADCLIENT_LIST *clients, REQUEST *request); #endif RADCLIENT *client_find(const RADCLIENT_LIST *clients, - const fr_ipaddr_t *ipaddr); + const fr_ipaddr_t *ipaddr, int proto); + RADCLIENT *client_findbynumber(const RADCLIENT_LIST *clients, int number); RADCLIENT *client_find_old(const fr_ipaddr_t *ipaddr); @@ -539,10 +621,10 @@ int radius_exec_program(const char *, REQUEST *, int, int timestr_match(char *, time_t); /* valuepair.c */ -int paircompare_register(int attr, int otherattr, +int paircompare_register(unsigned int attr, int otherattr, RAD_COMPARE_FUNC func, void *instance); -void paircompare_unregister(int attr, RAD_COMPARE_FUNC func); +void paircompare_unregister(unsigned int attr, RAD_COMPARE_FUNC func); int paircompare(REQUEST *req, VALUE_PAIR *request, VALUE_PAIR *check, VALUE_PAIR **reply); void pairxlatmove(REQUEST *, VALUE_PAIR **to, VALUE_PAIR **from); @@ -550,9 +632,9 @@ int radius_compare_vps(REQUEST *request, VALUE_PAIR *check, VALUE_PAIR *vp); int radius_callback_compare(REQUEST *req, VALUE_PAIR *request, VALUE_PAIR *check, VALUE_PAIR *check_pairs, VALUE_PAIR **reply_pairs); -int radius_find_compare(int attribute); +int radius_find_compare(unsigned int attribute); VALUE_PAIR *radius_paircreate(REQUEST *request, VALUE_PAIR **vps, - int attribute, int type); + unsigned int attribute, unsigned int vendor, int type); VALUE_PAIR *radius_pairmake(REQUEST *request, VALUE_PAIR **vps, const char *attribute, const char *value, int operator); @@ -569,7 +651,7 @@ void xlat_unregister(const char *module, RAD_XLAT_FUNC func); void xlat_free(void); /* threads.c */ -extern int thread_pool_init(CONF_SECTION *cs, int spawn_flag); +extern int thread_pool_init(CONF_SECTION *cs, int *spawn_flag); extern int thread_pool_addrequest(REQUEST *, RAD_REQUEST_FUNP); extern pid_t rad_fork(void); extern pid_t rad_waitpid(pid_t pid, int *status); @@ -589,18 +671,23 @@ extern struct main_config_t mainconfig; int read_mainconfig(int reload); int free_mainconfig(void); +void hup_mainconfig(void); +void fr_suid_down(void); +void fr_suid_up(void); +void fr_suid_down_permanent(void); /* listen.c */ void listen_free(rad_listen_t **head); int listen_init(CONF_SECTION *cs, rad_listen_t **head); -rad_listen_t *proxy_new_listener(void); -RADCLIENT *client_listener_find(const rad_listen_t *listener, - const fr_ipaddr_t *ipaddr); +int proxy_new_listener(home_server *home, int src_port); +RADCLIENT *client_listener_find(rad_listen_t *listener, + const fr_ipaddr_t *ipaddr, int src_port); + #ifdef WITH_STATS RADCLIENT_LIST *listener_find_client_list(const fr_ipaddr_t *ipaddr, int port); -rad_listen_t *listener_find_byipaddr(const fr_ipaddr_t *ipaddr, int port); #endif +rad_listen_t *listener_find_byipaddr(const fr_ipaddr_t *ipaddr, int port); /* event.c */ int radius_event_init(CONF_SECTION *cs, int spawn_flag); @@ -611,7 +698,9 @@ int received_request(rad_listen_t *listener, RADIUS_PACKET *packet, REQUEST **prequest, RADCLIENT *client); REQUEST *received_proxy_response(RADIUS_PACKET *packet); -void event_new_fd(rad_listen_t *listener); +int event_new_fd(rad_listen_t *listener); +void revive_home_server(void *ctx); +void mark_home_server_dead(home_server *home, struct timeval *when); /* evaluate.c */ int radius_evaluate_condition(REQUEST *request, int modreturn, int depth, @@ -619,4 +708,10 @@ int radius_evaluate_condition(REQUEST *request, int modreturn, int depth, int radius_update_attrlist(REQUEST *request, CONF_SECTION *cs, VALUE_PAIR *input_vps, const char *name); void radius_pairmove(REQUEST *request, VALUE_PAIR **to, VALUE_PAIR *from); +int radius_get_vp(REQUEST *request, const char *name, VALUE_PAIR **vp_p); + +#ifdef __cplusplus +} +#endif + #endif /*RADIUSD_H*/