IO-FD
view release on metacpan or search on metacpan
#define KEVENT kevent
#define KEVENT_S struct kevent
#endif
#define ADJUST_SOCKADDR_SIZE(addr) \
struct sockaddr * a=(struct sockaddr *)SvPVX(addr);\
switch(a->sa_family){\
case AF_INET:\
SvCUR_set(addr, sizeof(struct sockaddr_in));\
break;\
case AF_INET6:\
SvCUR_set(addr, sizeof(struct sockaddr_in6));\
break;\
case AF_UNIX:\
SvCUR_set(addr, sizeof(struct sockaddr_un));\
break;\
default:\
break;\
}\
MODULE = IO::FD PACKAGE = IO::FD
INCLUDE: const-xs.inc
BOOT:
//boot strap the mutliple accept buffer
accept_multiple_next_addr=newSV(sizeof(struct sockaddr_storage));
accept_multiple_next_buf=(struct sockaddr *)SvPVX(accept_multiple_next_addr);
//locate the $^F variable
//max_file_desc=get_sv("^F",0);
INCLUDE_COMMAND: cat "xs-include/socket.c"
INCLUDE_COMMAND: $^X "xs-include/sendfile.pl"
INCLUDE_COMMAND: cat "xs-include/mkfifo.c"
INCLUDE_COMMAND: $^X "xs-include/mkfifoat.pl"
INCLUDE_COMMAND: cat "xs-include/file.c"
INCLUDE_COMMAND: cat "xs-include/experimental.c"
INCLUDE_COMMAND: cat "xs-include/temp.c"
INCLUDE_COMMAND: cat "xs-include/send-recv.c"
void
readline(fd)
SV *fd
INIT:
SV *irs;
int ret;
int count;
SV* buffer;
char *buf;
int do_loop=1;
int tmp;
PPCODE:
if(SvOK(fd)&& SvIOK(fd)){
irs=get_sv("/",0);
if(irs){
#Found variable. Read records
if(SvOK(irs)){
if(SvROK(irs)){
//fprintf(stderr, "DOING RECORD READ\n");
//SLURP RECORDS
SV* v=SvRV(irs); //Dereference to get SV
tmp=SvIV(v); //The integer value of the sv
buffer=newSV(tmp); //Allocate buffer at record size
buf=SvPVX(buffer); //Get the pointer we need
ret=read(SvIV(fd), buf, tmp); //Do the read into buffer
//fprintf(stderr, "read return: %d\n", ret);
SvPOK_on(buffer); //Make a string
if(ret>=0){
buf[ret]='\0'; //Set null just in case
SvCUR_set(buffer,ret); //Set the length of the string
EXTEND(SP,1); //Extend stack
mPUSHs(buffer); //Push record
XSRETURN(1);
}
else {
XSRETURN_UNDEF;
}
}
else {
Perl_croak( aTHX_ "IO::FD::readline does not split lines");
}
}
else{
//fprintf(stderr, "DOING SLURP READ\n");
//SLURP entire file
EXTEND(SP,1);
PUSHs(slurp(aTHX_ SvIV(fd), 4096));
XSRETURN(1);
}
}
else {
//not found.. this isn't good
}
}
else{
XSRETURN_UNDEF;
}
#Naming
#TODO:
# TODO ioctl
# poll
# select ... perl compatiable version
# dir ... not normally on FDs?
# readline?
( run in 0.580 second using v1.01-cache-2.11-cpan-71847e10f99 )