perl
view release on metacpan or search on metacpan
ext/VMS-Stdio/Stdio.xs view on Meta::CPAN
PROTOTYPE: $
CODE:
FILE *stdio = PerlIO_exportFILE(fp,0);
ST(0) = rewind(stdio) ? &PL_sv_undef : &PL_sv_yes;
PerlIO_releaseFILE(fp,stdio);
void
remove(name)
char *name
PROTOTYPE: $
CODE:
ST(0) = remove(name) ? &PL_sv_undef : &PL_sv_yes;
void
setdef(...)
PROTOTYPE: @
CODE:
char vmsdef[NAM$C_MAXRSS+1], es[NAM$C_MAXRSS], sep;
unsigned long int retsts;
struct FAB deffab = cc$rms_fab;
struct NAM defnam = cc$rms_nam;
struct dsc$descriptor_s dirdsc = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};
STRLEN n_a;
if (items) {
SV *defsv = ST(items-1); /* mimic chdir() */
ST(0) = &PL_sv_undef;
if (!SvPOK(defsv)) { SETERRNO(EINVAL,LIB$_INVARG); XSRETURN(1); }
if (tovmsspec(SvPV(defsv,n_a),vmsdef) == NULL) { XSRETURN(1); }
deffab.fab$l_fna = vmsdef; deffab.fab$b_fns = strlen(vmsdef);
}
else {
deffab.fab$l_fna = "SYS$LOGIN"; deffab.fab$b_fns = 9;
EXTEND(sp,1); ST(0) = &PL_sv_undef;
}
defnam.nam$l_esa = es; defnam.nam$b_ess = sizeof es;
deffab.fab$l_nam = &defnam;
retsts = sys$parse(&deffab,0,0);
if (retsts & 1) {
if (defnam.nam$v_wildcard) retsts = RMS$_WLD;
else if (defnam.nam$b_name || defnam.nam$b_type > 1 ||
defnam.nam$b_ver > 1) retsts = RMS$_DIR;
}
defnam.nam$b_nop |= NAM$M_SYNCHK; defnam.nam$l_rlf = NULL; deffab.fab$b_dns = 0;
if (!(retsts & 1)) {
set_vaxc_errno(retsts);
switch (retsts) {
case RMS$_DNF:
set_errno(ENOENT); break;
case RMS$_SYN: case RMS$_DIR: case RMS$_DEV:
set_errno(EINVAL); break;
case RMS$_PRV:
set_errno(EACCES); break;
default:
set_errno(EVMSERR); break;
}
(void) sys$parse(&deffab,0,0); /* free up context */
XSRETURN(1);
}
sep = *defnam.nam$l_dir;
*defnam.nam$l_dir = '\0';
my_setenv("SYS$DISK",defnam.nam$b_node ? defnam.nam$l_node : defnam.nam$l_dev);
*defnam.nam$l_dir = sep;
dirdsc.dsc$a_pointer = defnam.nam$l_dir; dirdsc.dsc$w_length = defnam.nam$b_dir;
if ((retsts = sys$setddir(&dirdsc,0,0)) & 1) ST(0) = &PL_sv_yes;
else { set_errno(EVMSERR); set_vaxc_errno(retsts); }
(void) sys$parse(&deffab,0,0); /* free up context */
void
sync(fp)
PerlIO * fp
PROTOTYPE: $
CODE:
FILE *stdio = PerlIO_exportFILE(fp,0);
if (fsync(fileno(stdio))) { ST(0) = &PL_sv_undef; }
else { clearerr(stdio); ST(0) = &PL_sv_yes; }
PerlIO_releaseFILE(fp,stdio);
char *
tmpnam()
PROTOTYPE:
CODE:
char fname[L_tmpnam];
ST(0) = sv_newmortal();
if (tmpnam(fname) != NULL) sv_setpv(ST(0),fname);
void
vmsopen(spec,...)
char * spec
PROTOTYPE: @
CODE:
char *args[8],mode[3] = {'r','\0','\0'}, type = '<';
int i, myargc;
FILE *fp;
SV *fh;
PerlIO *pio_fp;
STRLEN n_a;
if (!spec || !*spec) {
SETERRNO(EINVAL,LIB$_INVARG);
XSRETURN_UNDEF;
}
if (items > 9) croak("too many args");
/* First, set up name and mode args from perl's string */
if (*spec == '+') {
mode[1] = '+';
spec++;
}
if (*spec == '>') {
if (*(spec+1) == '>') *mode = 'a', spec += 2;
else *mode = 'w', spec++;
}
else if (*spec == '<') spec++;
myargc = items - 1;
for (i = 0; i < myargc; i++) args[i] = SvPV(ST(i+1),n_a);
/* This hack brought to you by C's opaque arglist management */
switch (myargc) {
case 0:
fp = fopen(spec,mode);
break;
case 1:
( run in 0.466 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )