Nalin Dahyabhai 4e66f12
Pulled from SVN, then munged to apply to 1.9.  Modifies cm.h so that a
Nalin Dahyabhai 4e66f12
struct select_state has an alternate layout when USE_POLL is defined,
Nalin Dahyabhai 4e66f12
and if we detect <poll.h> at configure-time, have sendto_kdc.c define
Nalin Dahyabhai 4e66f12
USE_POLL to force its use.  Adapts sendto_kdc.c to handle both cases,
Nalin Dahyabhai 4e66f12
so that the previous behavior is preserved when <poll.h> is not found.
Nalin Dahyabhai 4e66f12
RT#6905
Nalin Dahyabhai 4e66f12
Nalin Dahyabhai 4e66f12
Index: src/include/cm.h
Nalin Dahyabhai 4e66f12
===================================================================
Nalin Dahyabhai 4e66f12
--- src/include/cm.h	(revision 24907)
Nalin Dahyabhai 4e66f12
+++ src/include/cm.h	(revision 24908)
Nalin Dahyabhai 4e66f12
@@ -24,11 +24,20 @@
Nalin Dahyabhai 4e66f12
  * or implied warranty.
Nalin Dahyabhai 4e66f12
  */
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
-/* Since fd_set is large on some platforms (8K on AIX 5.2), this
Nalin Dahyabhai 4e66f12
-   probably shouldn't be allocated in automatic storage.  */
Nalin Dahyabhai 4e66f12
+/*
Nalin Dahyabhai 4e66f12
+ * Since fd_set is large on some platforms (8K on AIX 5.2), this probably
Nalin Dahyabhai 4e66f12
+ * shouldn't be allocated in automatic storage.  Define USE_POLL and
Nalin Dahyabhai 4e66f12
+ * MAX_POLLFDS in the consumer of this header file to use poll state instead of
Nalin Dahyabhai 4e66f12
+ * select state.
Nalin Dahyabhai 4e66f12
+ */
Nalin Dahyabhai 4e66f12
 struct select_state {
Nalin Dahyabhai 4e66f12
-    int max, nfds;
Nalin Dahyabhai 4e66f12
+#ifdef USE_POLL
Nalin Dahyabhai 4e66f12
+    struct pollfd fds[MAX_POLLFDS];
Nalin Dahyabhai 4e66f12
+#else
Nalin Dahyabhai 4e66f12
+    int max;
Nalin Dahyabhai 4e66f12
     fd_set rfds, wfds, xfds;
Nalin Dahyabhai 4e66f12
+#endif
Nalin Dahyabhai 4e66f12
+    int nfds;
Nalin Dahyabhai 4e66f12
     struct timeval end_time;    /* magic: tv_sec==0 => never time out */
Nalin Dahyabhai 4e66f12
 };
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
Index: src/configure.in
Nalin Dahyabhai 4e66f12
===================================================================
Nalin Dahyabhai 4e66f12
--- src/configure.in	(revision 24907)
Nalin Dahyabhai 4e66f12
+++ src/configure.in	(revision 24908)
Nalin Dahyabhai 4e66f12
@@ -67,7 +67,7 @@
Nalin Dahyabhai 4e66f12
 ])
Nalin Dahyabhai 4e66f12
 AC_SUBST(LIBUTIL)
Nalin Dahyabhai 4e66f12
 # for kdc
Nalin Dahyabhai 4e66f12
-AC_CHECK_HEADERS(syslog.h stdarg.h sys/select.h sys/sockio.h ifaddrs.h unistd.h)
Nalin Dahyabhai 4e66f12
+AC_CHECK_HEADERS(syslog.h stdarg.h sys/sockio.h ifaddrs.h unistd.h)
Nalin Dahyabhai 4e66f12
 AC_CHECK_FUNCS(openlog syslog closelog strftime vsprintf vasprintf vsnprintf)
Nalin Dahyabhai 4e66f12
 AC_CHECK_FUNCS(strlcpy)
Nalin Dahyabhai 4e66f12
 EXTRA_SUPPORT_SYMS=
Nalin Dahyabhai 4e66f12
@@ -472,7 +472,7 @@
Nalin Dahyabhai 4e66f12
   AC_DEFINE(POSIX_TERMIOS,1,[Define if termios.h exists and tcsetattr exists]))])
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
 KRB5_SIGTYPE
Nalin Dahyabhai 4e66f12
-AC_CHECK_HEADERS(stdlib.h string.h stddef.h sys/types.h sys/file.h sys/param.h sys/stat.h sys/time.h netinet/in.h sys/uio.h sys/filio.h sys/select.h time.h paths.h errno.h)
Nalin Dahyabhai 4e66f12
+AC_CHECK_HEADERS(poll.h stdlib.h string.h stddef.h sys/types.h sys/file.h sys/param.h sys/stat.h sys/time.h netinet/in.h sys/uio.h sys/filio.h sys/select.h time.h paths.h errno.h)
Nalin Dahyabhai 4e66f12
 AC_HEADER_STDARG
