#include <netinet/tcp.h>
#include <unistd.h>
#include <semaphore.h>
+#include <stdio.h>
+#include <sys/syscall.h>
#include <rdma/rdma_cma.h>
#include <rdma/rdma_verbs.h>
static int sq_inline;
static int fork_support;
+static FILE *fout;
+
enum fd_type {
fd_normal,
fd_rsocket,
rs.getsockopt = dlsym(RTLD_DEFAULT, "rgetsockopt");
rs.fcntl = dlsym(RTLD_DEFAULT, "rfcntl");
+ fout = fopen("rs-out.txt", "w+");
getenv_options();
init = 1;
out:
if (index < 0)
return index;
+ fprintf(fout, "%d socket - %d\n", syscall(SYS_gettid), index);
+ fflush(fout);
recursive = 1;
ret = rsocket(domain, type, protocol);
recursive = 0;
fd_store(index, ret, fd_rsocket);
set_rsocket_options(ret);
}
+ fprintf(fout, "%d socket - %d fd %d type %d\n",
+ syscall(SYS_gettid), index, ret, fd_gett(index));
+ fflush(fout);
return index;
}
fd_close(index, &ret);
enum fd_type type;
type = fd_get(socket, &fd);
+ fprintf(fout, "%d accept fd %d\n", syscall(SYS_gettid), socket);
+ fflush(fout);
if (type == fd_rsocket || type == fd_fork) {
index = fd_open();
if (index < 0)
return ret;
}
+ fprintf(fout, "%d accept fd %d new fd\n", syscall(SYS_gettid), socket, index);
+ fflush(fout);
fd_store(index, ret, type);
return index;
} else {
long flags;
fd = fd_getd(socket);
+ fprintf(fout, "%d fork_active - %d fd %d\n", syscall(SYS_gettid), socket, fd);
+ fflush(fout);
flags = real.fcntl(fd, F_GETFL);
real.fcntl(fd, F_SETFL, 0);
ret = real.connect(fd, addr, addrlen);
uint32_t msg;
fd_get(socket, &sfd);
+ fprintf(fout, "%d fork_passive - %d fd %d\n", syscall(SYS_gettid), socket, sfd);
+ fflush(fout);
len = sizeof sin6;
ret = real.getsockname(sfd, (struct sockaddr *) &sin6, &len);
ret = rlisten(lfd, 1);
if (ret)
goto lclose;
+ fprintf(fout, "%d fork_passive - %d listening for fork\n", syscall(SYS_gettid), socket);
+ fflush(fout);
msg = 0;
len = real.write(sfd, &msg, sizeof msg);
if (len != sizeof msg)
+ {
+ fprintf(fout, "%d fork_passive - %d write failed\n", syscall(SYS_gettid), socket);
+ fflush(fout);
goto lclose;
+ }
dfd = raccept(lfd, NULL, NULL);
if (dfd < 0) {
real.shutdown(sfd, SHUT_RDWR);
real.close(sfd);
fd_store(socket, dfd, fd_rsocket);
+ fprintf(fout, "%d fork_passive success - %d new fd %d\n", syscall(SYS_gettid), socket, dfd);
+ fflush(fout);
lclose:
rclose(lfd);
int ret;
init_preload();
+ fprintf(fout, "%d dup2 %d -> %d\n", syscall(SYS_gettid), oldfd, newfd);
oldfdi = idm_lookup(&idm, oldfd);
if (oldfdi && oldfdi->type == fd_fork)
fork_passive(oldfd);
{
int fd, ret;
+ init_preload();
+ fprintf(fout, "%d fxstat64 socket %d - fd %d type %d\n",
+ syscall(SYS_gettid), socket, fd_getd(socket), fd_gett(socket));
if (fd_get(socket, &fd) == fd_rsocket) {
ret = real.fxstat64(ver, socket, buf);
+ fprintf(fout, "%d fxstat64 - rsocket %d\n", syscall(SYS_gettid), ret);
if (!ret)
buf->st_mode = (buf->st_mode & ~S_IFMT) | __S_IFSOCK;
} else {
ret = real.fxstat64(ver, fd, buf);
+ fprintf(fout, "%d fxstat64 - normal %d\n", syscall(SYS_gettid), ret);
}
+ fflush(fout);
return ret;
}