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 )