Add hooks to optionally report local address used when contacting a KDC-like
authorKen Raeburn <raeburn@mit.edu>
Mon, 8 Jul 2002 19:48:36 +0000 (19:48 +0000)
committerKen Raeburn <raeburn@mit.edu>
Mon, 8 Jul 2002 19:48:36 +0000 (19:48 +0000)
service via UDP.  Currently unused, this will eventually be used for MacOS
support for krb524.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@14615 dc483132-0cff-0310-8789-dd5450dbe970

src/include/ChangeLog
src/include/k5-int.h
src/krb524/ChangeLog
src/krb524/sendmsg.c
src/lib/krb5/os/ChangeLog
src/lib/krb5/os/sendto_kdc.c

index f42d22ab201c689cb8d3e3f2814185b5cbe0a720..8b82ec97d322f7ef08d4405e7275db6672614e94 100644 (file)
@@ -1,3 +1,11 @@
+2002-07-07  Ken Raeburn  <raeburn@mit.edu>
+
+       * k5-int.h: Always include socket support headers; don't check
+       NEED_SOCKETS.
+       (krb5int_sendto_udp): Update prototype.
+       (struct _krb5int_access): Update sendto_udp field declaracion to
+       match krb5int_sendto_udp.
+
 2002-07-05  Ken Raeburn  <raeburn@mit.edu>
 
        * port-sockets.h (SOCKET_WRITEV) [!_WIN32]: Use TMP after setting
index 8227c5285d1cf342d871b3e8348f3f75b4391ce0..3e9ac4cf3a493d563dd71b873843692a207bde8b 100644 (file)
@@ -175,7 +175,7 @@ typedef unsigned char       u_char;
 #include <errno.h>
 #include "krb5.h"
 
-#ifdef NEED_SOCKETS
+#if 1 /* def NEED_SOCKETS */
 #include "port-sockets.h"
 #include "socket-utils.h"
 #else
@@ -468,7 +468,8 @@ krb5_error_code krb5_unlock_file (krb5_context, int);
 krb5_error_code krb5_sendto_kdc (krb5_context, const krb5_data *,
                                 const krb5_data *, krb5_data *, int, int);
 krb5_error_code krb5int_sendto_udp (krb5_context, const krb5_data *,
-                                   const struct addrlist *, krb5_data *);
+                                   const struct addrlist *, krb5_data *,
+                                   struct sockaddr *, socklen_t *);
 krb5_error_code krb5int_sendto_tcp (krb5_context context, const krb5_data *,
                                    const struct addrlist *, krb5_data *);
 krb5_error_code krb5_get_krbhst (krb5_context, const krb5_data *, char *** );
@@ -1571,7 +1572,8 @@ typedef struct _krb5int_access {
                                   unsigned int icount, const krb5_data *input,
                                   krb5_data *output);
     krb5_error_code (*sendto_udp) (krb5_context, const krb5_data *msg,
-                                  const struct addrlist *, krb5_data *reply);
+                                  const struct addrlist *, krb5_data *reply,
+                                  struct sockaddr *, socklen_t *);
 } krb5int_access;
 
 #define KRB5INT_ACCESS_VERSION \
index 93585d216e184644f37045dea4ce4a1f7365d92e..c86844a91ee29904f8dd46e12fa94e4b4e80ed39 100644 (file)
@@ -1,3 +1,8 @@
+2002-07-07  Ken Raeburn  <raeburn@mit.edu>
+
+       * sendmsg.c (krb524_sendto_kdc): Update sendto_udp calling
+       sequence; pass 0 for now.
+
 2002-06-14  Tom Yu  <tlyu@mit.edu>
 
        * krb524.h: Change multiple-inclusion test macro to not stomp on
index ef6e996dc18dba77a4e6429f4b0c863bf5393d53..879676b669a480e6ec56bb3852b90e41e2cc5b17 100644 (file)
@@ -108,7 +108,7 @@ krb524_sendto_kdc (context, message, realm, reply)
     if (al.naddrs == 0)
        return KRB5_REALM_UNKNOWN;
 
-    retval = internals.sendto_udp (context, message, &al, reply);
+    retval = internals.sendto_udp (context, message, &al, reply, 0, 0);
     internals.free_addrlist (&al);
     return retval;
 }
index 77aacb761ee201733f269a9360686a116db61916..5407c97f49a45e8d9dc542f3973eebce67e4f269 100644 (file)
@@ -1,3 +1,9 @@
+2002-07-08  Ken Raeburn  <raeburn@mit.edu>
+
+       * sendto_kdc.c (krb5int_sendto_udp): Accept new args for optional
+       location to store local address used to contact server.
+       (krb5_sendto_kdc): Update call to pass 0.
+
 2002-07-05  Ken Raeburn  <raeburn@mit.edu>
 
        * sendto_kdc.c (service_tcp_fd): sockerrlen should have type
index bd05fc57631c906e4fea6f88f31cfc87c246f513..2d64ac3e3a268518d1144111b8cc06b6c14d85d0 100644 (file)
@@ -108,7 +108,8 @@ krb5_sendto_kdc (context, message, realm, reply, use_master, tcp_only)
        && message->length < 1500
        && ! krb5_locate_kdc(context, realm, &addrs, use_master, SOCK_DGRAM)) {
        if (addrs.naddrs > 0) {
-           retval = krb5int_sendto_udp (context, message, &addrs, reply);
+           retval = krb5int_sendto_udp (context, message, &addrs, reply,
+                                        0, 0);
            krb5int_free_addrlist (&addrs);
            if (retval == 0)
                return 0;
@@ -173,7 +174,8 @@ static void print_fdsets (FILE *, fd_set *, fd_set *, fd_set *, int);
 
 krb5_error_code
 krb5int_sendto_udp (krb5_context context, const krb5_data *message,
-                   const struct addrlist *addrs, krb5_data *reply)
+                   const struct addrlist *addrs, krb5_data *reply,
+                   struct sockaddr *localaddr, socklen_t *localaddrlen)
 {
     int host, i;
     unsigned int timeout;
@@ -323,6 +325,15 @@ krb5int_sendto_udp (krb5_context context, const krb5_data *message,
                reply->length = cc;
                retval = 0;
                dfprintf((stderr, "got answer on fd %d\n", socklist[host]));
+               if (localaddr != 0 && localaddrlen != 0 && *localaddrlen > 0) {
+                   if (getsockname(socklist[host], localaddr, localaddrlen) == SOCKET_ERROR) {
+                       /* Don't report it, just go on.  */
+#ifdef DEBUG
+                       dperror("getsockname");
+#endif
+                       *localaddrlen = 0;
+                   }
+               }
                goto out;
            } else if (nready == 0) {
                /* timeout */