IO-FDpassData

 view release on metacpan or  search on metacpan

FDpassData.xs  view on Meta::CPAN

      return -1;
    }

    cmsg = CMSG_FIRSTHDR(&msg);
    if (cmsg && cmsg->cmsg_len == CMSG_LEN(sizeof(int))) {
      if (cmsg->cmsg_level != SOL_SOCKET) {
  //fprintf (stderr, "invalid cmsg_level %d\n", cmsg->cmsg_level);
	return -1;
      }
      else if (cmsg->cmsg_type != SCM_RIGHTS) {
 //fprintf (stderr, "invalid cmsg_type %d\n", cmsg->cmsg_type);
	return -1;
      }
      *fd = *((int *) CMSG_DATA(cmsg));
 //printf ("received fd %d\n", *fd);
    } else {
      *fd = -1;
    }
  } else {
    size = read (socket, buf, len);
    *fd = -1;
  }
  return size;
}

MODULE = IO::FDpassData		PACKAGE = IO::FDpassData

PROTOTYPES: ENABLED

int
fd_sendata (socket, b, ...)
	int socket
	SV * b
INIT:
	STRLEN len = 1;
	unsigned char * buf = "\0";	// preset to empty string if message buffer is 'undef'
	int fd;
CODE:
	if (SvOK(b) && SvPOK(b)) {
	  buf = (unsigned char *) SvPV(b,len);
	  if (len == 0)		// zero length string "\0"
	    len = 1;
	}
	if (items == 3 && SvOK(ST(2)) && SvIOK(ST(2))) {
	  fd = (int)SvIV(ST(2));
	} else {
	  fd = -1;
	}
	RETVAL = _fd_sendata(socket, buf, len, fd);
OUTPUT:
	RETVAL


void
fd_recvdata (sock, len)
	int sock
	int len
PREINIT:
	int fd, size;
	unsigned char * buf = malloc(len);
PPCODE:
	size = _fd_recvdata(sock, buf, len, &fd);
	if (size < 0) {			// ERROR
	  free(buf);
	  XSRETURN_EMPTY;
	}
	if (size == 1 && buf[0] == 0x0) {
	  size = 0;
	}
	XPUSHs(sv_2mortal(newSViv(size)));
	if (size == 0) {
	  XPUSHs(sv_2mortal(newSVpvn(buf,0)));
	} else {
	  XPUSHs(sv_2mortal(newSVpvn(buf,size)));
	}
	free(buf);
	if (fd < 0) {
	  XSRETURN(2);
	}
	XPUSHs(sv_2mortal(newSViv(fd)));
	XSRETURN(3);



( run in 2.555 seconds using v1.01-cache-2.11-cpan-71847e10f99 )