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 )