38086c0de6054ae18544b665427babf508f6c826
[radsecproxy.git] / lib / base.c
1 #include <sys/socket.h>
2 #include <errno.h>
3 #include <stdlib.h>
4 #include "libradsec-base.h"
5
6 static int
7 do_connect(int type,
8            const struct sockaddr *addr,
9            socklen_t addrlen)
10 {
11   int s;
12
13   s = socket(AF_INET, type, 0); /* FIXME: do AF_INET6 too */
14   if (s >= 0)
15       if (connect(s, addr, addrlen)) {
16           close(s);
17           s = -1;
18       }
19   return s;
20 }
21
22 int
23 rs_connect(const struct rs_config *conf,
24            const struct sockaddr *addr,
25            socklen_t addrlen)
26 {
27     switch (conf->conn_type)
28     {
29     case RS_CONN_TYPE_UDP:
30         return do_connect(SOCK_DGRAM, addr, addrlen);
31     case RS_CONN_TYPE_TCP:
32         return do_connect(SOCK_STREAM, addr, addrlen);
33         /* fall thru */
34     case RS_CONN_TYPE_TLS:
35         /* fall thru */
36     case RS_CONN_TYPE_DTLS:
37         /* fall thru */
38     default:
39         errno = ENOSYS;
40         return -1;
41     }
42 }
43
44 int
45 rs_disconnect( const struct rs_config *conf, int fd)
46 {
47     switch (conf->conn_type)
48     {
49     case RS_CONN_TYPE_UDP:
50         return close(fd);
51     case RS_CONN_TYPE_TCP:
52         shutdown(fd, SHUT_RDWR);
53         return close(fd);
54     case RS_CONN_TYPE_TLS:
55         /* fall thru */
56     case RS_CONN_TYPE_DTLS:
57         /* fall thru */
58     default:
59         errno = ENOSYS;
60         return -1;
61     }
62 }
63
64 struct rs_packet *
65 rs_packet_new(const struct rs_config *ctx,
66               const uint8_t buf[RS_HEADER_LEN],
67               size_t *count)
68 {
69     struct rs_packet *p =
70         (ctx->alloc_scheme.malloc ? ctx->alloc_scheme.malloc : malloc)(20);
71     if (p) {
72         p->code = buf[0];
73         p->id = buf[1];
74         if (count)
75             *count = 256 * buf[2] + buf[3];
76     }
77     return p;
78 }
79
80 struct rs_packet *
81 rs_packet_parse(const struct rs_config *ctx,
82                 struct rs_packet *packet,
83                 const uint8_t *buf,
84                 size_t buflen)
85 {
86     if (buflen < 16) {
87         rs_packet_free(ctx, packet);
88         errno = EPROTO;
89         return NULL;
90     }
91     memcpy(packet->auth, buf, 16);
92     /* TODO: copy attributes starting at buf[16].  */
93     return packet;
94 }
95
96 void
97 rs_packet_free(const struct rs_config *ctx,
98                struct rs_packet *packet)
99 {
100     (ctx->alloc_scheme.free ? ctx->alloc_scheme.free : free)(packet);
101 }
102
103 ssize_t
104 rs_packet_serialize(const struct rs_packet *packet,
105                     uint8_t *buf,
106                     size_t buflen)
107 {
108     fixme;
109 }
110
111 /* Local Variables: */
112 /* c-file-style: "stroustrup" */
113 /* End: */