#NOTES: #LINUX: use readlink on /proc/self/fd/NNN where NNN is the file #BSD/DARINW use fcntl and F_GETPATH on the fd #MKSTEMP ######## SV* mkstemp(template) char *template INIT: int ret; SV *path_sv; char *path; int len=0; int min_ok=1; ssize_t bufsize,outsize; char proc[MAXPATHLEN]; PPCODE: len=strlen(template); if(len<6){ Perl_croak(aTHX_ "The template must end with at least 6 'X' characters"); } for(int i=1; i<=6; i++){ min_ok=min_ok&&(template[len-i]=='X'); } if(!min_ok){ Perl_croak(aTHX_ "The template must end with at least 6 'X' characters"); } ret=mkstemp(template); if(ret<0){ Perl_croak(aTHX_ "Error creating temp file"); //mXPUSHs(&PL_sv_undef); } else{ if(ret>PL_maxsysfd){ fcntl(ret, F_SETFD, FD_CLOEXEC); } switch(GIMME_V){ case G_SCALAR: mXPUSHs(newSViv(ret)); XSRETURN(1); break; case G_ARRAY: // Read the manual stupid... This was so simple // yet so hard ! LOL path_sv=newSVpv(template,0); path=SvPVX(path_sv); EXTEND(SP,2); mPUSHs(newSViv(ret)); //mPUSHs(newSVpv(path,0)); mPUSHs(path_sv); XSRETURN(2); break; default: XSRETURN_EMPTY; break; } } #MKTEMP ####### SV* mktemp(template) char *template INIT: char *ret; char *buf; int len=0; int min_ok=1; PPCODE: len=strlen(template); if(len<6){ Perl_croak(aTHX_ "The template must end with at least 6 'X' characters"); } for(int i=1; i<=6; i++){ min_ok=min_ok&&(template[len-i]=='X'); } if(!min_ok){ Perl_croak(aTHX_ "The template must end with at least 6 'X' characters"); } ret=mktemp(template); if(ret==NULL){ Perl_croak(aTHX_ "Error creating temp file"); } else{ mXPUSHs(newSVpv(ret, 0)); XSRETURN(1); }