home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 1 / ARM_CLUB_CD.iso / contents / apps / clib / progs / utilslib / utils_old / c / Stat < prev    next >
Encoding:
Text File  |  1994-02-22  |  4.6 KB  |  165 lines

  1. /* C.Stat: Check file status */
  2.  
  3. #include <stdio.h>
  4. #include "kernel.h"
  5.  
  6. #include "sys/time.h"
  7. #include "sys/stat.h"
  8.  
  9. #define WRITE_CAT       1
  10. #define READ_CAT        5
  11. #define OS_GetEnv       16
  12.  
  13. #define UG_READ         ( (S_IREAD)  | (S_IREAD >> 3)  )
  14. #define UG_WRITE        ( (S_IWRITE) | (S_IWRITE >> 3) )
  15. #define OTHER_READ      ( S_IREAD  >> 6 )
  16. #define OTHER_WRITE     ( S_IWRITE >> 6 )
  17. #define ALL_EXEC        ( (S_IEXEC)  | (S_IEXEC >> 3)  | (S_IEXEC >> 6)  )
  18.  
  19. int stat (char *name, struct stat *buf)
  20. {
  21.         int type;
  22.         int mode = 0;
  23.         unsigned char *p;
  24.         _kernel_osfile_block osfile;
  25.         _kernel_swi_regs regs;
  26.  
  27.         /* ----- Get file catalogue info ----- */
  28.  
  29.         type = _kernel_osfile(READ_CAT,name,&osfile);
  30.  
  31.         if ( type <= 0 )
  32.                 return -1;
  33.  
  34.         buf->st_nlink   = 1;
  35.         buf->st_uid     = 0;
  36.         buf->st_gid     = 0;
  37.         buf->st_size    = (off_t) osfile.start;    /* file length */
  38.         buf->st_load    = osfile.load;             /* load address */
  39.         buf->st_exec    = osfile.exec;             /* execution address */
  40.         buf->st_attribs = osfile.end;              /* file attributes */
  41.  
  42.         buf->st_stamp   = ( ( osfile.load & 0xFFF00000 ) == 0xFFF00000 );
  43.  
  44.         /* ----- Determine file access mode ----- */
  45.  
  46.         if ( type == 2 )                /* is it a directory? */
  47.                 mode |= S_IFDIR;
  48.         else
  49.                 mode |= S_IFREG;
  50.  
  51.         if ( buf->st_attribs & S_AREAD )
  52.                 mode |= UG_READ;
  53.  
  54.         if ( buf->st_attribs & S_AWRITE )
  55.                 mode |= UG_WRITE;
  56.  
  57.         if ( buf->st_attribs & (S_AREAD << 4) )
  58.                 mode |= OTHER_READ;
  59.  
  60.         if ( buf->st_attribs & (S_AWRITE << 4) )
  61.                 mode |= OTHER_WRITE;
  62.  
  63.         mode |= ALL_EXEC;               /* Always allow execute */
  64.  
  65.         buf->st_mode = mode;
  66.  
  67.         /* ----- Determine file time stamp ----- */
  68.  
  69.         if ( buf->st_stamp )
  70.         {
  71.                 buf->st_time.t[0] = osfile.exec       & 0xFF;
  72.                 buf->st_time.t[1] = osfile.exec >> 8  & 0xFF;
  73.                 buf->st_time.t[2] = osfile.exec >> 16 & 0xFF;
  74.                 buf->st_time.t[3] = osfile.exec >> 24 & 0xFF;
  75.                 buf->st_time.t[4] = osfile.load       & 0xFF;
  76.                 buf->st_type      = osfile.load >> 8  & 0xFFF;
  77.         }
  78.         else
  79.         {
  80.                 /* File not timestamped - use program start time */
  81.  
  82.                 if ( _kernel_swi(OS_GetEnv,®s,®s) != 0 )
  83.                         return -1;
  84.  
  85.                 p = (unsigned char *)regs.r[2];
  86.  
  87.                 buf->st_time.t[0] = p[0];
  88.                 buf->st_time.t[1] = p[1];
  89.                 buf->st_time.t[2] = p[2];
  90.                 buf->st_time.t[3] = p[3];
  91.                 buf->st_time.t[4] = p[4];
  92.                 buf->st_type      = 0;
  93.         }
  94.  
  95.         buf->st_mtime = mktime(TIMEstruct(buf->st_time));
  96.  
  97.         return 0;
  98. }
  99.  
  100. int lstat (char *name, struct stat *buf) {
  101.   /* Don't know what this one is; guess maybe stat understanding links? */
  102.   return(stat(name, buf));
  103. }
  104.  
  105. int set_stat (char *name, struct stat *buf)
  106. {
  107.         _kernel_osfile_block osfile;
  108.  
  109.         if ( buf->st_stamp )
  110.         {
  111.                 osfile.load = 0xFFF00000
  112.                             | buf->st_type << 8
  113.                             | buf->st_time.t[4];
  114.                 osfile.exec = buf->st_time.t[3] << 24
  115.                             | buf->st_time.t[2] << 16
  116.                             | buf->st_time.t[1] << 8
  117.                             | buf->st_time.t[0];
  118.         }
  119.         else
  120.         {
  121.                 osfile.load = buf->st_load;
  122.                 osfile.exec = buf->st_exec;
  123.         }
  124.  
  125.         osfile.end  = buf->st_attribs & 0x08;         /* locked bit */
  126.  
  127.         if ( buf->st_mode & S_IREAD )                 /* read bit */
  128.                 osfile.end |= 0x01;
  129.         if ( buf->st_mode & S_IWRITE )                /* write bit */
  130.                 osfile.end |= 0x02;
  131.  
  132.         if ( _kernel_osfile(WRITE_CAT,name,&osfile) < 0 )
  133.                 return -1;
  134.         else
  135.                 return 0;
  136. }
  137.  
  138. extern int __file_debug;
  139. extern char __file_lastfname[];
  140. extern FILE *__file_lastfile;
  141.  
  142. int fstat (int fd, struct stat *buf)
  143. {
  144. int rc;
  145. FILE *f;
  146.   f = (FILE *) fd;
  147.   if (__file_lastfile == f) {
  148.     /* Just hope it was the last one opened ... */
  149.     if (__file_debug) {
  150.       fprintf(stderr, "stat: fstat(\"%s\") -> ", __file_lastfname);
  151.     }
  152.     rc = stat(__file_lastfname, buf);
  153.     if (__file_debug) {
  154.       fprintf(stderr, "%d\n", rc);
  155.     }
  156.     return(rc);
  157.   } else return(-1);
  158. }
  159.  
  160. int utime(char *name, struct utimbuf *times) {
  161.   /* Set last access and mod times */
  162.   return(-1); /* Or 0? */
  163. }
  164.  
  165.