#include <sys_defs.h>
#include <errno.h>
#include <unistd.h>
#include <msg.h>
#include <listen.h>
#include <attr.h>
#define PASS_ACCEPT_TMOUT 100
int pass_accept(int listen_fd)
{
const char *myname = "pass_accept";
int accept_fd;
int recv_fd = -1;
accept_fd = LOCAL_ACCEPT(listen_fd);
if (accept_fd < 0) {
if (errno != EAGAIN)
msg_warn("%s: cannot accept connection: %m", myname);
return (-1);
} else {
if (read_wait(accept_fd, PASS_ACCEPT_TMOUT) < 0)
msg_warn("%s: timeout receiving file descriptor: %m", myname);
else if ((recv_fd = LOCAL_RECV_FD(accept_fd)) < 0)
msg_warn("%s: cannot receive file descriptor: %m", myname);
if (close(accept_fd) < 0)
msg_warn("%s: close: %m", myname);
return (recv_fd);
}
}
int pass_accept_attr(int listen_fd, HTABLE **attr)
{
const char *myname = "pass_accept_attr";
int accept_fd;
int recv_fd = -1;
*attr = 0;
accept_fd = LOCAL_ACCEPT(listen_fd);
if (accept_fd < 0) {
if (errno != EAGAIN)
msg_warn("%s: cannot accept connection: %m", myname);
return (-1);
} else {
if (read_wait(accept_fd, PASS_ACCEPT_TMOUT) < 0)
msg_warn("%s: timeout receiving file descriptor: %m", myname);
else if ((recv_fd = LOCAL_RECV_FD(accept_fd)) < 0)
msg_warn("%s: cannot receive file descriptor: %m", myname);
else if (read_wait(accept_fd, PASS_ACCEPT_TMOUT) < 0
|| recv_pass_attr(accept_fd, attr, PASS_ACCEPT_TMOUT, 0) < 0) {
msg_warn("%s: cannot receive connection attributes: %m", myname);
if (close(recv_fd) < 0)
msg_warn("%s: close: %m", myname);
recv_fd = -1;
}
if (close(accept_fd) < 0)
msg_warn("%s: close: %m", myname);
return (recv_fd);
}
}