Nalin Dahyabhai 4e66f12
 KRB5_AC_INET6
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
Index: src/lib/krb5/os/cm.c
Nalin Dahyabhai 4e66f12
===================================================================
Nalin Dahyabhai 4e66f12
--- src/lib/krb5/os/cm.c	(revision 0)
Nalin Dahyabhai 4e66f12
+++ src/lib/krb5/os/cm.c	(revision 24908)
Nalin Dahyabhai 4e66f12
@@ -0,0 +1,97 @@
Nalin Dahyabhai 4e66f12
+/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
Nalin Dahyabhai 4e66f12
+/* lib/krb5/os/cm.c - Connection manager functions */
Nalin Dahyabhai 4e66f12
+/*
Nalin Dahyabhai 4e66f12
+ * Copyright (C) 2011 by the Massachusetts Institute of Technology.
Nalin Dahyabhai 4e66f12
+ * All rights reserved.
Nalin Dahyabhai 4e66f12
+ *
Nalin Dahyabhai 4e66f12
+ * Export of this software from the United States of America may
Nalin Dahyabhai 4e66f12
+ *   require a specific license from the United States Government.
Nalin Dahyabhai 4e66f12
+ *   It is the responsibility of any person or organization contemplating
Nalin Dahyabhai 4e66f12
+ *   export to obtain such a license before exporting.
Nalin Dahyabhai 4e66f12
+ *
Nalin Dahyabhai 4e66f12
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
Nalin Dahyabhai 4e66f12
+ * distribute this software and its documentation for any purpose and
Nalin Dahyabhai 4e66f12
+ * without fee is hereby granted, provided that the above copyright
Nalin Dahyabhai 4e66f12
+ * notice appear in all copies and that both that copyright notice and
Nalin Dahyabhai 4e66f12
+ * this permission notice appear in supporting documentation, and that
Nalin Dahyabhai 4e66f12
+ * the name of M.I.T. not be used in advertising or publicity pertaining
Nalin Dahyabhai 4e66f12
+ * to distribution of the software without specific, written prior
Nalin Dahyabhai 4e66f12
+ * permission.  Furthermore if you modify this software you must label
Nalin Dahyabhai 4e66f12
+ * your software as modified software and not distribute it in such a
Nalin Dahyabhai 4e66f12
+ * fashion that it might be confused with the original M.I.T. software.
Nalin Dahyabhai 4e66f12
+ * M.I.T. makes no representations about the suitability of
Nalin Dahyabhai 4e66f12
+ * this software for any purpose.  It is provided "as is" without express
Nalin Dahyabhai 4e66f12
+ * or implied warranty.
Nalin Dahyabhai 4e66f12
+ */
Nalin Dahyabhai 4e66f12
+
Nalin Dahyabhai 4e66f12
+/*
Nalin Dahyabhai 4e66f12
+ * This file include krb5int_cm_call_select, which is used by
Nalin Dahyabhai 4e66f12
+ * lib/apputils/net-server.c and sometimes by sendto_kdc.c.
Nalin Dahyabhai 4e66f12
+ */
Nalin Dahyabhai 4e66f12
+
Nalin Dahyabhai 4e66f12
+#include "k5-int.h"
Nalin Dahyabhai 4e66f12
+#ifdef HAVE_SYS_SELECT_H
Nalin Dahyabhai 4e66f12
+#include <sys/select.h>
Nalin Dahyabhai 4e66f12
+#endif
Nalin Dahyabhai 4e66f12
+#ifdef _WIN32
Nalin Dahyabhai 4e66f12
+#include <sys/timeb.h>
Nalin Dahyabhai 4e66f12
+#endif
Nalin Dahyabhai 4e66f12
+#include "cm.h"
Nalin Dahyabhai 4e66f12
+
Nalin Dahyabhai 4e66f12
+int
Nalin Dahyabhai 4e66f12
+k5_getcurtime(struct timeval *tvp)
Nalin Dahyabhai 4e66f12
+{
Nalin Dahyabhai 4e66f12
+#ifdef _WIN32
Nalin Dahyabhai 4e66f12
+    struct _timeb tb;
Nalin Dahyabhai 4e66f12
+    _ftime(&tb);
Nalin Dahyabhai 4e66f12
+    tvp->tv_sec = tb.time;
Nalin Dahyabhai 4e66f12
+    tvp->tv_usec = tb.millitm * 1000;
Nalin Dahyabhai 4e66f12
+    /* Can _ftime fail?  */
Nalin Dahyabhai 4e66f12
+    return 0;
Nalin Dahyabhai 4e66f12
+#else
Nalin Dahyabhai 4e66f12
+    if (gettimeofday(tvp, 0))
Nalin Dahyabhai 4e66f12
+        return errno;
Nalin Dahyabhai 4e66f12
+    return 0;
Nalin Dahyabhai 4e66f12
+#endif
Nalin Dahyabhai 4e66f12
+}
Nalin Dahyabhai 4e66f12
+
Nalin Dahyabhai 4e66f12
+/*
Nalin Dahyabhai 4e66f12
+ * Call select and return results.
Nalin Dahyabhai 4e66f12
+ * Input: interesting file descriptors and absolute timeout
Nalin Dahyabhai 4e66f12
+ * Output: select return value (-1 or num fds ready) and fd_sets
Nalin Dahyabhai 4e66f12
+ * Return: 0 (for i/o available or timeout) or error code.
Nalin Dahyabhai 4e66f12
+ */
Nalin Dahyabhai 4e66f12
+krb5_error_code
Nalin Dahyabhai 4e66f12
+krb5int_cm_call_select (const struct select_state *in,
Nalin Dahyabhai 4e66f12
+                        struct select_state *out, int *sret)
Nalin Dahyabhai 4e66f12
+{
Nalin Dahyabhai 4e66f12
+    struct timeval now, *timo;
Nalin Dahyabhai 4e66f12
+    krb5_error_code e;
Nalin Dahyabhai 4e66f12
+
Nalin Dahyabhai 4e66f12
+    *out = *in;
Nalin Dahyabhai 4e66f12
+    e = k5_getcurtime(&now;;
Nalin Dahyabhai 4e66f12
+    if (e)
Nalin Dahyabhai 4e66f12
+        return e;
Nalin Dahyabhai 4e66f12
+    if (out->end_time.tv_sec == 0)
Nalin Dahyabhai 4e66f12
+        timo = 0;
Nalin Dahyabhai 4e66f12
+    else {
Nalin Dahyabhai 4e66f12
+        timo = &out->end_time;
Nalin Dahyabhai 4e66f12
+        out->end_time.tv_sec -= now.tv_sec;
Nalin Dahyabhai 4e66f12
+        out->end_time.tv_usec -= now.tv_usec;
Nalin Dahyabhai 4e66f12
+        if (out->end_time.tv_usec < 0) {
Nalin Dahyabhai 4e66f12
+            out->end_time.tv_usec += 1000000;
Nalin Dahyabhai 4e66f12
+            out->end_time.tv_sec--;
Nalin Dahyabhai 4e66f12
+        }
Nalin Dahyabhai 4e66f12
+        if (out->end_time.tv_sec < 0) {
Nalin Dahyabhai 4e66f12
+            *sret = 0;
Nalin Dahyabhai 4e66f12
+            return 0;
Nalin Dahyabhai 4e66f12
+        }
Nalin Dahyabhai 4e66f12
+    }
Nalin Dahyabhai 4e66f12
+
Nalin Dahyabhai 4e66f12
+    *sret = select(out->max, &out->rfds, &out->wfds, &out->xfds, timo);
Nalin Dahyabhai 4e66f12
+    e = SOCKET_ERRNO;
Nalin Dahyabhai 4e66f12
+
Nalin Dahyabhai 4e66f12
+    if (*sret < 0)
Nalin Dahyabhai 4e66f12
+        return e;
Nalin Dahyabhai 4e66f12
+    return 0;
Nalin Dahyabhai 4e66f12
+}
Nalin Dahyabhai 4e66f12
Index: src/lib/krb5/os/Makefile.in
Nalin Dahyabhai 4e66f12
===================================================================
Nalin Dahyabhai 4e66f12
--- src/lib/krb5/os/Makefile.in	(revision 24907)
Nalin Dahyabhai 4e66f12
+++ src/lib/krb5/os/Makefile.in	(revision 24908)
Nalin Dahyabhai 4e66f12
@@ -18,6 +18,7 @@
Nalin Dahyabhai 4e66f12
 	def_realm.o	\
Nalin Dahyabhai 4e66f12
 	ccdefname.o	\
Nalin Dahyabhai 4e66f12
 	changepw.o	\
Nalin Dahyabhai 4e66f12
+	cm.o		\
Nalin Dahyabhai 4e66f12
 	dnsglue.o	\
Nalin Dahyabhai 4e66f12
 	dnssrv.o	\
Nalin Dahyabhai 4e66f12
 	free_krbhs.o	\
Nalin Dahyabhai 4e66f12
@@ -62,6 +63,7 @@
Nalin Dahyabhai 4e66f12
 	$(OUTPRE)def_realm.$(OBJEXT)	\
Nalin Dahyabhai 4e66f12
 	$(OUTPRE)ccdefname.$(OBJEXT)	\
Nalin Dahyabhai 4e66f12
 	$(OUTPRE)changepw.$(OBJEXT)	\
Nalin Dahyabhai 4e66f12
+	$(OUTPRE)cm.$(OBJEXT)		\
Nalin Dahyabhai 4e66f12
 	$(OUTPRE)dnsglue.$(OBJEXT)	\
Nalin Dahyabhai 4e66f12
 	$(OUTPRE)dnssrv.$(OBJEXT)	\
Nalin Dahyabhai 4e66f12
 	$(OUTPRE)free_krbhs.$(OBJEXT)	\
Nalin Dahyabhai 4e66f12
@@ -106,6 +108,7 @@
Nalin Dahyabhai 4e66f12
 	$(srcdir)/def_realm.c	\
Nalin Dahyabhai 4e66f12
 	$(srcdir)/ccdefname.c	\
Nalin Dahyabhai 4e66f12
 	$(srcdir)/changepw.c	\
Nalin Dahyabhai 4e66f12
+	$(srcdir)/cm.c		\
Nalin Dahyabhai 4e66f12
 	$(srcdir)/dnsglue.c	\
Nalin Dahyabhai 4e66f12
 	$(srcdir)/dnssrv.c	\
Nalin Dahyabhai 4e66f12
 	$(srcdir)/free_krbhs.c	\
Nalin Dahyabhai 4e66f12
Index: src/lib/krb5/os/os-proto.h
Nalin Dahyabhai 4e66f12
===================================================================
Nalin Dahyabhai 4e66f12
--- src/lib/krb5/os/os-proto.h	(revision 24907)
Nalin Dahyabhai 4e66f12
+++ src/lib/krb5/os/os-proto.h	(revision 24908)
Nalin Dahyabhai 4e66f12
@@ -32,6 +32,10 @@
Nalin Dahyabhai 4e66f12
 #ifndef KRB5_LIBOS_INT_PROTO__
Nalin Dahyabhai 4e66f12
 #define KRB5_LIBOS_INT_PROTO__
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
+#ifdef HAVE_SYS_TIME_H
Nalin Dahyabhai 4e66f12
+#include <sys/time.h>
Nalin Dahyabhai 4e66f12
+#endif
Nalin Dahyabhai 4e66f12
+
Nalin Dahyabhai 4e66f12
 struct addrlist;
Nalin Dahyabhai 4e66f12
 krb5_error_code krb5_locate_kdc(krb5_context, const krb5_data *,
Nalin Dahyabhai 4e66f12
                                 struct addrlist *, int, int, int);
Nalin Dahyabhai 4e66f12
@@ -101,6 +105,8 @@
Nalin Dahyabhai 4e66f12
 /* The io vector is *not* const here, unlike writev()!  */
Nalin Dahyabhai 4e66f12
 int krb5int_net_writev (krb5_context, int, sg_buf *, int);
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
+int k5_getcurtime(struct timeval *tvp);
Nalin Dahyabhai 4e66f12
+
Nalin Dahyabhai 4e66f12
 #include "k5-thread.h"
Nalin Dahyabhai 4e66f12
 extern k5_mutex_t krb5int_us_time_mutex;
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
Index: src/lib/krb5/os/sendto_kdc.c
Nalin Dahyabhai 4e66f12
===================================================================
Nalin Dahyabhai 4e66f12
--- src/lib/krb5/os/sendto_kdc.c	(revision 24907)
Nalin Dahyabhai 4e66f12
+++ src/lib/krb5/os/sendto_kdc.c	(revision 24908)
Nalin Dahyabhai 4e66f12
@@ -30,17 +30,16 @@
Nalin Dahyabhai 4e66f12
 #include "fake-addrinfo.h"
Nalin Dahyabhai 4e66f12
 #include "k5-int.h"
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
-#ifdef HAVE_SYS_TIME_H
Nalin Dahyabhai 4e66f12
-#include <sys/time.h>
Nalin Dahyabhai 4e66f12
-#else
Nalin Dahyabhai 4e66f12
-#include <time.h>
Nalin Dahyabhai 4e66f12
-#endif
Nalin Dahyabhai 4e66f12
 #include "os-proto.h"
Nalin Dahyabhai 4e66f12
 #ifdef _WIN32
Nalin Dahyabhai 4e66f12
 #include <sys/timeb.h>
Nalin Dahyabhai 4e66f12
 #endif
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
-#ifdef _AIX
Nalin Dahyabhai 4e66f12
+#if defined(HAVE_POLL_H)
Nalin Dahyabhai 4e66f12
+#include <poll.h>
Nalin Dahyabhai 4e66f12
+#define USE_POLL
Nalin Dahyabhai 4e66f12
+#define MAX_POLLFDS 1024
Nalin Dahyabhai 4e66f12
+#elif defined(HAVE_SYS_SELECT_H)
Nalin Dahyabhai 4e66f12
 #include <sys/select.h>
Nalin Dahyabhai 4e66f12
 #endif
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
@@ -168,29 +167,6 @@
Nalin Dahyabhai 4e66f12
                 p = strerror(err);
Nalin Dahyabhai 4e66f12
             putstr(p);
Nalin Dahyabhai 4e66f12
             break;
Nalin Dahyabhai 4e66f12
-        case 'F':
Nalin Dahyabhai 4e66f12
-            /* %F => fd_set *, fd_set *, fd_set *, int */
Nalin Dahyabhai 4e66f12
-            rfds = va_arg(args, fd_set *);
Nalin Dahyabhai 4e66f12
-            wfds = va_arg(args, fd_set *);
Nalin Dahyabhai 4e66f12
-            xfds = va_arg(args, fd_set *);
Nalin Dahyabhai 4e66f12
-            maxfd = va_arg(args, int);
Nalin Dahyabhai 4e66f12
-
Nalin Dahyabhai 4e66f12
-            for (i = 0; i < maxfd; i++) {
Nalin Dahyabhai 4e66f12
-                int r = FD_ISSET(i, rfds);
Nalin Dahyabhai 4e66f12
-                int w = wfds && FD_ISSET(i, wfds);
Nalin Dahyabhai 4e66f12
-                int x = xfds && FD_ISSET(i, xfds);
Nalin Dahyabhai 4e66f12
-                if (r || w || x) {
Nalin Dahyabhai 4e66f12
-                    putf(" %d", i);
Nalin Dahyabhai 4e66f12
-                    if (r)
Nalin Dahyabhai 4e66f12
-                        putstr("r");
Nalin Dahyabhai 4e66f12
-                    if (w)
Nalin Dahyabhai 4e66f12
-                        putstr("w");
Nalin Dahyabhai 4e66f12
-                    if (x)
Nalin Dahyabhai 4e66f12
-                        putstr("x");
Nalin Dahyabhai 4e66f12
-                }
Nalin Dahyabhai 4e66f12
-            }
Nalin Dahyabhai 4e66f12
-            putstr(" ");
Nalin Dahyabhai 4e66f12
-            break;
Nalin Dahyabhai 4e66f12
         case 's':
Nalin Dahyabhai 4e66f12
             /* %s => char * */
Nalin Dahyabhai 4e66f12
             p = va_arg(args, const char *);
Nalin Dahyabhai 4e66f12
@@ -437,75 +413,154 @@
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
 #include "cm.h"
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
-static int
Nalin Dahyabhai 4e66f12
-getcurtime (struct timeval *tvp)
Nalin Dahyabhai 4e66f12
+/*
Nalin Dahyabhai 4e66f12
+ * Currently only sendto_kdc.c knows how to use poll(); the other candidate
Nalin Dahyabhai 4e66f12
+ * user, lib/apputils/net-server.c, is stuck using select() for the moment
Nalin Dahyabhai 4e66f12
+ * since it is entangled with the RPC library.  The following cm_* functions
Nalin Dahyabhai 4e66f12
+ * are not fully generic, are O(n^2) in the poll case, and are limited to
Nalin Dahyabhai 4e66f12
+ * handling 1024 connections (in order to maintain a constant-sized selstate).
Nalin Dahyabhai 4e66f12
+ * More rearchitecting would be appropriate before extending this support to
Nalin Dahyabhai 4e66f12
+ * the KDC and kadmind.
Nalin Dahyabhai 4e66f12
+ */
Nalin Dahyabhai 4e66f12
+
Nalin Dahyabhai 4e66f12
+static void
Nalin Dahyabhai 4e66f12
+cm_init_selstate(struct select_state *selstate)
Nalin Dahyabhai 4e66f12
 {
Nalin Dahyabhai 4e66f12
-#ifdef _WIN32
Nalin Dahyabhai 4e66f12
-    struct _timeb tb;
Nalin Dahyabhai 4e66f12
-    _ftime(&tb);
Nalin Dahyabhai 4e66f12
-    tvp->tv_sec = tb.time;
Nalin Dahyabhai 4e66f12
-    tvp->tv_usec = tb.millitm * 1000;
Nalin Dahyabhai 4e66f12
-    /* Can _ftime fail?  */
Nalin Dahyabhai 4e66f12
-    return 0;
Nalin Dahyabhai 4e66f12
+    selstate->nfds = 0;
Nalin Dahyabhai 4e66f12
+    selstate->end_time.tv_sec = selstate->end_time.tv_usec = 0;
Nalin Dahyabhai 4e66f12
+#ifndef USE_POLL
Nalin Dahyabhai 4e66f12
+    selstate->max = 0;
Nalin Dahyabhai 4e66f12
+    selstate->nfds = 0;
Nalin Dahyabhai 4e66f12
+    FD_ZERO(&selstate->rfds);
Nalin Dahyabhai 4e66f12
+    FD_ZERO(&selstate->wfds);
Nalin Dahyabhai 4e66f12
+    FD_ZERO(&selstate->xfds);
Nalin Dahyabhai 4e66f12
+#endif
Nalin Dahyabhai 4e66f12
+}
Nalin Dahyabhai 4e66f12
+
Nalin Dahyabhai 4e66f12
+static krb5_boolean
Nalin Dahyabhai 4e66f12
+cm_add_fd(struct select_state *selstate, int fd, unsigned int ssflags)
Nalin Dahyabhai 4e66f12
+{
Nalin Dahyabhai 4e66f12
+#ifdef USE_POLL
Nalin Dahyabhai 4e66f12
+    if (selstate->nfds >= MAX_POLLFDS)
Nalin Dahyabhai 4e66f12
+        return FALSE;
Nalin Dahyabhai 4e66f12
+    selstate->fds[selstate->nfds].fd = fd;
Nalin Dahyabhai 4e66f12
+    selstate->fds[selstate->nfds].events = 0;
Nalin Dahyabhai 4e66f12
+    if (ssflags & SSF_READ)
Nalin Dahyabhai 4e66f12
+        selstate->fds[selstate->nfds].events |= POLLIN;
Nalin Dahyabhai 4e66f12
+    if (ssflags & SSF_WRITE)
Nalin Dahyabhai 4e66f12
+        selstate->fds[selstate->nfds].events |= POLLOUT;
Nalin Dahyabhai 4e66f12
 #else
Nalin Dahyabhai 4e66f12
-    if (gettimeofday(tvp, 0)) {
Nalin Dahyabhai 4e66f12
-        dperror("gettimeofday");
Nalin Dahyabhai 4e66f12
-        return errno;
Nalin Dahyabhai 4e66f12
+#ifndef _WIN32  /* On Windows FD_SETSIZE is a count, not a max value. */
Nalin Dahyabhai 4e66f12
+    if (fd >= FD_SETSIZE)
Nalin Dahyabhai 4e66f12
+        return FALSE;
Nalin Dahyabhai 4e66f12
+#endif
Nalin Dahyabhai 4e66f12
+    if (ssflags & SSF_READ)
Nalin Dahyabhai 4e66f12
+        FD_SET(fd, &selstate->rfds);
Nalin Dahyabhai 4e66f12
+    if (ssflags & SSF_WRITE)
Nalin Dahyabhai 4e66f12
+        FD_SET(fd, &selstate->wfds);
Nalin Dahyabhai 4e66f12
+    if (ssflags & SSF_EXCEPTION)
Nalin Dahyabhai 4e66f12
+        FD_SET(fd, &selstate->xfds);
Nalin Dahyabhai 4e66f12
+    if (selstate->max <= fd)
Nalin Dahyabhai 4e66f12
+        selstate->max = fd + 1;
Nalin Dahyabhai 4e66f12
+#endif
Nalin Dahyabhai 4e66f12
+    selstate->nfds++;
Nalin Dahyabhai 4e66f12
+    return TRUE;
Nalin Dahyabhai 4e66f12
+}
Nalin Dahyabhai 4e66f12
+
Nalin Dahyabhai 4e66f12
+static void
Nalin Dahyabhai 4e66f12
+cm_remove_fd(struct select_state *selstate, int fd)
Nalin Dahyabhai 4e66f12
+{
Nalin Dahyabhai 4e66f12
+#ifdef USE_POLL
Nalin Dahyabhai 4e66f12
+    int i;
Nalin Dahyabhai 4e66f12
+
Nalin Dahyabhai 4e66f12
+    /* Find the FD in the array and move the last entry to its place. */
Nalin Dahyabhai 4e66f12
+    assert(selstate->nfds > 0);
Nalin Dahyabhai 4e66f12
+    for (i = 0; i < selstate->nfds && selstate->fds[i].fd != fd; i++);
Nalin Dahyabhai 4e66f12
+    assert(i < selstate->nfds);
Nalin Dahyabhai 4e66f12
+    selstate->fds[i] = selstate->fds[selstate->nfds - 1];
Nalin Dahyabhai 4e66f12
+#else
Nalin Dahyabhai 4e66f12
+    FD_CLR(fd, &selstate->rfds);
Nalin Dahyabhai 4e66f12
+    FD_CLR(fd, &selstate->wfds);
Nalin Dahyabhai 4e66f12
+    FD_CLR(fd, &selstate->xfds);
Nalin Dahyabhai 4e66f12
+    if (selstate->max == 1 + fd) {
Nalin Dahyabhai 4e66f12
+        while (selstate->max > 0
Nalin Dahyabhai 4e66f12
+               && ! FD_ISSET(selstate->max-1, &selstate->rfds)
Nalin Dahyabhai 4e66f12
+               && ! FD_ISSET(selstate->max-1, &selstate->wfds)
Nalin Dahyabhai 4e66f12
+               && ! FD_ISSET(selstate->max-1, &selstate->xfds))
Nalin Dahyabhai 4e66f12
+            selstate->max--;
Nalin Dahyabhai 4e66f12
+        dprint("new max_fd + 1 is %d\n", selstate->max);
Nalin Dahyabhai 4e66f12
     }
Nalin Dahyabhai 4e66f12
-    return 0;
Nalin Dahyabhai 4e66f12
 #endif
Nalin Dahyabhai 4e66f12
+    selstate->nfds--;
Nalin Dahyabhai 4e66f12
 }
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
-/*
Nalin Dahyabhai 4e66f12
- * Call select and return results.
Nalin Dahyabhai 4e66f12
- * Input: interesting file descriptors and absolute timeout
Nalin Dahyabhai 4e66f12
- * Output: select return value (-1 or num fds ready) and fd_sets
Nalin Dahyabhai 4e66f12
- * Return: 0 (for i/o available or timeout) or error code.
Nalin Dahyabhai 4e66f12
- */
Nalin Dahyabhai 4e66f12
-krb5_error_code
Nalin Dahyabhai 4e66f12
-krb5int_cm_call_select (const struct select_state *in,
Nalin Dahyabhai 4e66f12
-                        struct select_state *out, int *sret)
Nalin Dahyabhai 4e66f12
+static void
Nalin Dahyabhai 4e66f12
+cm_unset_write(struct select_state *selstate, int fd)
Nalin Dahyabhai 4e66f12
 {
Nalin Dahyabhai 4e66f12
-    struct timeval now, *timo;
Nalin Dahyabhai 4e66f12
-    krb5_error_code e;
Nalin Dahyabhai 4e66f12
+#ifdef USE_POLL
Nalin Dahyabhai 4e66f12
+    int i;
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
-    *out = *in;
Nalin Dahyabhai 4e66f12
-    e = getcurtime(&now;;
Nalin Dahyabhai 4e66f12
-    if (e)
Nalin Dahyabhai 4e66f12
-        return e;
Nalin Dahyabhai 4e66f12
-    if (out->end_time.tv_sec == 0)
Nalin Dahyabhai 4e66f12
-        timo = 0;
Nalin Dahyabhai 4e66f12
+    for (i = 0; i < selstate->nfds && selstate->fds[i].fd != fd; i++);
Nalin Dahyabhai 4e66f12
+    assert(i < selstate->nfds);
Nalin Dahyabhai 4e66f12
+    selstate->fds[i].events &= ~POLLOUT;
Nalin Dahyabhai 4e66f12
+#else
Nalin Dahyabhai 4e66f12
+    FD_CLR(fd, &selstate->wfds);
Nalin Dahyabhai 4e66f12
+#endif
Nalin Dahyabhai 4e66f12
+}
Nalin Dahyabhai 4e66f12
+
Nalin Dahyabhai 4e66f12
+static krb5_error_code
Nalin Dahyabhai 4e66f12
+cm_select_or_poll(const struct select_state *in, struct select_state *out,
Nalin Dahyabhai 4e66f12
+                  int *sret)
Nalin Dahyabhai 4e66f12
+{
Nalin Dahyabhai 4e66f12
+#ifdef USE_POLL
Nalin Dahyabhai 4e66f12
+    struct timeval now;
Nalin Dahyabhai 4e66f12
+    int e, timeout;
Nalin Dahyabhai 4e66f12
+
Nalin Dahyabhai 4e66f12
+    if (in->end_time.tv_sec == 0)
Nalin Dahyabhai 4e66f12
+        timeout = -1;
Nalin Dahyabhai 4e66f12
     else {
Nalin Dahyabhai 4e66f12
-        timo = &out->end_time;
Nalin Dahyabhai 4e66f12
-        out->end_time.tv_sec -= now.tv_sec;
Nalin Dahyabhai 4e66f12
-        out->end_time.tv_usec -= now.tv_usec;
Nalin Dahyabhai 4e66f12
-        if (out->end_time.tv_usec < 0) {
Nalin Dahyabhai 4e66f12
-            out->end_time.tv_usec += 1000000;
Nalin Dahyabhai 4e66f12
-            out->end_time.tv_sec--;
Nalin Dahyabhai 4e66f12
-        }
Nalin Dahyabhai 4e66f12
-        if (out->end_time.tv_sec < 0) {
Nalin Dahyabhai 4e66f12
-            *sret = 0;
Nalin Dahyabhai 4e66f12
-            return 0;
Nalin Dahyabhai 4e66f12
-        }
Nalin Dahyabhai 4e66f12
+        e = k5_getcurtime(&now;;
Nalin Dahyabhai 4e66f12
+        if (e)
Nalin Dahyabhai 4e66f12
+            return e;
Nalin Dahyabhai 4e66f12
+        timeout = (in->end_time.tv_sec - now.tv_sec) * 1000 +
Nalin Dahyabhai 4e66f12
+            (in->end_time.tv_usec - now.tv_usec) / 1000;
Nalin Dahyabhai 4e66f12
     }
Nalin Dahyabhai 4e66f12
-    dprint("selecting on max=%d sockets [%F] timeout %t\n",
Nalin Dahyabhai 4e66f12
-           out->max,
Nalin Dahyabhai 4e66f12
-           &out->rfds, &out->wfds, &out->xfds, out->max,
Nalin Dahyabhai 4e66f12
-           timo);
Nalin Dahyabhai 4e66f12
-    *sret = select(out->max, &out->rfds, &out->wfds, &out->xfds, timo);
Nalin Dahyabhai 4e66f12
+    /* We don't need a separate copy of the selstate for poll, but use one
Nalin Dahyabhai 4e66f12
+     * anyone for consistency with the select wrapper. */
Nalin Dahyabhai 4e66f12
+    *out = *in;
Nalin Dahyabhai 4e66f12
+    *sret = poll(out->fds, out->nfds, timeout);
Nalin Dahyabhai 4e66f12
     e = SOCKET_ERRNO;
Nalin Dahyabhai 4e66f12
+    return (*sret < 0) ? e : 0;
Nalin Dahyabhai 4e66f12
+#else
Nalin Dahyabhai 4e66f12
+    /* Use the select wrapper from cm.c. */
Nalin Dahyabhai 4e66f12
+    return krb5int_cm_call_select(in, out, sret);
Nalin Dahyabhai 4e66f12
+#endif
Nalin Dahyabhai 4e66f12
+}
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
-    dprint("select returns %d", *sret);
Nalin Dahyabhai 4e66f12
-    if (*sret < 0)
Nalin Dahyabhai 4e66f12
-        dprint(", error = %E\n", e);
Nalin Dahyabhai 4e66f12
-    else if (*sret == 0)
Nalin Dahyabhai 4e66f12
-        dprint(" (timeout)\n");
Nalin Dahyabhai 4e66f12
-    else
Nalin Dahyabhai 4e66f12
-        dprint(":%F\n", &out->rfds, &out->wfds, &out->xfds, out->max);
Nalin Dahyabhai 4e66f12
+static unsigned int
Nalin Dahyabhai 4e66f12
+cm_get_ssflags(struct select_state *selstate, int fd)
Nalin Dahyabhai 4e66f12
+{
Nalin Dahyabhai 4e66f12
+    unsigned int ssflags = 0;
Nalin Dahyabhai 4e66f12
+#ifdef USE_POLL
Nalin Dahyabhai 4e66f12
+    int i;
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
-    if (*sret < 0)
Nalin Dahyabhai 4e66f12
-        return e;
Nalin Dahyabhai 4e66f12
-    return 0;
Nalin Dahyabhai 4e66f12
+    for (i = 0; i < selstate->nfds && selstate->fds[i].fd != fd; i++);
Nalin Dahyabhai 4e66f12
+    assert(i < selstate->nfds);
Nalin Dahyabhai 4e66f12
+    if (selstate->fds[i].revents & POLLIN)
Nalin Dahyabhai 4e66f12
+        ssflags |= SSF_READ;
Nalin Dahyabhai 4e66f12
+    if (selstate->fds[i].revents & POLLOUT)
Nalin Dahyabhai 4e66f12
+        ssflags |= SSF_WRITE;
Nalin Dahyabhai 4e66f12
+    if (selstate->fds[i].revents & POLLERR)
Nalin Dahyabhai 4e66f12
+        ssflags |= SSF_EXCEPTION;
Nalin Dahyabhai 4e66f12
+#else
Nalin Dahyabhai 4e66f12
+    if (FD_ISSET(fd, &selstate->rfds))
Nalin Dahyabhai 4e66f12
+        ssflags |= SSF_READ;
Nalin Dahyabhai 4e66f12
+    if (FD_ISSET(fd, &selstate->wfds))
Nalin Dahyabhai 4e66f12
+        ssflags |= SSF_WRITE;
Nalin Dahyabhai 4e66f12
+    if (FD_ISSET(fd, &selstate->xfds))
Nalin Dahyabhai 4e66f12
+        ssflags |= SSF_EXCEPTION;
Nalin Dahyabhai 4e66f12
+#endif
Nalin Dahyabhai 4e66f12
+    return ssflags;
Nalin Dahyabhai 4e66f12
 }
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
 static int service_tcp_fd(krb5_context context, struct conn_state *conn,
Nalin Dahyabhai 4e66f12
@@ -702,6 +757,7 @@
Nalin Dahyabhai 4e66f12
                  krb5_data *callback_buffer)
Nalin Dahyabhai 4e66f12
 {
Nalin Dahyabhai 4e66f12
     int fd, e;
Nalin Dahyabhai 4e66f12
+    unsigned int ssflags;
Nalin Dahyabhai 4e66f12
     struct addrinfo *ai = state->addr;
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
     dprint("start_connection(@%p)\ngetting %s socket in family %d...", state,
Nalin Dahyabhai 4e66f12
@@ -711,14 +767,6 @@
Nalin Dahyabhai 4e66f12
         dprint("socket: %m creating with af %d\n", state->err, ai->ai_family);
Nalin Dahyabhai 4e66f12
         return -1;              /* try other hosts */
Nalin Dahyabhai 4e66f12
     }
Nalin Dahyabhai 4e66f12
-#ifndef _WIN32 /* On Windows FD_SETSIZE is a count, not a max value.  */
Nalin Dahyabhai 4e66f12
-    if (fd >= FD_SETSIZE) {
Nalin Dahyabhai 4e66f12
-        closesocket(fd);
Nalin Dahyabhai 4e66f12
-        state->err = EMFILE;
Nalin Dahyabhai 4e66f12
-        dprint("socket: fd %d too high\n", fd);
Nalin Dahyabhai 4e66f12
-        return -1;
Nalin Dahyabhai 4e66f12
-    }
Nalin Dahyabhai 4e66f12
-#endif
Nalin Dahyabhai 4e66f12
     set_cloexec_fd(fd);
Nalin Dahyabhai 4e66f12
     /* Make it non-blocking.  */
Nalin Dahyabhai 4e66f12
     if (ai->ai_socktype == SOCK_STREAM) {
Nalin Dahyabhai 4e66f12
@@ -801,17 +849,16 @@
Nalin Dahyabhai 4e66f12
         }
Nalin Dahyabhai 4e66f12
     }
Nalin Dahyabhai 4e66f12
 #endif
Nalin Dahyabhai 4e66f12
-    FD_SET(state->fd, &selstate->rfds);
Nalin Dahyabhai 4e66f12
+    ssflags = SSF_READ | SSF_EXCEPTION;
Nalin Dahyabhai 4e66f12
     if (state->state == CONNECTING || state->state == WRITING)
Nalin Dahyabhai 4e66f12
-        FD_SET(state->fd, &selstate->wfds);
Nalin Dahyabhai 4e66f12
-    FD_SET(state->fd, &selstate->xfds);
Nalin Dahyabhai 4e66f12
-    if (selstate->max <= state->fd)
Nalin Dahyabhai 4e66f12
-        selstate->max = state->fd + 1;
Nalin Dahyabhai 4e66f12
-    selstate->nfds++;
Nalin Dahyabhai 4e66f12
+        ssflags |= SSF_WRITE;
Nalin Dahyabhai 4e66f12
+    if (!cm_add_fd(selstate, state->fd, ssflags)) {
Nalin Dahyabhai 4e66f12
+        (void) closesocket(state->fd);
Nalin Dahyabhai 4e66f12
+        state->fd = INVALID_SOCKET;
Nalin Dahyabhai 4e66f12
+        state->state = FAILED;
Nalin Dahyabhai 4e66f12
+        return -1;
Nalin Dahyabhai 4e66f12
+    }
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
-    dprint("new select vectors: %F\n",
Nalin Dahyabhai 4e66f12
-           &selstate->rfds, &selstate->wfds, &selstate->xfds, selstate->max);
Nalin Dahyabhai 4e66f12
-
Nalin Dahyabhai 4e66f12
     return 0;
Nalin Dahyabhai 4e66f12
 }
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
@@ -868,22 +915,11 @@
Nalin Dahyabhai 4e66f12
 kill_conn(struct conn_state *conn, struct select_state *selstate, int err)
Nalin Dahyabhai 4e66f12
 {
Nalin Dahyabhai 4e66f12
     conn->state = FAILED;
Nalin Dahyabhai 4e66f12
+    conn->err = err;
Nalin Dahyabhai 4e66f12
     shutdown(conn->fd, SHUTDOWN_BOTH);
Nalin Dahyabhai 4e66f12
-    FD_CLR(conn->fd, &selstate->rfds);
Nalin Dahyabhai 4e66f12
-    FD_CLR(conn->fd, &selstate->wfds);
Nalin Dahyabhai 4e66f12
-    FD_CLR(conn->fd, &selstate->xfds);
Nalin Dahyabhai 4e66f12
-    conn->err = err;
Nalin Dahyabhai 4e66f12
+    cm_remove_fd(selstate, conn->fd);
Nalin Dahyabhai 4e66f12
     dprint("abandoning connection %d: %m\n", conn->fd, err);
Nalin Dahyabhai 4e66f12
     /* Fix up max fd for next select call.  */
Nalin Dahyabhai 4e66f12
-    if (selstate->max == 1 + conn->fd) {
Nalin Dahyabhai 4e66f12
-        while (selstate->max > 0
Nalin Dahyabhai 4e66f12
-               && ! FD_ISSET(selstate->max-1, &selstate->rfds)
Nalin Dahyabhai 4e66f12
-               && ! FD_ISSET(selstate->max-1, &selstate->wfds)
Nalin Dahyabhai 4e66f12
-               && ! FD_ISSET(selstate->max-1, &selstate->xfds))
Nalin Dahyabhai 4e66f12
-            selstate->max--;
Nalin Dahyabhai 4e66f12
-        dprint("new max_fd + 1 is %d\n", selstate->max);
Nalin Dahyabhai 4e66f12
-    }
Nalin Dahyabhai 4e66f12
-    selstate->nfds--;
Nalin Dahyabhai 4e66f12
 }
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
 /* Check socket for error.  */
Nalin Dahyabhai 4e66f12
@@ -1005,7 +1041,7 @@
Nalin Dahyabhai 4e66f12
             /* Done writing, switch to reading.  */
Nalin Dahyabhai 4e66f12
             /* Don't call shutdown at this point because
Nalin Dahyabhai 4e66f12
              * some implementations cannot deal with half-closed connections.*/
Nalin Dahyabhai 4e66f12
-            FD_CLR(conn->fd, &selstate->wfds);
Nalin Dahyabhai 4e66f12
+            cm_unset_write(selstate, conn->fd);
Nalin Dahyabhai 4e66f12
             /* Q: How do we detect failures to send the remaining data
Nalin Dahyabhai 4e66f12
                to the remote side, since we're in non-blocking mode?
Nalin Dahyabhai 4e66f12
                Will we always get errors on the reading side?  */
Nalin Dahyabhai 4e66f12
@@ -1125,7 +1161,8 @@
Nalin Dahyabhai 4e66f12
     while (selstate->nfds > 0) {
Nalin Dahyabhai 4e66f12
         unsigned int i;
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
-        e = krb5int_cm_call_select(selstate, seltemp, &selret);
Nalin Dahyabhai 4e66f12
+        selret = 0;
Nalin Dahyabhai 4e66f12
+        e = cm_select_or_poll(selstate, seltemp, &selret);
Nalin Dahyabhai 4e66f12
         if (e == EINTR)
Nalin Dahyabhai 4e66f12
             continue;
Nalin Dahyabhai 4e66f12
         if (e != 0)
Nalin Dahyabhai 4e66f12
@@ -1149,18 +1149,12 @@ service_fds (krb5_context context,
Nalin Dahyabhai 4e66f12
             return 0;
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
         /* Got something on a socket, process it.  */
Nalin Dahyabhai 4e66f12
-        for (i = 0; i <= (unsigned int)selstate->max && selret > 0 && i < n_conns; i++) {
Nalin Dahyabhai 4e66f12
+        for (i = 0; i < n_conns; i++) {
Nalin Dahyabhai 4e66f12
             int ssflags;
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
             if (conns[i].fd == INVALID_SOCKET)
Nalin Dahyabhai 4e66f12
                 continue;
Nalin Dahyabhai 4e66f12
-            ssflags = 0;
Nalin Dahyabhai 4e66f12
-            if (FD_ISSET(conns[i].fd, &seltemp->rfds))
Nalin Dahyabhai 4e66f12
-                ssflags |= SSF_READ, selret--;
Nalin Dahyabhai 4e66f12
-            if (FD_ISSET(conns[i].fd, &seltemp->wfds))
Nalin Dahyabhai 4e66f12
-                ssflags |= SSF_WRITE, selret--;
Nalin Dahyabhai 4e66f12
-            if (FD_ISSET(conns[i].fd, &seltemp->xfds))
Nalin Dahyabhai 4e66f12
-                ssflags |= SSF_EXCEPTION, selret--;
Nalin Dahyabhai 4e66f12
+            ssflags = cm_get_ssflags(seltemp, conns[i].fd);
Nalin Dahyabhai 4e66f12
             if (!ssflags)
Nalin Dahyabhai 4e66f12
                 continue;
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
@@ -1229,12 +1259,7 @@
Nalin Dahyabhai 4e66f12
         retval = ENOMEM;
Nalin Dahyabhai 4e66f12
         goto egress;
Nalin Dahyabhai 4e66f12
     }
Nalin Dahyabhai 4e66f12
-    sel_state->max = 0;
Nalin Dahyabhai 4e66f12
-    sel_state->nfds = 0;
Nalin Dahyabhai 4e66f12
-    sel_state->end_time.tv_sec = sel_state->end_time.tv_usec = 0;
Nalin Dahyabhai 4e66f12
-    FD_ZERO(&sel_state->rfds);
Nalin Dahyabhai 4e66f12
-    FD_ZERO(&sel_state->wfds);
Nalin Dahyabhai 4e66f12
-    FD_ZERO(&sel_state->xfds);
Nalin Dahyabhai 4e66f12
+    cm_init_selstate(sel_state);
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
     /* Set up connections.  */
Nalin Dahyabhai 4e66f12
@@ -1295,7 +1295,7 @@ krb5int_sendto (krb5_context context, co
Nalin Dahyabhai 4e66f12
                            (callback_info ? &callback_data[host] : NULL)))
Nalin Dahyabhai 4e66f12
                 continue;
Nalin Dahyabhai 4e66f12
 
Nalin Dahyabhai 4e66f12
-            retval = getcurtime(&now;;
Nalin Dahyabhai 4e66f12
+            retval = k5_getcurtime(&now;;
Nalin Dahyabhai 4e66f12
             if (retval)
Nalin Dahyabhai 4e66f12
                 goto egress;
Nalin Dahyabhai 4e66f12
             sel_state->end_time = now;
Nalin Dahyabhai 4e66f12
@@ -1314,7 +1314,7 @@ krb5int_sendto (krb5_context context, co
Nalin Dahyabhai 4e66f12
         }
Nalin Dahyabhai 4e66f12
         if (e)
Nalin Dahyabhai 4e66f12
             break;
Nalin Dahyabhai 4e66f12
-        retval = getcurtime(&now;;
Nalin Dahyabhai 4e66f12
+        retval = k5_getcurtime(&now;;
Nalin Dahyabhai 4e66f12
         if (retval)
Nalin Dahyabhai 4e66f12
             goto egress;
Nalin Dahyabhai 4e66f12
         /* Possible optimization: Find a way to integrate this select