[git] Assuan - branch, master, updated. libassuan-2.4.2-2-g7101fcb

by Werner Koch cvs at cvs.gnupg.org
Fri Jan 15 15:22:57 CET 2016


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "IPC library used by GnuPG".

The branch, master has been updated
       via  7101fcbb662220326f2fc786219c1853f27a5298 (commit)
      from  d271ed79fe690818b1412568417275cc92183143 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 7101fcbb662220326f2fc786219c1853f27a5298
Author: Werner Koch <wk at gnupg.org>
Date:   Fri Jan 15 15:17:26 2016 +0100

    Improve getting of max. number of open fds.
    
    * configure.ac (AC_CHECK_FUNCS): Add getrlimit.
    * src/assuan-pipe-connect.c (MAX_OPEN_FDS): Remove non-used macro.
    * src/system.c (MAX_OPEN_FDS): Remove non-used macro.
    * src/system-posix.c: Include stdint.h, sys/time.h, sys/resource.h.
    (MAX_OPEN_FDS): Remove non-used macro.
    (get_max_fds): New.  Taken from gnupg/common/exechelp-posix.c.
    (__assuan_spawn): Use it here.
    --
    
    This is related to
    GnuPG-bug-id: 2071
    
    Changing of get_max_fds from LPGLv3+ to LGPLv2+ approved by me as sole
    author or that code.
    
    Signed-off-by: Werner Koch <wk at gnupg.org>

diff --git a/configure.ac b/configure.ac
index cd1a80d..755a55c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -360,7 +360,8 @@ AM_PATH_GPG_ERROR(1.17,, AC_MSG_ERROR([libgpg-error was not found]))
 #
 # Checks for library functions.
 #
-AC_CHECK_FUNCS([flockfile funlockfile inet_pton stat getaddrinfo])
+AC_CHECK_FUNCS([flockfile funlockfile inet_pton stat getaddrinfo \
+                getrlimit ])
 
 # On some systems (e.g. Solaris) nanosleep requires linking to librl.
 # Given that we use nanosleep only as an optimization over a select
diff --git a/src/assuan-pipe-connect.c b/src/assuan-pipe-connect.c
index edc8dbb..e5d2a38 100644
--- a/src/assuan-pipe-connect.c
+++ b/src/assuan-pipe-connect.c
@@ -65,13 +65,6 @@
 #endif
 
 
-#ifdef _POSIX_OPEN_MAX
-#define MAX_OPEN_FDS _POSIX_OPEN_MAX
-#else
-#define MAX_OPEN_FDS 20
-#endif
-
-
 /* This should be called to make sure that SIGPIPE gets ignored.  */
 static void
 fix_signals (void)
diff --git a/src/system-posix.c b/src/system-posix.c
index 5bdc676..8ca27e6 100644
--- a/src/system-posix.c
+++ b/src/system-posix.c
@@ -24,21 +24,23 @@
 
 #include <stdlib.h>
 #include <errno.h>
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
 /* Solaris 8 needs sys/types.h before time.h.  */
 #include <sys/types.h>
 #include <time.h>
 #include <fcntl.h>
 #include <sys/wait.h>
+#ifdef HAVE_GETRLIMIT
+# include <sys/time.h>
+# include <sys/resource.h>
+#endif /*HAVE_GETRLIMIT*/
+
 
 #include "assuan-defs.h"
 #include "debug.h"
 
-#ifdef _POSIX_OPEN_MAX
-#define MAX_OPEN_FDS _POSIX_OPEN_MAX
-#else
-#define MAX_OPEN_FDS 20
-#endif
-
 
 
 

@@ -168,6 +170,61 @@ writen (int fd, const char *buffer, size_t length)
 }
 
 
+/* Return the maximum number of currently allowed open file
+ * descriptors.  */
+static int
+get_max_fds (void)
+{
+  int max_fds = -1;
+
+#ifdef HAVE_GETRLIMIT
+  struct rlimit rl;
+
+# ifdef RLIMIT_NOFILE
+  if (!getrlimit (RLIMIT_NOFILE, &rl))
+    max_fds = rl.rlim_max;
+# endif
+
+# ifdef RLIMIT_OFILE
+  if (max_fds == -1 && !getrlimit (RLIMIT_OFILE, &rl))
+    max_fds = rl.rlim_max;
+
+# endif
+#endif /*HAVE_GETRLIMIT*/
+
+#ifdef _SC_OPEN_MAX
+  if (max_fds == -1)
+    {
+      long int scres = sysconf (_SC_OPEN_MAX);
+      if (scres >= 0)
+        max_fds = scres;
+    }
+#endif
+
+#ifdef _POSIX_OPEN_MAX
+  if (max_fds == -1)
+    max_fds = _POSIX_OPEN_MAX;
+#endif
+
+#ifdef OPEN_MAX
+  if (max_fds == -1)
+    max_fds = OPEN_MAX;
+#endif
+
+  if (max_fds == -1)
+    max_fds = 256;  /* Arbitrary limit.  */
+
+  /* AIX returns INT32_MAX instead of a proper value.  We assume that
+     this is always an error and use a more reasonable limit.  */
+#ifdef INT32_MAX
+  if (max_fds == INT32_MAX)
+    max_fds = 256;
+#endif
+
+  return max_fds;
+}
+
+
 int
 __assuan_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name,
 		const char **argv,
@@ -246,9 +303,7 @@ __assuan_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name,
 
       /* Close all files which will not be duped and are not in the
 	 fd_child_list. */
