Postpone resolving of DNS names of server.
[libradsec.git] / lib / packet.c
index e79268b..8e6f22d 100644 (file)
@@ -59,19 +59,25 @@ packet_do_send (struct rs_packet *pkt)
 {
   VALUE_PAIR *vp = NULL;
 
+  assert (pkt);
+  assert (pkt->conn);
+  assert (pkt->conn->active_peer);
+  assert (pkt->conn->active_peer->secret);
   assert (pkt->rpkt);
 
-  /* Add Message-Authenticator, RFC 2869.  */
+  /* Add a Message-Authenticator, RFC 2869, if not already present.  */
   /* FIXME: Make Message-Authenticator optional?  */
   vp = paircreate (PW_MESSAGE_AUTHENTICATOR, PW_TYPE_OCTETS);
   if (!vp)
     return rs_err_conn_push_fl (pkt->conn, RSE_FR, __FILE__, __LINE__,
                                "paircreate: %s", fr_strerror ());
-  pairadd (&pkt->rpkt->vps, vp);
+  pairreplace (&pkt->rpkt->vps, vp);
 
+  /* Encode message.  */
   if (rad_encode (pkt->rpkt, NULL, pkt->conn->active_peer->secret))
     return rs_err_conn_push_fl (pkt->conn, RSE_FR, __FILE__, __LINE__,
                                "rad_encode: %s", fr_strerror ());
+  /* Sign message.  */
   if (rad_sign (pkt->rpkt, NULL, pkt->conn->active_peer->secret))
     return rs_err_conn_push_fl (pkt->conn, RSE_FR, __FILE__, __LINE__,
                                "rad_sign: %s", fr_strerror ());
@@ -79,8 +85,8 @@ packet_do_send (struct rs_packet *pkt)
   {
     char host[80], serv[80];
 
-    getnameinfo (pkt->conn->active_peer->addr->ai_addr,
-                pkt->conn->active_peer->addr->ai_addrlen,
+    getnameinfo (pkt->conn->active_peer->addr_cache->ai_addr,
+                pkt->conn->active_peer->addr_cache->ai_addrlen,
                 host, sizeof(host), serv, sizeof(serv),
                 0 /* NI_NUMERICHOST|NI_NUMERICSERV*/);
     rs_debug (("%s: about to send this to %s:%s:\n", __func__, host, serv));
@@ -105,8 +111,6 @@ packet_do_send (struct rs_packet *pkt)
       while (*pp && (*pp)->next)
        *pp = (*pp)->next;
       *pp = pkt;
-
-      conn_activate_timeout (pkt->conn); /* Retransmission timer.  */
     }
 
   return RSE_OK;
@@ -146,7 +150,7 @@ rs_packet_create_authn_request (struct rs_connection *conn,
                                const char *user_name, const char *user_pw)
 {
   struct rs_packet *pkt;
-  struct rs_attr *attr;
+  VALUE_PAIR *vp = NULL;
 
   if (rs_packet_create (conn, pkt_out))
     return -1;
@@ -155,26 +159,23 @@ rs_packet_create_authn_request (struct rs_connection *conn,
 
   if (user_name)
     {
-      if (rs_attr_create (conn, &attr, "User-Name", user_name))
-       return -1;
-      rs_packet_add_attr (pkt, attr);
-
-      if (user_pw)
-       {
-         if (rs_attr_create (conn, &attr, "User-Password", user_pw))
-           return -1;
-         rs_packet_add_attr (pkt, attr);
-       }
+      vp = pairmake ("User-Name", user_name, T_OP_EQ);
+      if (vp == NULL)
+       return rs_err_conn_push_fl (conn, RSE_FR, __FILE__, __LINE__,
+                                   "pairmake: %s", fr_strerror ());
+      pairadd (&pkt->rpkt->vps, vp);
     }
 
-  return RSE_OK;
-}
+  if (user_pw)
+    {
+      vp = pairmake ("User-Password", user_pw, T_OP_EQ);
+      if (vp == NULL)
+       return rs_err_conn_push_fl (conn, RSE_FR, __FILE__, __LINE__,
+                                   "pairmake: %s", fr_strerror ());
+      pairadd (&pkt->rpkt->vps, vp);
+    }
 
-void
-rs_packet_add_attr (struct rs_packet *pkt, struct rs_attr *attr)
-{
-  pairadd (&pkt->rpkt->vps, attr->vp);
-  attr->pkt = pkt;
+  return RSE_OK;
 }
 
 struct radius_packet *
@@ -187,11 +188,10 @@ rs_packet_frpkt (struct rs_packet *pkt)
 void
 rs_packet_destroy (struct rs_packet *pkt)
 {
-  if (pkt)
-    {
-      // FIXME: memory leak! TODO: free all attributes
-      rad_free (&pkt->rpkt);
-      rs_free (pkt->conn->ctx, pkt);
-    }
-}
+  assert (pkt);
+  assert (pkt->conn);
+  assert (pkt->conn->ctx);
 
+  rad_free (&pkt->rpkt); /* Note: This frees the VALUE_PAIR's too.  */
+  rs_free (pkt->conn->ctx, pkt);
+}