diff options
-rw-r--r-- | socket.c | 27 | ||||
-rw-r--r-- | socket.h | 7 |
2 files changed, 33 insertions, 1 deletions
@@ -92,6 +92,31 @@ static int handle_plugin(const char *host, } #endif /* HAVE_SOCKETPAIR */ +#ifdef __UNUSED__ +#include <sys/time.h> + +int SockCheckOpen(int fd) +/* poll given socket; is it selectable? */ +{ + fd_set r, w, e; + int rt; + struct timeval tv; + + for (;;) + { + FD_ZERO(&r); FD_ZERO(&w); FD_ZERO(&e); + FD_SET(fd, &e); + + tv.tv_sec = 0; tv.tv_usec = 0; + rt = select(fd+1, &r, &w, &e, &tv); + if (rt == -1 && (errno != EAGAIN && errno != EINTR)) + return 0; + if (rt != -1) + return 1; + } +} +#endif /* __UNUSED__ */ + #if INET6 int SockOpen(const char *host, const char *service, const char *options, const char *plugin) @@ -148,7 +173,7 @@ int SockOpen(const char *host, const char *service, const char *options, int SockOpen(const char *host, int clientPort, const char *options, const char *plugin) { - int sock; + int sock = -1; /* pacify -Wall */ #ifndef HAVE_INET_ATON unsigned long inaddr; #endif /* HAVE_INET_ATON */ @@ -16,6 +16,13 @@ int SockOpen(const char *host, int clientPort, const char *options, const char *plugin); #endif /* INET6 */ +/* Returns 1 if this socket is OK, 0 if it isn't select()able + * on - probably because it's been closed. You should + * always check this function before passing stuff to the + * select()-based waiter, as otherwise it may loop. + */ +int SockCheckOpen(int fd); + /* Get a string terminated by an '\n' (matches interface of fgets). Pass it a valid socket, a buffer for the string, and |