home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / LIB / unix.zoo / stat.c < prev    next >
Text File  |  2009-11-06  |  7KB  |  181 lines

  1.  
  2. /***************************************************************************/
  3. /*                                                                         */
  4. /* stat() : Unix library (OS9/68000)                                       */
  5. /* ======                                                                  */
  6. /*                                                                         */
  7. /* Author:     K. Schmitt                                                  */
  8. /* Compiler:   Microware C Vers. 3.0                                       */
  9. /* OS:         OS9/68000 Vers. 2.2                                         */
  10. /*                                                                         */
  11. /* Edition History                                                         */
  12. /* ===============                                                         */
  13. /*                                                                         */
  14. /* Ed. 0.00  Date 11/16/88                                                 */
  15. /*           First version                                                 */
  16. /*                                                                         */
  17. /***************************************************************************/
  18. /*                                                                         */
  19. /* Description                                                             */
  20. /*                                                                         */
  21. /*
  22.  
  23.      NAME  
  24.           stat, fstat - get file status
  25.  
  26.      SYNOPSIS
  27.           #include <UNIX/stat.h>
  28.  
  29.           int stat (path, buf)
  30.           char *path;  
  31.           struct stat *buf;
  32.  
  33.           int fstat (fildes, buf)  
  34.           int fildes;  
  35.           struct stat *buf;
  36.  
  37.      DESCRIPTION
  38.           Path points to a path name naming a file.  Read, write or
  39.           execute permission of the named file is not required, but
  40.           all directories listed in the path name leading to the file  
  41.           must be searchable.  Stat obtains information about the  
  42.           named file.  
  43.  
  44.           Fstat obtains information about an open file known by the
  45.           file descriptor fildes, obtained from a successful open, 
  46.           creat, dup, fcntl, or pipe system call.  
  47.  
  48.           Buf is a pointer to a stat structure into which information
  49.           is placed concerning the file.
  50.  
  51.           The contents of the structure pointed to by buf include the
  52.           following members:
  53.  
  54.            ushort     st_mode;     File mode
  55.            ino_t      st_ino;      Inode number
  56.            dev_t      st_dev;      ID of device containing a directory
  57.                                    entry for this file
  58.            dev_t      st_rdev;     ID of device. This entry is defined
  59.                                    only for character special or block
  60.                                    special files
  61.            short      st_nlink;    Number of links
  62.            ushort     st_uid;      User ID of the file's owner
  63.            ushort     st_gid;      Group ID of the file's group
  64.            off_t      st_size;     File size in bytes
  65.            time_t     st_atime;    Time of last access
  66.            time_t     st_mtime;    Time of last data modification
  67.            time_t     st_ctime;    Time of last file status change
  68.                                    Times measured in seconds since
  69.                                    00:00:00 GMT, Jan. 1, 1970
  70.  
  71.           The following parameters are affected by different system
  72.           calls:
  73.  
  74.           st_atime  Time when file data was last accessed.
  75.                     Changed by the following system calls:  creat,
  76.                     mknod, pipe, utime, and read.
  77.  
  78.           st_mtime  Time when data was last modified.
  79.                     Changed by the following system calls:  creat,
  80.                     mknod, pipe, utime, and write.
  81.  
  82.           st_ctime  Time when file status was last changed.
  83.                     Changed by the following system calls:  chmod,
  84.                     chown, creat, link, mknod, pipe, unlink, utime,
  85.                     and write.
  86.  
  87.           Stat will fail if one or more of the following are true:
  88.  
  89.           [ENOTDIR]      A component of the path prefix is not a
  90.                          directory.
  91.  
  92.           [ENOENT]       The named file does not exist.
  93.  
  94.           [EACCES]       Search permission is denied for a component
  95.                          of the path prefix.
  96.  
  97.           [EFAULT]       Buf or path points to an invalid address.
  98.  
  99.           Fstat will fail if one or more of the following are true:
  100.  
  101.           [EBADF]        Fildes is not a valid open file descriptor.
  102.  
  103.           [EFAULT]       Buf points to an invalid address.
  104.  
  105.      RETURN VALUE
  106.           Upon successful completion a value of 0 is returned.
  107.           Otherwise, a value of -1 is returned and errno is set to
  108.           indicate the error.
  109.  
  110. */
  111.  
  112. #include <UNIX/stat.h>
  113. #include <direct.h>
  114. #include <dir.h>
  115.  
  116. extern time_t _secsince70 ();
  117.  
  118. int stat (fname, buf)
  119.           char fname [];
  120.           struct stat *buf;
  121.           {
  122.           int fd, ret;
  123.           DIR *dirp;
  124.  
  125.           if ((fd = open (fname, S_IREAD)) == -1)
  126.                {
  127.                if ((dirp = opendir (fname)) == 0)
  128.                     return (-1);
  129.                fd = dirp -> dd_fd;
  130.                }
  131.           else
  132.                {
  133.                dirp = 0;
  134.                }
  135.  
  136.           ret = fstat (fd, buf);
  137.           if (dirp == 0) close (fd);
  138.           else           closedir (dirp);
  139.  
  140.           return (ret);
  141.  
  142.           } /* end of stat */
  143.  
  144.  
  145.  
  146. int fstat (fd, buf)
  147.           int fd;
  148.           register struct stat *buf;
  149.           {
  150.           struct fildes fildes;
  151.           register int i;
  152.           register char *p;
  153.           char *malloc();
  154.  
  155.           if (_gs_gfd (fd, &fildes, sizeof (struct fildes)) == -1)
  156.                return (-1);
  157.  
  158.           buf -> st_uid = (unsigned short) (fildes.fd_own [0]);
  159.           buf -> st_gid = (unsigned short) (fildes.fd_own [1]);
  160.           buf -> st_mode = (unsigned short) (fildes.fd_att) & 0377;
  161.           buf -> st_nlink = (unsigned short) (fildes.fd_link);
  162.  
  163.           for (i = 0, p = (char *) (&buf -> st_size); i < 4; i++)
  164.                {
  165.                *p++ = fildes.fd_fsize [i];
  166.                }
  167.  
  168.           buf -> st_atime = buf -> st_mtime = _secsince70 (fildes.fd_date);
  169.           fildes.fd_dcr [3] = 0;
  170.           fildes.fd_dcr [4] = 0;
  171.           buf -> st_ctime = _secsince70 (fildes.fd_dcr);
  172.           if ((buf -> st_rdev = buf -> st_dev = malloc(30)) != (char *) 0)
  173.                {
  174.                _gs_devn (fd, buf -> st_dev);
  175.                }
  176.  
  177.           return (0);
  178.  
  179.           } /* end of fstat */
  180.  
  181.