AnyEvent-FDpasser
view release on metacpan or search on metacpan
FDpasser.xs view on Meta::CPAN
if (rv != 1) return -1;
rv = ioctl(passer_fd, I_SENDFD, fd_to_send);
if (rv != 0) return -1;
return 1;
}
static int recv_fd(int passer_fd) {
int flag, rv;
struct strbuf dat;
struct strrecvfd recvfd;
char buf[1024];
dat.buf = buf;
dat.maxlen = sizeof(buf);
flag = 0;
rv = getmsg(passer_fd, NULL, &dat, &flag);
if (rv < 0 || dat.len == 0) return -1;
rv = ioctl(passer_fd, I_RECVFD, &recvfd);
if (rv != 0) return -1;
return recvfd.fd;
}
static int fdpasser_mode() {
return 2;
}
/* FIXME: double-check these functions for descriptor leaks */
static int _fdpasser_server(char *path) {
int fds[2];
int filefd;
int rv;
int backup_errno;
unlink(path);
filefd = creat(path, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
if (filefd < 0) {
return -1;
}
close(filefd);
rv = pipe(fds);
if (rv < 0) return -1;
rv = ioctl(fds[1], I_PUSH, "connld");
if (rv != 0) {
backup_errno = errno;
close(fds[0]);
close(fds[1]);
errno = backup_errno;
return -1;
}
rv = fattach(fds[1], path);
if (rv < 0) {
backup_errno = errno;
close(fds[0]);
close(fds[1]);
errno = backup_errno;
return -1;
}
return fds[0];
}
static int _fdpasser_accept(char fd) {
struct strrecvfd recvfd;
int rv;
rv = ioctl(fd, I_RECVFD, &recvfd);
if (rv != 0) {
return -1;
}
return recvfd.fd;
}
static int _fdpasser_connect(char *path) {
int fd;
int rv;
fd = open(path, O_RDWR);
if (fd < 0) {
return -1;
}
rv = isastream(fd);
if (rv != 1) return -2;
return fd;
}
#endif
MODULE = AnyEvent::FDpasser PACKAGE = AnyEvent::FDpasser
PROTOTYPES: ENABLE
int
send_fd(passer_fd, fd_to_send)
int passer_fd
int fd_to_send
int recv_fd(passer_fd)
int passer_fd
int fdpasser_mode()
int _fdpasser_server(path)
char *path
( run in 0.358 second using v1.01-cache-2.11-cpan-e1769b4cff6 )