home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OS9000 / APPS / diff.lzh / diff / stat.c < prev    next >
C/C++ Source or Header  |  1986-04-24  |  3KB  |  171 lines

  1. #include    <modes.h>
  2. #ifdef _OS9000
  3. #include    <rbf.h>
  4. #define        fildes    fd_stats
  5. #define        fd_link    fd_links
  6. #define        fd_att    fd_flag
  7. #else
  8. #include    <direct.h>
  9. #endif
  10. #include    <stdio.h>
  11. #include    <errno.h>
  12. #include    <sgstat.h>
  13. #include    <sg_codes.h>
  14. #include    "stat.h"
  15.  
  16. #ifndef DT_SCF
  17. #include    <io.h>
  18. #endif
  19.  
  20. int    stat( pathname, sbuf)
  21. char    *pathname;
  22. struct    stat    *sbuf;
  23. {
  24.     struct fildes dp;
  25.     struct    tm tbuf;
  26.     int        path, err;
  27.     if( ( path = open(pathname,S_IREAD) ) == -1 ) return(-1);
  28.     err = fstat(path, sbuf);
  29.     close(path);
  30.     return(err);
  31. }
  32.  
  33. int    fstat( path, sbuf)
  34. int     path;
  35. struct    stat    *sbuf;
  36. {
  37. #ifdef _OS9000
  38.     fd_stats dp;
  39.     int err;
  40.     u_int32 in;
  41.     process_id pid;
  42.     u_int16 priority, age, group, user;
  43.     int32 schedule;
  44.     owner_id oid;
  45.  
  46.     if (err = _os_gs_fd(path, sizeof(dp), &dp))
  47.     {
  48.         errno = err;
  49.         return -1;
  50.     }
  51.     sbuf->st_uid = dp.fd_owner;
  52.     sbuf->st_ctime = dp.fd_ctime;
  53.     sbuf->st_atime = dp.fd_atime;
  54.     sbuf->st_mtime = dp.fd_mtime;
  55.     _os_id(&pid, &priority, &age, &schedule, &group, &user);
  56.     oid.grp_usr.grp = 0;
  57.     oid.grp_usr.usr = 0;
  58.     _os_setuid(oid);
  59.     _os_gs_fdaddr(path, &in);
  60.     oid.grp_usr.grp = group;
  61.     oid.grp_usr.usr = user;
  62.     _os_setuid(oid);
  63.     sbuf->st_size = dp.fd_size;
  64.     sbuf->st_ino = in;
  65.     sbuf->st_dev   = sbuf->st_rdev = 0;
  66. #else
  67.     struct fildes dp;
  68.     struct    tm tbuf;
  69.     struct    sgstat opt;
  70.  
  71.     if( _gs_gfd( path, &dp, sizeof( dp ) ) < 0 )
  72.         return(-1);
  73.     if( _gs_opt( path, &opt, sizeof( opt ) ) < 0 )
  74.         return(-1);
  75.     sbuf->st_gid = dp.fd_group;
  76.     sbuf->st_gid = (u_char) dp.fd_own[0];
  77.     sbuf->st_uid = (u_char) dp.fd_own[1];
  78.     tbuf.tm_sec = 0;
  79.     tbuf.tm_min = dp.fd_date[4];
  80.     tbuf.tm_hour= dp.fd_date[3];
  81.     tbuf.tm_mday = dp.fd_date[2];
  82.     tbuf.tm_mon = dp.fd_date[1]-1;
  83.     tbuf.tm_year= dp.fd_date[0];
  84.     sbuf->st_mtime = sbuf->st_atime = mktime(&tbuf);
  85.     tbuf.tm_sec = tbuf.tm_min = tbuf.tm_hour= 0;
  86.     tbuf.tm_mday = (int)dp.fd_dcr[2];
  87.     tbuf.tm_mon = (int)dp.fd_dcr[1]-1;
  88.     tbuf.tm_year= (int)dp.fd_dcr[0];
  89.     sbuf->st_ctime = mktime(&tbuf);
  90.     memcpy( &sbuf->st_size, dp.fd_fsize, sizeof(time_t));
  91.     sbuf->st_dev   = (opt.pd_dvt - _getsys(D_DevTbl, sizeof(*void))
  92.                     /sizeof(struct devicetbl);
  93.     sbuf->st_ino = opt.pd_fdpsn;
  94.     sbuf->st_rdev = 0;
  95. #endif
  96.     sbuf->st_nlink = (short)dp.fd_link;
  97.     sbuf->st_mode  = (u_char)dp.fd_att;
  98.     sbuf->st_mode  |= filetype( path, &dp );
  99.     return(0);
  100. }
  101.  
  102.  
  103. static filetype( path, dp )
  104. int        path;
  105. struct    fildes    *dp;
  106. {
  107.     struct    sgbuf    s;
  108.  
  109.     if( dp == NULL )
  110.     {
  111.         _gs_opt( path, &s);
  112.         switch( s.sg_class )
  113.         {
  114.             case    DT_SCF:
  115.                 return(US_IFCHR);
  116.             case    DT_PIPE:
  117.                 return(US_IFIFO);
  118.         }
  119.     }
  120.     if( ( dp->fd_att & S_IFDIR) != 0 ) return(US_IFDIR);
  121.     return(US_IFREG);
  122. }
  123.  
  124. #define TRUE 1
  125. #define FALSE 0
  126.  
  127. cmpfile(a, b)
  128. char *a, *b;
  129. {
  130.     struct fildes dp0, dp1;
  131.     struct sgbuf   iopt,oopt;
  132.     int        path0, path1;
  133.         
  134.     if( ( path0 = open(a,S_IREAD) ) == -1 ) return(-1);
  135.     if( ( path1 = open(b,S_IREAD) ) == -1 ) return(-1);
  136.  
  137.     _gs_opt(path0,&iopt);
  138.     _gs_opt(path1,&oopt);
  139.      close(path0);     close(path1);
  140.  
  141.     if ( iopt.sg_class == 1 &&
  142.          oopt.sg_class == 1 &&
  143.          iopt.sg_drive == oopt.sg_drive &&
  144.          iopt.sg_dvt   == oopt.sg_dvt   &&
  145.          iopt.sg_fdpsn == oopt.sg_fdpsn )
  146.         return TRUE;
  147.     else
  148.         return FALSE;
  149. }
  150.  
  151.  
  152. #ifndef __STDC__
  153. void abort()
  154. {
  155.     exit(_errmsg(1, "fatal error.\n"));
  156. }
  157.  
  158. void perror(s)
  159. char *s;
  160. {
  161. static int pn = 0;
  162. int err = errno;
  163.  
  164.     if (!pn && (pn = open("/dd/SYS/errmsg", O_RDONLY)) == -1)
  165.         pn = 0;
  166.     if (s && *s)
  167.         fprintf(stderr, "%s: ", s);
  168.     prerr(pn, err);
  169. }
  170. #endif
  171.