1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
/** @file libradsec.h
@brief Header file for libradsec. */
/* See the file COPYING for licensing information. */
#include <unistd.h>
enum rs_err_code {
RSE_OK = 0,
RSE_NOMEM = 1,
RSE_NOSYS = 2,
RSE_INVALID_CTX = 3,
RSE_INVALID_CONN = 4,
RSE_CONN_TYPE_MISMATCH = 5,
RSE_FR = 6,
RSE_BADADDR = 7,
RSE_NOPEER = 8,
RSE_EVENT = 9,
RSE_CONNERR = 10,
RSE_CONFIG = 11,
RSE_BADAUTH = 12,
RSE_INTERNAL = 13,
RSE_SSLERR = 14,
RSE_SOME_ERROR = 21,
};
enum rs_conn_type {
RS_CONN_TYPE_NONE = 0,
RS_CONN_TYPE_UDP,
RS_CONN_TYPE_TCP,
RS_CONN_TYPE_TLS,
RS_CONN_TYPE_DTLS,
};
typedef unsigned int rs_conn_type_t;
#if defined (__cplusplus)
extern "C" {
#endif
/* Data types. */
struct rs_context; /* radsec-impl.h */
struct rs_connection; /* radsec-impl.h */
struct rs_packet; /* radsec-impl.h */
struct rs_conn; /* radsec-impl.h */
struct rs_attr; /* radsec-impl.h */
struct rs_error; /* radsec-impl.h */
struct rs_peer; /* radsec-impl.h */
struct radius_packet; /* <freeradius/libradius.h> */
struct event_base; /* <event2/event-internal.h> */
typedef void *(*rs_calloc_fp) (size_t nmemb, size_t size);
typedef void *(*rs_malloc_fp) (size_t size);
typedef void (*rs_free_fp) (void *ptr);
typedef void *(*rs_realloc_fp) (void *ptr, size_t size);
struct rs_alloc_scheme {
rs_calloc_fp calloc;
rs_malloc_fp malloc;
rs_free_fp free;
rs_realloc_fp realloc;
};
typedef void (*rs_conn_connected_cb) (void *user_data /* FIXME: peer? */ );
typedef void (*rs_conn_disconnected_cb) (void *user_data
/* FIXME: reason? */ );
typedef void (*rs_conn_packet_received_cb) (const struct rs_packet *
packet, void *user_data);
typedef void (*rs_conn_packet_sent_cb) (void *user_data);
struct rs_conn_callbacks {
/** Callback invoked when the connection has been established. */
rs_conn_connected_cb connected_cb;
/** Callback invoked when the connection has been torn down. */
rs_conn_disconnected_cb disconnected_cb;
/** Callback invoked when a packet was received. */
rs_conn_packet_received_cb received_cb;
/** Callback invoked when a packet was successfully sent. */
rs_conn_packet_sent_cb sent_cb;
};
/* Function prototypes. */
/* Context. */
int rs_context_create(struct rs_context **ctx, const char *dict);
void rs_context_destroy(struct rs_context *ctx);
int rs_context_set_alloc_scheme(struct rs_context *ctx,
struct rs_alloc_scheme *scheme);
int rs_context_read_config(struct rs_context *ctx,
const char *config_file);
/* Connection. */
int rs_conn_create(struct rs_context *ctx, struct rs_connection **conn,
const char *config);
void rs_conn_set_type(struct rs_connection *conn, rs_conn_type_t type);
int rs_conn_add_listener(struct rs_connection *conn, rs_conn_type_t type,
const char *hostname, int port);
void rs_conn_destroy(struct rs_connection *conn);
int rs_conn_set_eventbase(struct rs_connection *conn,
struct event_base *eb);
int rs_conn_set_callbacks(struct rs_connection *conn,
struct rs_conn_callbacks *cb);
struct rs_conn_callbacks *rs_conn_get_callbacks(struct rs_connection
*conn);
int rs_conn_select_server(struct rs_connection *conn, const char *name);
int rs_conn_get_current_server(struct rs_connection *conn,
const char *name, size_t buflen);
int rs_conn_receive_packet(struct rs_connection *conn,
struct rs_packet *request,
struct rs_packet **pkt_out);
int rs_conn_fd(struct rs_connection *conn);
/* Server and client. */
int rs_server_create(struct rs_connection *conn, struct rs_peer **server);
int rs_server_set_address(struct rs_peer *server, const char *hostname,
const char *service);
int rs_server_set_secret(struct rs_peer *server, const char *secret);
void rs_server_set_timeout(struct rs_peer *server, int timeout);
void rs_server_set_tries(struct rs_peer *server, int tries);
/* Packet. */
int rs_packet_create(struct rs_connection *conn, struct rs_packet **pkt_out);
int rs_packet_create_auth_request(struct rs_connection *conn,
struct rs_packet **pkt,
const char *user_name, /* FIXME: remove? */
const char *user_pw); /* FIXME: remove? */
void rs_packet_add_attr(struct rs_packet *pkt, struct rs_attr *attr);
int rs_packet_send(struct rs_packet *pkt, void *data);
struct radius_packet *rs_packet_frpkt(struct rs_packet *pkt);
void rs_packet_destroy(struct rs_packet *pkt);
/* Attribute. */
/* FIXME: Replace (or complement) with a wrapper for paircreate(). */
int rs_attr_create(struct rs_connection *conn, struct rs_attr **attr,
const char *type, const char *val);
void rs_attr_destroy(struct rs_attr *attr);
/* Config. */
struct rs_realm *rs_conf_find_realm(struct rs_context *ctx,
const char *name);
/* Error. */
int rs_err_ctx_push(struct rs_context *ctx, int code, const char *fmt,
...);
int rs_err_ctx_push_fl(struct rs_context *ctx, int code, const char *file,
int line, const char *fmt, ...);
struct rs_error *rs_err_ctx_pop(struct rs_context *ctx);
int rs_err_conn_push(struct rs_connection *conn, int code, const char *fmt,
...);
int rs_err_conn_push_fl(struct rs_connection *conn, int code,
const char *file, int line, const char *fmt, ...);
struct rs_error *rs_err_conn_pop(struct rs_connection *conn);
void rs_err_free(struct rs_error *err);
char *rs_err_msg(struct rs_error *err, int dofree_flag);
int rs_err_code(struct rs_error *err, int dofree_flag);
#if defined (__cplusplus)
}
#endif
/* Local Variables: */
/* c-file-style: "stroustrup" */
/* End: */
|