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 )