From be4b786700ad03de5226951c043fefb345c0df4c Mon Sep 17 00:00:00 2001 From: Linus Nordberg Date: Sat, 2 Oct 2010 21:31:50 +0200 Subject: WIP --- lib/HACKING | 2 +- lib/Makefile | 4 +- lib/attr.c | 4 +- lib/debug.c | 4 +- lib/err.c | 4 +- lib/examples/Makefile | 11 ++-- lib/examples/client-blocking.c | 80 ++++++++++++++++++++++++ lib/examples/client.c | 75 ---------------------- lib/include/radsec/libradsec-impl.h | 88 ++++++++++++++++++++++++++ lib/include/radsec/libradsec.h | 121 ++++++++++++++++++++++++++++++++++++ lib/libradsec-impl.h | 88 -------------------------- lib/libradsec.h | 119 ----------------------------------- lib/packet.c | 76 ++++++++++++---------- lib/radsec.c | 4 +- 14 files changed, 349 insertions(+), 331 deletions(-) create mode 100644 lib/examples/client-blocking.c delete mode 100644 lib/examples/client.c create mode 100644 lib/include/radsec/libradsec-impl.h create mode 100644 lib/include/radsec/libradsec.h delete mode 100644 lib/libradsec-impl.h delete mode 100644 lib/libradsec.h (limited to 'lib') diff --git a/lib/HACKING b/lib/HACKING index ed9717d..9cbab82 100644 --- a/lib/HACKING +++ b/lib/HACKING @@ -1,6 +1,6 @@ HACKING file for libradsec (in Emacs -*- org -*- mode). * Design of the libraray -* Features +* Functionality ** Not implemented - reading config file - server fail over diff --git a/lib/Makefile b/lib/Makefile index 1b26f04..3575305 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -1,4 +1,4 @@ -CFLAGS = -Wall -g -DDEBUG +CFLAGS = -Wall -g -I include -DDEBUG OFILES = attr.o \ debug.o \ @@ -11,7 +11,7 @@ all: libradsec.a libradsec.a: $(OFILES) ar rc $@ $^ -$(OFILES): libradsec.h libradsec-impl.h +$(OFILES): include/radsec/libradsec.h include/radsec/libradsec-impl.h doc: doxygen diff --git a/lib/attr.c b/lib/attr.c index 0b1542e..8dede27 100644 --- a/lib/attr.c +++ b/lib/attr.c @@ -1,8 +1,8 @@ /* See the file COPYING for licensing information. */ #include -#include "libradsec.h" -#include "libradsec-impl.h" +#include +#include int rs_attr_create(struct rs_connection *conn, struct rs_attr **attr, const char *type, const char *val) diff --git a/lib/debug.c b/lib/debug.c index d2d8d9c..26e2403 100644 --- a/lib/debug.c +++ b/lib/debug.c @@ -2,8 +2,8 @@ #include #include -#include "libradsec.h" -#include "libradsec-impl.h" +#include +#include #include "debug.h" /* From freeradius-server/src/lib/radius.c */ diff --git a/lib/err.c b/lib/err.c index f81644a..ec72a29 100644 --- a/lib/err.c +++ b/lib/err.c @@ -3,8 +3,8 @@ #include #include #include -#include "libradsec.h" -#include "libradsec-impl.h" +#include +#include const char *_errtxt[] = { "SUCCESS", /* 0 RSE_OK */ diff --git a/lib/examples/Makefile b/lib/examples/Makefile index f9f2ee1..618afdb 100644 --- a/lib/examples/Makefile +++ b/lib/examples/Makefile @@ -1,12 +1,11 @@ -CFLAGS = -Wall -g +CFLAGS = -Wall -g -I ../include -all: client +HFILES = ../include/radsec/libradsec.h ../include/radsec/libradsec-impl.h -blocking.o: blocking.c blocking.h ../libradsec-base.h ../libradsec.h - $(CC) $(CFLAGS) -c -I .. $^ +all: client-blocking -client: client.c ../libradsec.a ../libradsec.h ../libradsec-impl.h +client-blocking: client-blocking.c ../libradsec.a $(HFILES) $(CC) $(CFLAGS) -o $@ $< -L /usr/lib/freeradius -lfreeradius-radius -L .. -lradsec -L /usr/local/lib -levent_core clean: - -rm *.o client + -rm *.o client-blocking *.gch diff --git a/lib/examples/client-blocking.c b/lib/examples/client-blocking.c new file mode 100644 index 0000000..0d2a58a --- /dev/null +++ b/lib/examples/client-blocking.c @@ -0,0 +1,80 @@ +/* RADIUS client doing blocking i/o. */ + +#include +#include +#include +#include +#include +#include +#include + +#define SECRET "sikrit" +#define USER_NAME "bob" +#define USER_PW "hemligt" + +struct rs_error * +rsx_client (const char *srvname, int srvport) +{ + struct rs_handle *h; + struct rs_connection *conn; + struct rs_peer *server; + struct rs_packet *req, *resp; + RADIUS_PACKET *fr_pkt; + VALUE_PAIR *fr_vp; + + if (rs_context_create (&h, "/usr/share/freeradius/dictionary")) + return NULL; + + if (rs_conn_create (h, &conn)) + return rs_conn_err_pop (conn); + if (rs_conn_add_server (conn, &server, RS_CONN_TYPE_UDP, srvname, srvport)) + return rs_conn_err_pop (conn); + rs_server_set_timeout (server, 10); + rs_server_set_tries (server, 3); + rs_server_set_secret (server, SECRET); + + if (rs_packet_create_acc_request (conn, &req, USER_NAME, USER_PW)) + return rs_conn_err_pop (conn); + + if (rs_packet_send (req, NULL)) + return rs_conn_err_pop (conn); + req = NULL; + +#if 0 + if (rs_packet_create_acc_request (conn, &req, USER_NAME, USER_PW)) + return rs_conn_err_pop (conn); + + if (rs_packet_send (conn, req, NULL)) + return rs_conn_err_pop (conn); + req = NULL; +#endif + + if (rs_conn_receive_packet (conn, &resp)) + return rs_conn_err_pop (conn); + fr_pkt = rs_packet_frpkt (resp); + fr_vp = fr_pkt->vps; /* FIXME: Is there an accessor? */ + vp_printlist(stdout, fr_vp); + rs_packet_destroy (resp); + + rs_conn_destroy (conn); + rs_context_destroy (h); + return NULL; +} + +int +main (int argc, char *argv[]) +{ + struct rs_error *err; + char *host; + int port; + + host = strsep (argv + 1, ":"); + port = atoi (argv[1]); + err = rsx_client (host, port); + if (err) + { + fprintf (stderr, "%s\n", rs_err_msg (err, 0)); + return rs_err_code (err, 1); + } + return 0; +} diff --git a/lib/examples/client.c b/lib/examples/client.c deleted file mode 100644 index 1e9f209..0000000 --- a/lib/examples/client.c +++ /dev/null @@ -1,75 +0,0 @@ -/* RADIUS client doing blocking i/o. */ - -#include -#include -#include -#include -#include -#include "../libradsec.h" - -#define SECRET "sikrit" -#define USER_NAME "bob" -#define USER_PW "hemligt" - -struct rs_error * -rsx_client (const char *srvname, int srvport) -{ - struct rs_handle *h; - struct rs_connection *conn; - struct rs_peer *server; - struct rs_packet *req, *resp; - - if (rs_context_create (&h, "/usr/share/freeradius/dictionary")) - return NULL; - - if (rs_conn_create (h, &conn)) - return rs_conn_err_pop (conn); - if (rs_conn_add_server (conn, &server, RS_CONN_TYPE_UDP, srvname, srvport)) - return rs_conn_err_pop (conn); - rs_server_set_timeout (server, 10); - rs_server_set_tries (server, 3); - rs_server_set_secret (server, SECRET); - - if (rs_packet_create_acc_request (conn, &req, USER_NAME, USER_PW)) - return rs_conn_err_pop (conn); - - if (rs_packet_send (conn, req, NULL)) - return rs_conn_err_pop (conn); - req = NULL; - -#if 0 - if (rs_packet_create_acc_request (conn, &req, USER_NAME, USER_PW)) - return rs_conn_err_pop (conn); - - if (rs_packet_send (conn, req, NULL)) - return rs_conn_err_pop (conn); - req = NULL; -#endif - - if (rs_packet_receive (conn, &resp)) - return rs_conn_err_pop (conn); - /* TODO: do something interesting with the response */ - rs_packet_destroy (resp); - - rs_conn_destroy (conn); - rs_context_destroy (h); - return NULL; -} - -int -main (int argc, char *argv[]) -{ - struct rs_error *err; - char *host; - int port; - - host = strsep (argv + 1, ":"); - port = atoi (argv[1]); - err = rsx_client (host, port); - if (err) - { - fprintf (stderr, "%s\n", rs_err_msg (err, 0)); - return rs_err_code (err, 1); - } - return 0; -} diff --git a/lib/include/radsec/libradsec-impl.h b/lib/include/radsec/libradsec-impl.h new file mode 100644 index 0000000..3abb71e --- /dev/null +++ b/lib/include/radsec/libradsec-impl.h @@ -0,0 +1,88 @@ +/** @file libradsec-impl.h + @brief Libraray internal header file for libradsec. */ + +/* See the file COPYING for licensing information. */ + +#include +#include + +/* Constants. */ +#define RS_HEADER_LEN 4 + +/* Data types. */ +enum rs_cred_type { + RS_CRED_NONE = 0, + RS_CRED_TLS_PSK_RSA, /* RFC 4279. */ +}; +typedef unsigned int rs_cred_type_t; + +struct rs_packet; + +struct rs_credentials { + enum rs_cred_type type; + char *identity; + char *secret; +}; + +struct rs_error { + int code; + char *msg; + char buf[1024]; +}; + +struct rs_handle { + struct rs_alloc_scheme alloc_scheme; + struct rs_error *err; + fr_randctx fr_randctx; + /* TODO: dictionary? */ +}; + +struct rs_peer { + struct rs_connection *conn; + struct evutil_addrinfo *addr; + int s; /* Socket. */ + char is_connecting; + char is_connected; + char *secret; + int timeout; /* client only */ + int tries; /* client only */ + struct rs_peer *next; +}; + +struct rs_connection { + struct rs_handle *ctx; + struct event_base *evb; + struct bufferevent *bev; + enum rs_conn_type type; + struct rs_credentials transport_credentials; + struct rs_conn_callbacks callbacks; + struct rs_peer *peers; + struct rs_peer *active_peer; + struct rs_error *err; +}; + +struct rs_packet { + struct rs_connection *conn; + char hdr_read_flag; + uint8_t hdr[4]; + RADIUS_PACKET *rpkt; +}; + +struct rs_attr { + struct rs_packet *pkt; + VALUE_PAIR *vp; +}; + +/* Convenience macros. */ +#define rs_calloc(h, nmemb, size) \ + (h->alloc_scheme.calloc ? h->alloc_scheme.calloc : calloc)(nmemb, size) +#define rs_malloc(h, size) \ + (h->alloc_scheme.malloc ? h->alloc_scheme.malloc : malloc)(size) +#define rs_free(h, ptr) \ + (h->alloc_scheme.free ? h->alloc_scheme.free : free)(ptr) +#define rs_realloc(h, realloc, ptr, size) \ + (h->alloc_scheme.realloc ? h->alloc_scheme.realloc : realloc)(ptr, size) + +/* Local Variables: */ +/* c-file-style: "stroustrup" */ +/* End: */ diff --git a/lib/include/radsec/libradsec.h b/lib/include/radsec/libradsec.h new file mode 100644 index 0000000..ce6940e --- /dev/null +++ b/lib/include/radsec/libradsec.h @@ -0,0 +1,121 @@ +/** @file libradsec.h + @brief Header file for libradsec. */ +/* See the file COPYING for licensing information. */ + +#include + +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_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; + + +/* Data types. */ +struct rs_handle; /* 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; /* */ +struct event_base; /* */ + +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_handle **ctx, const char *dict); +void rs_context_destroy(struct rs_handle *ctx); +int rs_context_set_alloc_scheme(struct rs_handle *ctx, struct rs_alloc_scheme *scheme); +int rs_context_config_read(struct rs_handle *ctx, const char *config_file); + +/* Server and client configuration. */ +void rs_server_set_timeout(struct rs_peer *server, int timeout); +void rs_server_set_tries(struct rs_peer *server, int tries); +int rs_server_set_secret(struct rs_peer *server, const char *secret); + +/* Connection. */ +int rs_conn_create(struct rs_handle *ctx, struct rs_connection **conn); +int rs_conn_add_server(struct rs_connection *conn, struct rs_peer **server, rs_conn_type_t type, const char *hostname, int port); +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); +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 **pkt_out); + +/* Packet. */ +int rs_packet_create_acc_request(struct rs_connection *conn, struct rs_packet **pkt, const char *user_name, const char *user_pw); +//int rs_packet_create_acc_accept(cstruct rs_connection *conn, struct rs_packet **pkt); +//int rs_packet_create_acc_reject(struct rs_connection *conn, struct rs_packet **pkt); +//int rs_packet_create_acc_challenge(struct rs_connection *conn, struct rs_packet **pkt); +void rs_packet_destroy(struct rs_packet *pkt); +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); + +/* Attribute. */ +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); + +/* Error. */ +int rs_ctx_err_push(struct rs_handle *ctx, int code, const char *fmt, ...); +int rs_ctx_err_push_fl(struct rs_handle *ctx, int code, const char *file, int line, const char *fmt, ...); +struct rs_error *rs_ctx_err_pop (struct rs_handle *ctx); +int rs_conn_err_push(struct rs_connection *conn, int code, const char *fmt, ...); +int rs_conn_err_push_fl(struct rs_connection *conn, int code, const char *file, int line, const char *fmt, ...); +struct rs_error *rs_conn_err_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); + +/* Local Variables: */ +/* c-file-style: "stroustrup" */ +/* End: */ diff --git a/lib/libradsec-impl.h b/lib/libradsec-impl.h deleted file mode 100644 index 3abb71e..0000000 --- a/lib/libradsec-impl.h +++ /dev/null @@ -1,88 +0,0 @@ -/** @file libradsec-impl.h - @brief Libraray internal header file for libradsec. */ - -/* See the file COPYING for licensing information. */ - -#include -#include - -/* Constants. */ -#define RS_HEADER_LEN 4 - -/* Data types. */ -enum rs_cred_type { - RS_CRED_NONE = 0, - RS_CRED_TLS_PSK_RSA, /* RFC 4279. */ -}; -typedef unsigned int rs_cred_type_t; - -struct rs_packet; - -struct rs_credentials { - enum rs_cred_type type; - char *identity; - char *secret; -}; - -struct rs_error { - int code; - char *msg; - char buf[1024]; -}; - -struct rs_handle { - struct rs_alloc_scheme alloc_scheme; - struct rs_error *err; - fr_randctx fr_randctx; - /* TODO: dictionary? */ -}; - -struct rs_peer { - struct rs_connection *conn; - struct evutil_addrinfo *addr; - int s; /* Socket. */ - char is_connecting; - char is_connected; - char *secret; - int timeout; /* client only */ - int tries; /* client only */ - struct rs_peer *next; -}; - -struct rs_connection { - struct rs_handle *ctx; - struct event_base *evb; - struct bufferevent *bev; - enum rs_conn_type type; - struct rs_credentials transport_credentials; - struct rs_conn_callbacks callbacks; - struct rs_peer *peers; - struct rs_peer *active_peer; - struct rs_error *err; -}; - -struct rs_packet { - struct rs_connection *conn; - char hdr_read_flag; - uint8_t hdr[4]; - RADIUS_PACKET *rpkt; -}; - -struct rs_attr { - struct rs_packet *pkt; - VALUE_PAIR *vp; -}; - -/* Convenience macros. */ -#define rs_calloc(h, nmemb, size) \ - (h->alloc_scheme.calloc ? h->alloc_scheme.calloc : calloc)(nmemb, size) -#define rs_malloc(h, size) \ - (h->alloc_scheme.malloc ? h->alloc_scheme.malloc : malloc)(size) -#define rs_free(h, ptr) \ - (h->alloc_scheme.free ? h->alloc_scheme.free : free)(ptr) -#define rs_realloc(h, realloc, ptr, size) \ - (h->alloc_scheme.realloc ? h->alloc_scheme.realloc : realloc)(ptr, size) - -/* Local Variables: */ -/* c-file-style: "stroustrup" */ -/* End: */ diff --git a/lib/libradsec.h b/lib/libradsec.h deleted file mode 100644 index e487064..0000000 --- a/lib/libradsec.h +++ /dev/null @@ -1,119 +0,0 @@ -/** @file libradsec.h - @brief Header file for libradsec. */ -/* See the file COPYING for licensing information. */ - -#include - -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_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; - - -/* Data types. */ -struct rs_handle; /* 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 event_base; /* */ - -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_handle **ctx, const char *dict); -void rs_context_destroy(struct rs_handle *ctx); -int rs_context_set_alloc_scheme(struct rs_handle *ctx, struct rs_alloc_scheme *scheme); -int rs_context_config_read(struct rs_handle *ctx, const char *config_file); - -/* Connection. */ -int rs_conn_create(struct rs_handle *ctx, struct rs_connection **conn); -int rs_conn_add_server(struct rs_connection *conn, struct rs_peer **server, rs_conn_type_t type, const char *hostname, int port); -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); -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); - -/* Server and client configuration. */ -void rs_server_set_timeout(struct rs_peer *server, int timeout); -void rs_server_set_tries(struct rs_peer *server, int tries); -int rs_server_set_secret(struct rs_peer *server, const char *secret); - -/* Packet. */ -int rs_packet_create_acc_request(struct rs_connection *conn, struct rs_packet **pkt, const char *user_name, const char *user_pw); -//int rs_packet_create_acc_accept(cstruct rs_connection *conn, struct rs_packet **pkt); -//int rs_packet_create_acc_reject(struct rs_connection *conn, struct rs_packet **pkt); -//int rs_packet_create_acc_challenge(struct rs_connection *conn, struct rs_packet **pkt); -void rs_packet_destroy(struct rs_packet *pkt); -void rs_packet_add_attr(struct rs_packet *pkt, struct rs_attr *attr); -int rs_packet_send(struct rs_connection *conn, struct rs_packet *pkt, void *data); -int rs_packet_receive(struct rs_connection *conn, struct rs_packet **pkt_out); - -/* Attribute. */ -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); - -/* Error. */ -int rs_ctx_err_push(struct rs_handle *ctx, int code, const char *fmt, ...); -int rs_ctx_err_push_fl(struct rs_handle *ctx, int code, const char *file, int line, const char *fmt, ...); -struct rs_error *rs_ctx_err_pop (struct rs_handle *ctx); -int rs_conn_err_push(struct rs_connection *conn, int code, const char *fmt, ...); -int rs_conn_err_push_fl(struct rs_connection *conn, int code, const char *file, int line, const char *fmt, ...); -struct rs_error *rs_conn_err_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); - -/* Local Variables: */ -/* c-file-style: "stroustrup" */ -/* End: */ diff --git a/lib/packet.c b/lib/packet.c index 5f7293c..8d9be93 100644 --- a/lib/packet.c +++ b/lib/packet.c @@ -5,8 +5,8 @@ #include #include #include -#include "libradsec.h" -#include "libradsec-impl.h" +#include +#include #if defined DEBUG #include "debug.h" #endif @@ -130,40 +130,36 @@ _read_cb (struct bufferevent *bev, void *ctx) assert (pkt->conn); if (!pkt->hdr_read_flag) { - n = bufferevent_read (pkt->conn->bev, pkt->hdr, RS_HEADER_LEN; + n = bufferevent_read (pkt->conn->bev, pkt->hdr, RS_HEADER_LEN); if (n == RS_HEADER_LEN) { - uint16_t len = (pkt->hdr[2] << 8) + pkt->hdr[3]; - uint8_t *buf = rs_malloc (pkt->conn->ctx, len); - pkt->hdr_read_flag = 1; - if (!buf) + pkt->rpkt->data_len = (pkt->hdr[2] << 8) + pkt->hdr[3]; + if (pkt->rpkt->data_len < 20 /* || len > 4096 */) + abort (); /* TODO: Read and discard. */ + pkt->rpkt->data = rs_malloc (pkt->conn->ctx, pkt->rpkt->data_len); + if (!pkt->rpkt->data) { - rs_conn_err_push_fl (pkt->conn, RSE_NOMEM, __FILE__, - __LINE__, NULL); + rs_conn_err_push_fl (pkt->conn, RSE_NOMEM, __FILE__, __LINE__, + NULL); abort (); /* FIXME: recovering takes reading of packet */ } - pkt->rpkt->data = buf; - pkt->rpkt->data_len = len; + memcpy (pkt->rpkt->data, pkt->hdr, RS_HEADER_LEN); bufferevent_setwatermark (pkt->conn->bev, EV_READ, - len - RS_HEADER_LEN, 0); + pkt->rpkt->data_len - RS_HEADER_LEN, 0); #if defined (DEBUG) - fprintf (stderr, "%s: packet header read, pkt len=%d\n", __func__, - len); + fprintf (stderr, "%s: packet header read, total pkt len=%d\n", + __func__, pkt->rpkt->data_len); #endif } else if (n < 0) - return; /* Buffer frozen, i suppose. Let's hope it thaws. */ + return; /* Buffer frozen. */ else - { - assert (n < RS_HEADER_LEN); - return; /* Need more to complete header. */ - } + assert (!"short header"); } - printf ("%s: trying to read %d octets of packet data\n", __func__, pkt->rpkt->data_len - RS_HEADER_LEN; - n = bufferevent_read (pkt->conn->bev, pkt->rpkt->data, - pkt->rpkt->data_len - RS_HEADER_LEN); + printf ("%s: trying to read %d octets of packet data\n", __func__, pkt->rpkt->data_len - RS_HEADER_LEN); + n = bufferevent_read (pkt->conn->bev, pkt->rpkt->data + RS_HEADER_LEN, pkt->rpkt->data_len - RS_HEADER_LEN); printf ("%s: read %d octets of packet data\n", __func__, n); if (n == pkt->rpkt->data_len - RS_HEADER_LEN) { @@ -173,9 +169,14 @@ _read_cb (struct bufferevent *bev, void *ctx) #if defined (DEBUG) fprintf (stderr, "%s: complete packet read\n", __func__); #endif + rad_decode (pkt->rpkt, NULL, pkt->conn->active_peer->secret); if (event_base_loopbreak (pkt->conn->evb) < 0) abort (); /* FIXME */ } + else if (n < 0) + return; /* Buffer frozen. */ + else + assert (!"short packet"); } static int @@ -268,10 +269,13 @@ _conn_open(struct rs_connection *conn, struct rs_packet *pkt) } int -rs_packet_send (struct rs_connection *conn, struct rs_packet *pkt, void *data) +rs_packet_send (struct rs_packet *pkt, void *data) { - assert (conn); + struct rs_connection *conn; + assert (pkt); + assert (pkt->conn); assert (pkt->rpkt); + conn = pkt->conn; if (_conn_open (conn, pkt)) return -1; @@ -291,7 +295,7 @@ rs_packet_send (struct rs_connection *conn, struct rs_packet *pkt, void *data) } int -rs_packet_receive(struct rs_connection *conn, struct rs_packet **pkt_out) +rs_conn_receive_packet (struct rs_connection *conn, struct rs_packet **pkt_out) { struct rs_packet *pkt; @@ -313,13 +317,14 @@ rs_packet_receive(struct rs_connection *conn, struct rs_packet **pkt_out) bufferevent_enable (conn->bev, EV_READ); event_base_dispatch (conn->evb); #if defined (DEBUG) - fprintf (stderr, "%s: event loop done\n", __func__); - assert (event_base_got_break(conn->evb)); -#endif - -#if defined (DEBUG) - fprintf (stderr, "%s: got this:\n", __func__); - rs_dump_packet (pkt); + fprintf (stderr, "%s: event loop done", __func__); + if (event_base_got_break(conn->evb)) + { + fprintf (stderr, ", got this:\n"); + rs_dump_packet (pkt); + } + else + fprintf (stderr, ", no reply\n"); #endif return RSE_OK; @@ -331,3 +336,10 @@ rs_packet_add_attr(struct rs_packet *pkt, struct rs_attr *attr) pairadd (&pkt->rpkt->vps, attr->vp); attr->pkt = pkt; } + +struct radius_packet * +rs_packet_frpkt(struct rs_packet *pkt) +{ + assert (pkt); + return pkt->rpkt; +} diff --git a/lib/radsec.c b/lib/radsec.c index 3d8c5c2..6d0308d 100644 --- a/lib/radsec.c +++ b/lib/radsec.c @@ -9,8 +9,8 @@ #include #include #include -#include "libradsec.h" -#include "libradsec-impl.h" +#include +#include int rs_context_create(struct rs_handle **ctx, const char *dict) -- cgit v1.1