]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
librspreload: Support server apps that call fork()
authorSean Hefty <sean.hefty@intel.com>
Fri, 13 Jul 2012 22:25:53 +0000 (15:25 -0700)
committerSean Hefty <sean.hefty@intel.com>
Fri, 13 Jul 2012 22:25:53 +0000 (15:25 -0700)
Provide limited support for applications that call fork() after
accepting a connection.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
src/preload.c

index 2750b301b60daf1c7b35ae60be2007b0cc346318..50430f76b0a7b3feb85c576462660bfc00fb1109 100644 (file)
@@ -92,10 +92,12 @@ static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
 static int sq_size;
 static int rq_size;
 static int sq_inline;
+static int fork_support;
 
 enum fd_type {
        fd_normal,
-       fd_rsocket
+       fd_rsocket,
+       fd_fork
 };
 
 struct fd_info {
@@ -207,6 +209,10 @@ void getenv_options(void)
        var = getenv("RS_INLINE");
        if (var)
                sq_inline = atoi(var);
+
+       var = getenv("RS_FORK");
+       if (var)
+               fork_support = atoi(var);
 }
 
 static void init_preload(void)
@@ -332,8 +338,16 @@ int socket(int domain, int type, int protocol)
        ret = rsocket(domain, type, protocol);
        recursive = 0;
        if (ret >= 0) {
-               fd_store(index, ret, fd_rsocket);
-               set_rsocket_options(ret);
+               if (fork_support) {
+                       rclose(ret);
+                       ret = real_socket(domain, type, protocol);
+                       if (ret < 0)
+                               return ret;
+                       fd_store(index, ret, fd_fork);
+               } else {
+                       fd_store(index, ret, fd_rsocket);
+                       set_rsocket_options(ret);
+               }
                return index;
        }
        fd_close(index, &ret);