summaryrefslogtreecommitdiff
path: root/lib/libradsec-base.h
blob: d8c9a2b0267f6126ed79733c1ab5c1f977aa2e4d (plain)
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
/** @file libradsec-base.h
    @brief Low level API for libradsec.  */

/* FIXME: License blurb goes here.  */

#include <unistd.h>
#include <stdint.h>
#include <sys/socket.h>
#include "libradsec.h"

/* Function prototypes.  */



/** Establish a connection.
    @param type Connection type.
    @param addr Network address to connect to.
    @param cred Credentials, or NULL.
    @return A file descriptor or -1 if an error occurred, in which
    case errno is set appropriately.  */
int rs_connect(const struct rs_handle *conf, const struct sockaddr *addr,
	       socklen_t addrlen);

/** Disconnect.
    @param fd File descriptor to close.
    @return 0 on success or -1 if an error occurred, in which case
    errno is set appropriately.  */
int rs_disconnect(const struct rs_handle *conf, int fd);

/** Allocate and initialize a packet from a buffer containing a RADIUS
    message header.  The packet should be freed using @a
    rs_packet_free().
    @param ctx Context.
    @param buf Buffer with on-the-wire data with RADIUS message
    header.
    @param count Optionally a pointer to a size_t where the number of
    additional octets needed to complete the RADIUS message will be
    written.  Or NULL.
    @return A pointer to a newly allocated packet or NULL on error.
*/
struct rs_packet *rs_packet_new(const struct rs_handle *ctx,
				const uint8_t buf[RS_HEADER_LEN],
				size_t *count);

/** Parse an on wire RADIUS packet and store it in @a packet.
    @param ctx Context.
    @param packet A pointer to the address of a struct rs_packet
    allocated by @a rs_packet_new().  Will be freed if an error
    occurs.
    @param buf Buffer with on-the-wire data with RADIUS message, not
    including the four octet RADIUS header.
    @param buflen Number of octets in @a buf.
    @return *packet or NULL on error.  If NULL, the packet has been
    freed and *packet is no longer valid.
*/
struct rs_packet *rs_packet_parse(const struct rs_handle *ctx,
				  struct rs_packet **packet,
				  const uint8_t *buf,
				  size_t buflen);

/** Free @a packet, previously allocated by @a rs_packet_new().
    @param ctx Context.
    @param packet Packet to free.
*/
void rs_packet_free(const struct rs_handle *ctx, struct rs_packet **packet);

/** Serialize @a packet into @a buf.
    @param packet Packet to serialize.
    @param buf Buffer to store the serialized packet in.
    @param buflen Length of buffer.
    @return Number of bytes written to buf or 0 if the buffer wasn't
    large enough to hold the packet or < 0 in case the packet couldn't
    be serialized for some other reason (FIXME: elaborate) */

ssize_t rs_packet_serialize(const struct rs_packet *packet,
			    uint8_t *buf, size_t buflen);


/** Add an attribute to a packet.
    @param packet The packet.
    @param attribute Attribute to add to packet.  */
int rs_packet_add_attr(struct rs_packet *packet,
		       const struct rs_attribute *attribute);