-      n = sysconf (_SC_OPEN_MAX);
-      if (n < 0)
-	n = MAX_OPEN_FDS;
+      n = get_max_fds ();
       for (i = 0; i < n; i++)
 	{
 	  if (i == STDIN_FILENO || i == STDOUT_FILENO || i == STDERR_FILENO)
diff --git a/src/system.c b/src/system.c
index 1fca056..ddb99fb 100644
--- a/src/system.c
+++ b/src/system.c
@@ -36,12 +36,6 @@
 #include "assuan-defs.h"
 #include "debug.h"
 
-#ifdef _POSIX_OPEN_MAX
-#define MAX_OPEN_FDS _POSIX_OPEN_MAX
-#else
-#define MAX_OPEN_FDS 20
-#endif
-
 #define DEBUG_SYSIO 0
 
 
@@ -66,11 +60,11 @@ _assuan_calloc (assuan_context_t ctx, size_t cnt, size_t elsize)
 {
   void *ptr;
   size_t nbytes;
-    
+
   nbytes = cnt * elsize;
 
   /* Check for overflow.  */
-  if (elsize && nbytes / elsize != cnt) 
+  if (elsize && nbytes / elsize != cnt)
     {
       gpg_err_set_errno (ENOMEM);
       return NULL;
@@ -111,7 +105,7 @@ _assuan_system_hooks_copy (assuan_system_hooks_t dst,
   /* Reset the defaults.  */
   if (dst != &_assuan_system_hooks)
     memcpy (dst, &_assuan_system_hooks, sizeof (*dst));
-      
+
   dst->version = ASSUAN_SYSTEM_HOOKS_VERSION;
   if (src->version >= 1)
     {
@@ -164,7 +158,7 @@ _assuan_pipe (assuan_context_t ctx, assuan_fd_t fd[2], int inherit_idx)
   if (err)
     return TRACE_SYSRES (err);
 
-  return TRACE_SUC2 ("read=0x%x, write=0x%x", fd[0], fd[1]); 
+  return TRACE_SUC2 ("read=0x%x, write=0x%x", fd[0], fd[1]);
 }
 
 
@@ -257,7 +251,7 @@ _assuan_recvmsg (assuan_context_t ctx, assuan_fd_t fd, assuan_msghdr_t msg,
 		      cmptr->cmsg_len - (((char *)data) - ((char *)cmptr)),
 		      cmptr->cmsg_level, cmptr->cmsg_type, *(int *)data);
 	}
-    }    
+    }
   return TRACE_SYSRES (res);
 #else
   return (ctx->system.recvmsg) (ctx, fd, msg, flags);
@@ -280,7 +274,7 @@ _assuan_sendmsg (assuan_context_t ctx, assuan_fd_t fd, assuan_msghdr_t msg,
     TRACE_LOG2 ("msg->iov[0] = { iov_base=%p, iov_len=%i }",
 		msg->msg_iov[0].iov_base, msg->msg_iov[0].iov_len);
     TRACE_LOGBUF (msg->msg_iov[0].iov_base, msg->msg_iov[0].iov_len);
-    
+
     cmptr = CMSG_FIRSTHDR (msg);
     if (cmptr)
       {
@@ -358,7 +352,7 @@ _assuan_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name,
 

 /* FIXME: Add some sort of waitpid function that covers GPGME and
    gpg-agent's use of assuan.  */
-pid_t 
+pid_t
 _assuan_waitpid (assuan_context_t ctx, pid_t pid, int action,
 		 int *status, int options)
 {
@@ -384,7 +378,7 @@ _assuan_socketpair (assuan_context_t ctx, int namespace, int style,
   TRACE_BEG4 (ctx, ASSUAN_LOG_SYSIO, "_assuan_socketpair", ctx,
 	      "namespace=%i,style=%i,protocol=%i,filedes=%p",
 	      namespace, style, protocol, filedes);
-  
+
   res = (ctx->system.socketpair) (ctx, namespace, style, protocol, filedes);
   if (res == 0)
     TRACE_LOG2 ("filedes = { 0x%x, 0x%x }", filedes[0], filedes[1]);
@@ -401,7 +395,7 @@ _assuan_socket (assuan_context_t ctx, int namespace, int style, int protocol)
   TRACE_BEG3 (ctx, ASSUAN_LOG_SYSIO, "_assuan_socket", ctx,
 	      "namespace=%i,style=%i,protocol=%i",
 	      namespace, style, protocol);
-  
+
   res = (ctx->system.socket) (ctx, namespace, style, protocol);
   return TRACE_SYSRES (res);
 }
@@ -413,7 +407,7 @@ _assuan_connect (assuan_context_t ctx, int sock, struct sockaddr *addr, socklen_
   int res;
   TRACE_BEG3 (ctx, ASSUAN_LOG_SYSIO, "_assuan_connect", ctx,
 	      "socket=%i,addr=%p,length=%i", sock, addr, length);
-  
+
   res = (ctx->system.connect) (ctx, sock, addr, length);
   return TRACE_SYSRES (res);
 }

-----------------------------------------------------------------------

Summary of changes:
 configure.ac              |  3 +-
 src/assuan-pipe-connect.c |  7 -----
 src/system-posix.c        | 73 +++++++++++++++++++++++++++++++++++++++++------
 src/system.c              | 26 +++++++----------
 4 files changed, 76 insertions(+), 33 deletions(-)


hooks/post-receive
-- 
IPC library used by GnuPG
http://git.gnupg.org




More information about the Gnupg-commits mailing list