|
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
|