home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / misc / a154_1 / !Tierra / source / c / Stat < prev    next >
Text File  |  1992-08-11  |  4KB  |  131 lines

  1. /* C.Stat: Check file status */
  2.  
  3. #include "kernel.h"
  4.  
  5. #include "time.h"  /* was #include "sys/time.h" */
  6. #include "stat.h"  /* was #include "sys/stat.h" */
  7.  
  8. #define WRITE_CAT       1
  9. #define READ_CAT        5
  10. #define OS_GetEnv       16
  11.  
  12. #define UG_READ         ( (S_IREAD)  | (S_IREAD >> 3)  )
  13. #define UG_WRITE        ( (S_IWRITE) | (S_IWRITE >> 3) )
  14. #define OTHER_READ      ( S_IREAD  >> 6 )
  15. #define OTHER_WRITE     ( S_IWRITE >> 6 )
  16. #define ALL_EXEC        ( (S_IEXEC)  | (S_IEXEC >> 3)  | (S_IEXEC >> 6)  )
  17.  
  18. int stat (char *name, struct stat *buf)
  19. {
  20.         int type;
  21.         int mode = 0;
  22.         unsigned char *p;
  23.         _kernel_osfile_block osfile;
  24.         _kernel_swi_regs regs;
  25.  
  26.         /* ----- Get file catalogue info ----- */
  27.  
  28.         type = _kernel_osfile(READ_CAT,name,&osfile);
  29.  
  30.         if ( type <= 0 )
  31.                 return -1;
  32.  
  33.         buf->st_nlink   = 1;
  34.         buf->st_uid     = 0;
  35.         buf->st_gid     = 0;
  36.         buf->st_size    = (unsigned) osfile.start;  /* file length */
  37.         buf->st_load    = osfile.load;              /* load address */
  38.         buf->st_exec    = osfile.exec;              /* execution address */
  39.         buf->st_attribs = osfile.end;               /* file attributes */
  40.  
  41.         buf->st_stamp   = ( ( osfile.load & 0xFFF00000 ) == 0xFFF00000 );
  42.  
  43.         /* ----- Determine file access mode ----- */
  44.  
  45.         if ( type == 2 )                /* is it a directory? */
  46.                 mode |= S_IFDIR;
  47.         else
  48.                 mode |= S_IFREG;
  49.  
  50.         if ( buf->st_attribs & S_AREAD )
  51.                 mode |= UG_READ;
  52.  
  53.         if ( buf->st_attribs & S_AWRITE )
  54.                 mode |= UG_WRITE;
  55.  
  56.         if ( buf->st_attribs & (S_AREAD << 4) )
  57.                 mode |= OTHER_READ;
  58.  
  59.         if ( buf->st_attribs & (S_AWRITE << 4) )
  60.                 mode |= OTHER_WRITE;
  61.  
  62.         mode |= ALL_EXEC;               /* Always allow execute */
  63.  
  64.         buf->st_mode = mode;
  65.  
  66.         /* ----- Determine file time stamp ----- */
  67.  
  68.         if ( buf->st_stamp )
  69.         {
  70.                 buf->st_time.t[0] = osfile.exec       & 0xFF;
  71.                 buf->st_time.t[1] = osfile.exec >> 8  & 0xFF;
  72.                 buf->st_time.t[2] = osfile.exec >> 16 & 0xFF;
  73.                 buf->st_time.t[3] = osfile.exec >> 24 & 0xFF;
  74.                 buf->st_time.t[4] = osfile.load       & 0xFF;
  75.                 buf->st_type      = osfile.load >> 8  & 0xFFF;
  76.         }
  77.         else
  78.         {
  79.                 /* File not timestamped - use program start time */
  80.  
  81.                 if ( _kernel_swi(OS_GetEnv,®s,®s) != 0 )
  82.                         return -1;
  83.  
  84.                 p = (unsigned char *)regs.r[2];
  85.  
  86.                 buf->st_time.t[0] = p[0];
  87.                 buf->st_time.t[1] = p[1];
  88.                 buf->st_time.t[2] = p[2];
  89.                 buf->st_time.t[3] = p[3];
  90.                 buf->st_time.t[4] = p[4];
  91.                 buf->st_type      = 0;
  92.         }
  93.  
  94.         buf->st_mtime = mktime(TIMEstruct(buf->st_time));
  95.  
  96.         return 0;
  97. }
  98.  
  99. int set_stat (char *name, struct stat *buf)
  100. {
  101.         _kernel_osfile_block osfile;
  102.  
  103.         if ( buf->st_stamp )
  104.         {
  105.                 osfile.load = 0xFFF00000
  106.                             | buf->st_type << 8
  107.                             | buf->st_time.t[4];
  108.                 osfile.exec = buf->st_time.t[3] << 24
  109.                             | buf->st_time.t[2] << 16
  110.                             | buf->st_time.t[1] << 8
  111.                             | buf->st_time.t[0];
  112.         }
  113.         else
  114.         {
  115.                 osfile.load = buf->st_load;
  116.                 osfile.exec = buf->st_exec;
  117.         }
  118.  
  119.         osfile.end  = buf->st_attribs & 0x08;         /* locked bit */
  120.  
  121.         if ( buf->st_mode & S_IREAD )                 /* read bit */
  122.                 osfile.end |= 0x01;
  123.         if ( buf->st_mode & S_IWRITE )                /* write bit */
  124.                 osfile.end |= 0x02;
  125.  
  126.         if ( _kernel_osfile(WRITE_CAT,name,&osfile) < 0 )
  127.                 return -1;
  128.         else
  129.                 return 0;
  130. }
  131.