]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
rspreload: Add fstat support
authorSean Hefty <sean.hefty@intel.com>
Tue, 7 Aug 2012 16:37:24 +0000 (09:37 -0700)
committerSean Hefty <sean.hefty@intel.com>
Wed, 8 Aug 2012 04:33:31 +0000 (21:33 -0700)
vsftpd calls fstat on a socket.  Fake it out.

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

index b18d31005a4759bef9531ed909c734ff0c22ae8d..53f8543266ebe673b15807e16fcbdf9ccee8c283 100644 (file)
@@ -84,6 +84,7 @@ struct socket_calls {
                          void *optval, socklen_t *optlen);
        int (*fcntl)(int socket, int cmd, ... /* arg */);
        int (*dup2)(int oldfd, int newfd);
+       int (*fxstat64)(int ver, int fd, struct stat64 *buf);
 };
 
 static struct socket_calls real;
@@ -259,6 +260,7 @@ static void init_preload(void)
        real.getsockopt = dlsym(RTLD_NEXT, "getsockopt");
        real.fcntl = dlsym(RTLD_NEXT, "fcntl");
        real.dup2 = dlsym(RTLD_NEXT, "dup2");
+       real.fxstat64 = dlsym(RTLD_NEXT, "__fxstat64");
 
        rs.socket = dlsym(RTLD_DEFAULT, "rsocket");
        rs.bind = dlsym(RTLD_DEFAULT, "rbind");
@@ -961,3 +963,17 @@ int dup2(int oldfd, int newfd)
        atomic_inc(&oldfdi->refcnt);
        return newfd;
 }
+
+int __fxstat64(int ver, int socket, struct stat64 *buf)
+{
+       int fd, ret;
+
+       if (fd_get(socket, &fd) == fd_rsocket) {
+               ret = real.fxstat64(ver, socket, buf);
+               if (!ret)
+                       buf->st_mode = (buf->st_mode & ~S_IFMT) | __S_IFSOCK;
+       } else {
+               ret = real.fxstat64(ver, fd, buf);
+       }
+       return ret;
+}