1 /* See the file COPYING for licensing information. */
3 #include <sys/socket.h>
9 #include "../tlv11.h" /* FIXME: .. */
10 #include "libradsec-base.h"
14 const struct sockaddr *addr,
19 s = socket(AF_INET, type, 0); /* FIXME: do AF_INET6 too */
21 if (connect(s, addr, addrlen)) {
29 _list_new(const struct rs_handle *ctx)
31 struct list *list = rs_malloc(ctx, sizeof(struct list));
33 memset(list, 0, sizeof(struct list));
38 _list_push(const struct rs_handle *ctx, /* FIXME: code duplicate, list.c */
42 struct list_node *node;
44 node = rs_malloc(ctx, sizeof(struct list_node));
52 list->last->next = node;
62 _list_destroy(const struct rs_handle *ctx, /* FIXME: code dup */
65 struct list_node *node, *next;
68 for (node = list->first; node; node = next) {
69 rs_free(ctx, node->data);
77 /* ------------------------------------------------------- */
79 rs_connect(const struct rs_handle *conf,
80 const struct sockaddr *addr,
83 switch (conf->conn_type)
85 case RS_CONN_TYPE_UDP:
86 return _do_connect(SOCK_DGRAM, addr, addrlen);
87 case RS_CONN_TYPE_TCP:
88 return _do_connect(SOCK_STREAM, addr, addrlen);
90 case RS_CONN_TYPE_TLS:
92 case RS_CONN_TYPE_DTLS:
101 rs_disconnect( const struct rs_handle *conf, int fd)
103 switch (conf->conn_type)
105 case RS_CONN_TYPE_UDP:
107 case RS_CONN_TYPE_TCP:
108 shutdown(fd, SHUT_RDWR);
110 case RS_CONN_TYPE_TLS:
112 case RS_CONN_TYPE_DTLS:
121 rs_packet_new(const struct rs_handle *ctx,
122 const uint8_t buf[RS_HEADER_LEN],
125 struct rs_packet *p = rs_malloc(ctx, sizeof(struct rs_packet));
127 p->attrs = _list_new(ctx);
132 *count = (buf[2] << 8) + buf[3];
135 rs_packet_free(ctx, &p);
141 rs_packet_parse(const struct rs_handle *ctx,
142 struct rs_packet **packet,
146 struct rs_packet *p = *packet;
153 rs_packet_free(ctx, &p);
158 while (i + 2 < buflen) {
164 "%s: DEBUG: attribute (type %d, len %d) has an invalid length\n",
165 __func__, atype, alen);
168 rs_packet_free(ctx, &p);
172 if (alen + i >= buflen) {
175 "%s: DEBUG: attribute (type %d, len %d) wouldn't fit packet\n",
176 __func__, atype, alen);
179 rs_packet_free(ctx, &p);
182 tlv = maketlv(atype, alen, (void *) (buf + i));
184 _list_push(ctx, p->attrs, tlv);
187 rs_packet_free(ctx, &p);
191 memcpy(p->auth, buf, 16);
196 rs_packet_free(const struct rs_handle *ctx,
197 struct rs_packet **packet)
199 _list_destroy(ctx, (*packet)->attrs);
200 rs_free(ctx, *packet);
205 rs_packet_serialize(const struct rs_packet *packet,
209 struct list_node *ln;
213 for (ln = list_first(packet->attrs), pktlen = 20; ln; ln = list_next(ln))
214 pktlen += ((struct rs_attribute *)(ln->data))->length;
216 return -(pktlen - buflen);
218 buf[0] = packet->code;
220 buf[2] = (pktlen & 0xff00) >> 8;
221 buf[3] = pktlen & 0xff;
223 memcpy(buf + 4, packet->auth, 16);
225 for (ln = list_first(packet->attrs), i = 20; ln; ln = list_next(ln)) {
226 struct rs_attribute *a = (struct rs_attribute *)(ln->data);
228 buf[i++] = a->length;
229 memcpy(buf + i, a->value, a->length - 2);
236 /* Local Variables: */
237 /* c-file-style: "stroustrup" */