static int connect_fork(int socket, const struct sockaddr *addr, socklen_t addrlen)
{
+ struct sockaddr_in *sin;
+ int fd, ret;
uint32_t msg;
- int rs, fd, ret;
- fd = fd_getd(socket);
- ret = real_connect(fd, addr, addrlen);
- if (!ret)
+ fd_get(socket, &fd);
+ ret = real.connect(fd, addr, addrlen);
+ if (ret)
return ret;
- ret = real_read(fd, &msg, sizeof msg);
+ ret = real.read(fd, &msg, sizeof msg);
if (ret != sizeof msg)
return ret;
- ret = transpose_socket(socket, &fd, fd_rsocket, rsocket,
- real_close, rclose, real_getsockname,
- real_getsockopt, rsetsockopt,
- real_fcntl, rfcntl);
- return connect(socket, addr, addrlen);
+ ret = transpose_socket(socket, &fd, fd_rsocket);
+ if (ret)
+ return ret;
+
+ return rconnect(fd, addr, addrlen);
}
int connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
struct sockaddr_in *sin;
int fd, ret;
- if (fd_get(socket, &fd) == fd_rsocket) {
+ switch (fd_get(socket, &fd)) {
+ case fd_fork:
+ return connect_fork(socket, addr, addrlen);
+ case fd_rsocket:
sin = (struct sockaddr_in *) addr;
if (ntohs(sin->sin_port) > 1024) {
ret = rconnect(fd, addr, addrlen);