]> granicus.if.org Git - pgbouncer/commitdiff
<usual/safeio.h>
authorMarko Kreen <markokr@gmail.com>
Mon, 11 Jan 2010 06:08:30 +0000 (08:08 +0200)
committerMarko Kreen <markokr@gmail.com>
Tue, 4 May 2010 11:30:50 +0000 (14:30 +0300)
include/bouncer.h
include/util.h
src/util.c

index b415ced53c4ef27687b93f3da0777451712d1d91..b451544873cd6896911c99292cc9d8ac1cb062e7 100644 (file)
@@ -31,6 +31,7 @@
 #include <usual/lookup3.h>
 #include <usual/slab.h>
 #include <usual/socket.h>
+#include <usual/safeio.h>
 
 #include <event.h>
 
index 4bbc91c6fc3d316dc6bc39e1d1b06420e64ac9a6..d784cf5a0a69602eec5e4e8fe2d5170a420df948 100644 (file)
@@ -38,19 +38,6 @@ int log_socket_prefix(enum LogLevel lev, void *ctx, char *dst, unsigned int dstl
                        log_generic(LG_NOISE, sk, ## args); \
        } while (0)
 
-/*
- * non-interruptible operations
- */
-int safe_read(int fd, void *buf, int len)                      _MUSTCHECK;
-int safe_write(int fd, const void *buf, int len)               _MUSTCHECK;
-int safe_recv(int fd, void *buf, int len, int flags)           _MUSTCHECK;
-int safe_send(int fd, const void *buf, int len, int flags)     _MUSTCHECK;
-int safe_close(int fd);
-int safe_recvmsg(int fd, struct msghdr *msg, int flags)                _MUSTCHECK;
-int safe_sendmsg(int fd, const struct msghdr *msg, int flags)  _MUSTCHECK;
-int safe_connect(int fd, const struct sockaddr *sa, socklen_t sa_len)  _MUSTCHECK;
-int safe_accept(int fd, struct sockaddr *sa, socklen_t *sa_len)        _MUSTCHECK;
-
 /*
  * password tools
  */
index 3e3a588e737a309994b1c443d1cd5760c0db187f..9e8f5a044925947875b3ef4a40e0cb08cec95120 100644 (file)
@@ -51,149 +51,6 @@ int log_socket_prefix(enum LogLevel lev, void *ctx, char *dst, unsigned int dstl
 }
 
 
-/*
- * Wrappers for read/write/recv/send that survive interruptions.
- */
-
-int safe_read(int fd, void *buf, int len)
-{
-       int res;
-loop:
-       res = read(fd, buf, len);
-       if (res < 0 && errno == EINTR)
-               goto loop;
-       return res;
-}
-
-int safe_write(int fd, const void *buf, int len)
-{
-       int res;
-loop:
-       res = write(fd, buf, len);
-       if (res < 0 && errno == EINTR)
-               goto loop;
-       return res;
-}
-
-int safe_recv(int fd, void *buf, int len, int flags)
-{
-       int res;
-loop:
-       res = recv(fd, buf, len, flags);
-       if (res < 0 && errno == EINTR)
-               goto loop;
-       if (res < 0)
-               log_noise("safe_recv(%d, %d) = %s", fd, len, strerror(errno));
-       else if (cf_verbose > 2)
-               log_noise("safe_recv(%d, %d) = %d", fd, len, res);
-       return res;
-}
-
-int safe_send(int fd, const void *buf, int len, int flags)
-{
-       int res;
-loop:
-       res = send(fd, buf, len, flags);
-       if (res < 0 && errno == EINTR)
-               goto loop;
-       if (res < 0)
-               log_noise("safe_send(%d, %d) = %s", fd, len, strerror(errno));
-       else if (cf_verbose > 2)
-               log_noise("safe_send(%d, %d) = %d", fd, len, res);
-       return res;
-}
-
-int safe_close(int fd)
-{
-       int res;
-loop:
-       /* by manpage, the close() could be interruptable
-          although it seems that at least in linux it cannot happen */
-#ifndef WIN32
-       res = close(fd);
-#else
-       /* Pending(this is necessary to wait for FIN of a client.) */
-       log_debug("closesocket(%d)",fd);
-       res = closesocket(fd);
-#endif
-       if (res < 0 && errno == EINTR)
-               goto loop;
-       return res;
-}
-
-int safe_recvmsg(int fd, struct msghdr *msg, int flags)
-{
-       int res;
-loop:
-       res = recvmsg(fd, msg, flags);
-       if (res < 0 && errno == EINTR)
-               goto loop;
-       if (res < 0)
-               log_warning("safe_recvmsg(%d, msg, %d) = %s", fd, flags, strerror(errno));
-       else if (cf_verbose > 2)
-               log_noise("safe_recvmsg(%d, msg, %d) = %d", fd, flags, res);
-       return res;
-}
-
-int safe_sendmsg(int fd, const struct msghdr *msg, int flags)
-{
-       int res;
-       int msgerr_count = 0;
-loop:
-       res = sendmsg(fd, msg, flags);
-       if (res < 0 && errno == EINTR)
-               goto loop;
-
-       if (res < 0) {
-               log_warning("safe_sendmsg(%d, msg[%d,%d], %d) = %s", fd,
-                           (int)msg->msg_iov[0].iov_len,
-                           (int)msg->msg_controllen,
-                           flags, strerror(errno));
-
-               /* with ancillary data on blocking socket OSX returns
-                * EMSGSIZE instead of blocking.  try to solve it by waiting */
-               if (errno == EMSGSIZE && msgerr_count < 20) {
-                       struct timeval tv = {1, 0};
-                       log_warning("trying to sleep a bit");
-                       select(0, NULL, NULL, NULL, &tv);
-                       msgerr_count++;
-                       goto loop;
-               }
-       } else if (cf_verbose > 2)
-               log_noise("safe_sendmsg(%d, msg, %d) = %d", fd, flags, res);
-       return res;
-}
-
-int safe_connect(int fd, const struct sockaddr *sa, socklen_t sa_len)
-{
-       int res;
-       char buf[128];
-loop:
-       res = connect(fd, sa, sa_len);
-       if (res < 0 && errno == EINTR)
-               goto loop;
-       if (res < 0 && (errno != EINPROGRESS || cf_verbose > 2))
-               log_noise("connect(%d, %s) = %s", fd, sa2str(sa, buf, sizeof(buf)), strerror(errno));
-       else if (cf_verbose > 2)
-               log_noise("connect(%d, %s) = %d", fd, sa2str(sa, buf, sizeof(buf)), res);
-       return res;
-}
-
-int safe_accept(int fd, struct sockaddr *sa, socklen_t *sa_len_p)
-{
-       int res;
-       char buf[128];
-loop:
-       res = accept(fd, sa, sa_len_p);
-       if (res < 0 && errno == EINTR)
-               goto loop;
-       if (res < 0)
-               log_noise("safe_accept(%d) = %s", fd, strerror(errno));
-       else if (cf_verbose > 2)
-               log_noise("safe_accept(%d) = %d (%s)", fd, res, sa2str(sa, buf, sizeof(buf)));
-       return res;
-}
-
 /*
  * Load a file into malloc()-ed C string.
  */