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 )