home *** CD-ROM | disk | FTP | other *** search
- static char sccs_id[] = "@(#) stat.c 1.2 " __DATE__ " HJR";
-
- /* stat.c (c) Copyright 1990 H.Rogers */
-
- #include <errno.h>
- #include <time.h>
-
- #include "fcntl.h"
-
- #include "sys/types.h"
- #include "sys/dev.h"
- #include "sys/unix.h"
- #include "sys/stat.h"
- #include "sys/os.h"
-
- static void __stat (register int *, register struct stat *);
-
- int
- stat (char *file, register struct stat *buf)
- {
- int r[6];
- os_error *e;
-
- if (!buf)
- {
- errno = EINVAL;
- return (-1);
- }
-
- file = __uname (file, 0);
-
- if (e = os_file (0x05, file, r))
- {
- __seterr (e);
- return (-1);
- }
- if (!r[0])
- {
- errno = ENOENT;
- return (-1);
- }
-
- buf->st_dev = makedev (DEV_RISCOS, 0);
-
- __stat (r, buf);
-
- return (0);
- }
-
- int
- fstat (int fd, register struct stat *buf)
- {
- register struct file *f;
-
- if (!buf)
- {
- errno = EINVAL;
- return (-1);
- }
-
- if (BADF (fd))
- {
- errno = EBADF;
- return (-1);
- }
-
- f = __u->file + fd;
-
- buf->st_dev = f->dev;
-
- __stat (f->r, buf);
-
- return (0);
- }
-
- static void
- __stat (register int *r, register struct stat *buf)
- {
- buf->st_ino = 0;
-
- buf->st_mode = ((r[5] & 0001) << 8) | ((r[5] & 0002) << 6) |
- ((r[5] & 0020) >> 2) | ((r[5] & 0040) >> 4);
-
- switch (r[0])
- {
- case 1:
- buf->st_mode |= S_IFREG;
- break;
- case 2: /* Normal directory */
- buf->st_mode |= S_IFDIR | 0700; /* FS bug */
- break;
- case 3: /* Image directory (RISC OS 3 and above) */
- buf->st_mode |= S_IFDIR | ((buf->st_mode & 0400) >> 2); /* FS bug */
- break;
- }
-
- switch (major (buf->st_dev))
- {
- case DEV_TTY:
- buf->st_mode |= S_IFCHR;
- break;
- case DEV_PIPE:
- buf->st_mode |= 0;
- break;
- }
-
- buf->st_nlink = 0;
- buf->st_uid = 1;
- buf->st_gid = 1;
- buf->st_rdev = 0;
- buf->st_size = r[4];
- buf->st_blksize = 1024;
-
- if ((((unsigned int) r[2]) >> 20) == 0xfff) /* date stamped file */
- {
- register unsigned int t1, t2, tc;
-
- t1 = (unsigned int) (r[3]);
- t2 = (unsigned int) (r[2] & 0xff);
-
- tc = 0x6e996a00U;
- if (t1 < tc)
- t2--;
- t1 -= tc;
- t2 -= 0x33; /* 00:00:00 Jan. 1 1970 = 0x336e996a00 */
-
- t1 = (t1 / 100) + (t2 * 42949673U); /* 0x100000000 / 100 = 42949672.96 */
- t1 -= (t2 / 25); /* compensate for .04 error */
-
- buf->st_atime = buf->st_mtime = buf->st_ctime = t1;
- }
- else
- buf->st_atime = buf->st_mtime = buf->st_ctime = 0;
- }
-