AnyEvent-FDpasser
view release on metacpan or search on metacpan
FDpasser.xs view on Meta::CPAN
#endif
#ifdef FDPASSER_SYSV
#include <unistd.h>
#include <stropts.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
static int send_fd(int passer_fd, int fd_to_send) {
int rv;
char buf[1];
buf[0] = '\0';
rv = write(passer_fd, buf, 1);
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
int _fdpasser_accept(fd)
int fd
int _fdpasser_connect(path)
( run in 2.183 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )