IO-FD
view release on metacpan or search on metacpan
xs-include/file.c view on Meta::CPAN
OUTPUT:
RETVAL
#IOCTL
######
SV*
ioctl(fd, request, arg)
SV *fd
unsigned long request
int arg
ALIAS: sysioctl=1
INIT:
CODE:
RETVAL=&PL_sv_undef;
//NOTE: Remember to add 1 to no error return
OUTPUT:
RETVAL
#if defined(IO_FD_OS_DARWIN)|| defined(IO_FD_OS_BSD)
#define IO_FD_ATIME atime=buf.st_atimespec.tv_sec+buf.st_atimespec.tv_nsec*1e-9;
#define IO_FD_MTIME mtime=buf.st_mtimespec.tv_sec+buf.st_mtimespec.tv_nsec*1e-9;
#define IO_FD_CTIME ctime=buf.st_ctimespec.tv_sec+buf.st_ctimespec.tv_nsec*1e-9;
#endif
#if defined(IO_FD_OS_LINUX)
#define IO_FD_ATIME atime=buf.st_atim.tv_sec+buf.st_atim.tv_nsec*1e-9;
#define IO_FD_MTIME mtime=buf.st_mtim.tv_sec+buf.st_mtim.tv_nsec*1e-9;
#define IO_FD_CTIME ctime=buf.st_ctim.tv_sec+buf.st_ctim.tv_nsec*1e-9;
#endif
#if defined(IO_FD_OS_DARWIN)
#define DEV_FMT "%d"
#else
#define DEV_FMT "%lld"
#endif
void
stat(target)
SV *target;
ALIAS:
IO::FD::stat = 1
IO::FD::lstat = 2
INIT:
int ret=-1;
char *path;
struct stat buf;
int len;
long long atime;
long long mtime;
long long ctime;
char scratch[32]; //
SV *tmp;
PPCODE:
if(SvOK(target) && SvIOK(target)){
//Integer => always an fstat
ret=fstat(SvIV(target), &buf);
}
else if(SvOK(target)&& SvPOK(target)){
//String => stat OR lstat
len=SvCUR(target);
Newx(path, len+1, char); //Allocate plus null
Copy(SvPVbyte_nolen(target), path, len, char); //Copy
path[len]='\0'; //set null
switch(ix){
case 1:
ret=stat(path, &buf);
break;
case 2:
ret=lstat(path, &buf);
break;
default:
break;
}
Safefree(path);
}
else {
//Unkown
}
//fprintf(stderr, "Size of dev: %d\n",sizeof(buf.st_dev));
//fprintf(stderr, "Size of ino: %d\n",sizeof(buf.st_ino));
//fprintf(stderr, "Size of nlink: %d\n",sizeof(buf.st_nlink));
//fprintf(stderr, "Size of size: %d\n",sizeof(buf.st_size));
//fprintf(stderr, "Size of blocks: %d\n",sizeof(buf.st_blocks));
if(ret>=0){
switch(GIMME_V){
case G_ARRAY:
IO_FD_ATIME
IO_FD_MTIME
IO_FD_CTIME
//Work through the items in the struct
//
EXTEND(SP, 13); //macos bsd linux
// ====== st_dev
if(buf.st_dev<0){
// Handle signed value
//int32 uint64 uint64
if(sizeof(IV)<sizeof(buf.st_dev)){
//sprintf(scratch,"%lld", buf.st_dev);
sprintf(scratch, DEV_FMT, buf.st_dev);
tmp = newSVpv(scratch,0);
}
else{
tmp=newSViv(buf.st_dev);
( run in 1.063 second using v1.01-cache-2.11-cpan-71847e10f99 )