home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / emacs-19.28-src.tgz / tar.out / fsf / emacs / unixlib / src / fstat.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  1KB  |  53 lines

  1. #include "amiga.h"
  2. #include "fibstat.h"
  3. #include <dos/dosextens.h>
  4. #include <utility/tagitem.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <amiga/ioctl.h>
  8.  
  9. int fstat(int fd, struct stat *sbuf)
  10. {
  11.   BPTR fh;
  12.   struct FileInfoBlock *fib;
  13.   int ret;
  14.  
  15.   chkabort();
  16.   if (ioctl(fd, _AMIGA_GET_FH, &fh) == -1) return -1;
  17.   if ((fib = AllocDosObjectTags(DOS_FIB, TAG_END)) && ExamineFH(fh, fib))
  18.     {
  19.       struct FileHandle *handle = BADDR(fh);
  20.  
  21.       _lfibstat(NULL, fib, handle->fh_Type, 0, sbuf);
  22.       ret = 0;
  23.     }
  24.   else
  25.     {
  26.       int err = IoErr();
  27.  
  28.       if (err == ERROR_ACTION_NOT_KNOWN)
  29.     /* Fake a stat result */
  30.     {
  31.       ret = 0;
  32.       sbuf->st_dev = (long)(((struct FileHandle *)BADDR(fh))->fh_Type);
  33.       sbuf->st_ino = 0;
  34.       sbuf->st_mode = 0777 | S_IFCHR;
  35.       sbuf->st_nlink = 1;
  36.       sbuf->st_uid = AMIGA_UID; sbuf->st_gid = AMIGA_GID;
  37.       sbuf->st_blksize = 512;
  38.       sbuf->st_blocks = 0;
  39.       sbuf->st_size = 0;
  40.       /* 1-Jan-1978 */
  41.       sbuf->st_ctime = sbuf->st_atime = sbuf->st_mtime = 252460800;
  42.     }
  43.       else
  44.     {
  45.       ret = -1;
  46.       errno = convert_oserr(err);
  47.     }
  48.     }
  49.   if (fib) FreeDosObject(DOS_FIB, fib);
  50.   ioctl(fd, _AMIGA_FREE_FH, &fh);
  51.   return ret;
  52. }
  53.