X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=lib%2Fpacket.c;h=63bf370b39f3bb67bce0c2358f2a9e1059239909;hb=79d36d41a578451a37c134981d5698dec3d5a4d3;hp=fe87bfd0d5dfa91a8af282a8bbbda3ac02450428;hpb=09d1cff2418a900b587b2113f508984f2417cc11;p=libradsec.git diff --git a/lib/packet.c b/lib/packet.c index fe87bfd..63bf370 100644 --- a/lib/packet.c +++ b/lib/packet.c @@ -1,5 +1,5 @@ /* Copyright 2010, 2011 NORDUnet A/S. All rights reserved. - See the file COPYING for licensing information. */ + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include @@ -137,16 +137,6 @@ rs_packet_create (struct rs_connection *conn, struct rs_packet **pkt_out) if (rpkt == NULL) return rs_err_conn_push (conn, RSE_NOMEM, __func__); - /* - * This doesn't make sense; the packet identifier is constant for - * an entire conversation. A separate API should be provided to - * allow the application to set the packet ID, or a conversation - * object should group related packets together. - */ -#if 0 - rpkt->id = conn->nextid++ -#endif - err = nr_packet_init (rpkt, NULL, NULL, PW_ACCESS_REQUEST, rpkt + 1, RS_MAX_PACKET_LEN); @@ -169,9 +159,7 @@ rs_packet_create (struct rs_connection *conn, struct rs_packet **pkt_out) int rs_packet_create_authn_request (struct rs_connection *conn, struct rs_packet **pkt_out, - const char *user_name, - const char *user_pw, - const char *secret) + const char *user_name, const char *user_pw) { struct rs_packet *pkt; int err; @@ -184,15 +172,16 @@ rs_packet_create_authn_request (struct rs_connection *conn, if (user_name) { - err = rs_packet_append_avp (pkt, PW_USER_NAME, 0, user_name, 0); + err = rs_packet_add_avp (pkt, PW_USER_NAME, 0, user_name, + strlen (user_name)); if (err) return err; } if (user_pw) { - pkt->rpkt->secret = secret; - err = rs_packet_append_avp (pkt, PW_USER_PASSWORD, 0, user_pw, 0); + err = rs_packet_add_avp (pkt, PW_USER_PASSWORD, 0, user_pw, + strlen (user_pw)); if (err) return err; } @@ -213,7 +202,46 @@ rs_packet_destroy (struct rs_packet *pkt) } int -rs_packet_append_avp (struct rs_packet *pkt, +rs_packet_add_avp (struct rs_packet *pkt, + unsigned int attr, unsigned int vendor, + const void *data, size_t data_len) + +{ + const DICT_ATTR *da; + VALUE_PAIR *vp; + int err; + + assert (pkt); + assert (pkt->conn); + assert (pkt->conn->ctx); + + da = nr_dict_attr_byvalue (attr, vendor); + if (da == NULL) + return rs_err_conn_push (pkt->conn, RSE_ATTR_TYPE_UNKNOWN, + "nr_dict_attr_byvalue"); + vp = rs_malloc (pkt->conn->ctx, sizeof(*vp)); + if (vp == NULL) + return rs_err_conn_push (pkt->conn, RSE_NOMEM, NULL); + if (nr_vp_init (vp, da) == NULL) + { + nr_vp_free (&vp); + return rs_err_conn_push (pkt->conn, RSE_INTERNAL, NULL); + } + err = nr_vp_set_data (vp, data, data_len); + if (err < 0) + { + nr_vp_free (&vp); + return rs_err_conn_push (pkt->conn, -err, "nr_vp_set_data"); + } + nr_vps_append (&pkt->rpkt->vps, vp); + + return RSE_OK; +} + +/* TODO: Rename rs_packet_append_avp, indicating that encoding is + being done. */ +int +rs_packet_append_avp (struct rs_packet *pkt, unsigned int attr, unsigned int vendor, const void *data, size_t data_len) {