diff options
Diffstat (limited to 'do/stat')
-rw-r--r-- | do/stat | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/do/stat b/do/stat new file mode 100644 index 0000000000..d53f0ecc1d --- /dev/null +++ b/do/stat @@ -0,0 +1,95 @@ +int +do_stat(TARG,arg,gimme,arglast) +STR *TARG; +register ARG *arg; +int gimme; +int *arglast; +{ + register ARRAY *ary = stack; + register int sp = arglast[0] + 1; + int max = 13; + + if ((arg[1].arg_type & A_MASK) == A_WORD) { + tmpstab = arg[1].arg_ptr.arg_stab; + if (tmpstab != defstab) { + laststype = O_STAT; + statstab = tmpstab; + str_set(statname,""); + if (!stab_io(tmpstab) || !stab_io(tmpstab)->ifp || + fstat(fileno(stab_io(tmpstab)->ifp),&statcache) < 0) { + max = 0; + laststatval = -1; + } + } + else if (laststatval < 0) + max = 0; + } + else { + str_set(statname,str_get(ary->ary_array[sp])); + statstab = Nullstab; +#ifdef HAS_LSTAT + laststype = arg->arg_type; + if (arg->arg_type == O_LSTAT) + laststatval = lstat(str_get(statname),&statcache); + else +#endif + laststatval = stat(str_get(statname),&statcache); + if (laststatval < 0) { + if (dowarn && index(str_get(statname), '\n')) + warn(warn_nl, "stat"); + max = 0; + } + } + + if (gimme != G_ARRAY) { + if (max) + str_sset(TARG,&str_yes); + else + str_sset(TARG,&str_undef); + STABSET(TARG); + ary->ary_array[sp] = TARG; + return sp; + } + sp--; + if (max) { +#ifndef lint + (void)astore(ary,++sp, + str_2mortal(str_nmake((double)statcache.st_dev))); + (void)astore(ary,++sp, + str_2mortal(str_nmake((double)statcache.st_ino))); + (void)astore(ary,++sp, + str_2mortal(str_nmake((double)statcache.st_mode))); + (void)astore(ary,++sp, + str_2mortal(str_nmake((double)statcache.st_nlink))); + (void)astore(ary,++sp, + str_2mortal(str_nmake((double)statcache.st_uid))); + (void)astore(ary,++sp, + str_2mortal(str_nmake((double)statcache.st_gid))); + (void)astore(ary,++sp, + str_2mortal(str_nmake((double)statcache.st_rdev))); + (void)astore(ary,++sp, + str_2mortal(str_nmake((double)statcache.st_size))); + (void)astore(ary,++sp, + str_2mortal(str_nmake((double)statcache.st_atime))); + (void)astore(ary,++sp, + str_2mortal(str_nmake((double)statcache.st_mtime))); + (void)astore(ary,++sp, + str_2mortal(str_nmake((double)statcache.st_ctime))); +#ifdef STATBLOCKS + (void)astore(ary,++sp, + str_2mortal(str_nmake((double)statcache.st_blksize))); + (void)astore(ary,++sp, + str_2mortal(str_nmake((double)statcache.st_blocks))); +#else + (void)astore(ary,++sp, + str_2mortal(str_make("",0))); + (void)astore(ary,++sp, + str_2mortal(str_make("",0))); +#endif +#else /* lint */ + (void)astore(ary,++sp,str_nmake(0.0)); +#endif /* lint */ + } + return sp; +} + |