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 / stat.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  2KB  |  97 lines

  1. #include "amiga.h"
  2. #include "fibstat.h"
  3. #include "dir_data.h"
  4. #include <sys/stat.h>
  5. #include <string.h>
  6.  
  7. static int attach (char *dest, int dlen, char *dirname, char *name)
  8. {
  9.   char *dirnamep = dirname;
  10.   
  11.   while (*dirnamep && --dlen > 0)
  12.     *dest++ = *dirnamep++;
  13.   /* Add '/' if `dirname' doesn't already end with it. */
  14.   if (dirnamep > dirname && dirnamep[-1] != '/' && dirnamep[-1] != ':' && --dlen > 0)
  15.     *dest++ = '/';
  16.   
  17.   while (*name && --dlen > 0)
  18.     *dest++ = *name++;
  19.   *dest = 0;
  20.   
  21.   return dlen > 0;
  22. }
  23.  
  24. static struct FileInfoBlock fakefib;
  25.  
  26. static int fakestat(int soft, char *name, struct stat *sbuf)
  27. {
  28.   /* See if we want information on the last file returned from readdir */
  29.   if (last_dir)
  30.     {
  31.       iDIR *last_info = (iDIR *)last_dir->dd_buf;
  32.   
  33.       if (last_info->cdir == _get_cd() &&
  34.       attach(_temp_fname, FNAMESIZE - 1, last_info->dirname,
  35.          last_entry->entry.d_name) &&
  36.       strcmp(_temp_fname, name) == 0 &&
  37.       (soft || last_entry->type != ST_SOFTLINK))
  38.     {
  39.       if (last_entry->type == ST_LINKFILE || last_entry->type == ST_LINKDIR)
  40.         {
  41.           /* Find real block, this allows tar to detect hard links */
  42.           BPTR cd = CurrentDir(last_dir->dd_fd);
  43.           BPTR l = Lock(last_entry->entry.d_name, ACCESS_READ);
  44.  
  45.           if (l)
  46.         {
  47.           Examine(l, &fakefib);
  48.           UnLock(l);
  49.         }
  50.           CurrentDir(cd);
  51.         }
  52.       else
  53.         fakefib.fib_DiskKey = last_entry->entry.d_ino;
  54.  
  55.       fakefib.fib_NumBlocks = last_entry->numblocks;
  56.       fakefib.fib_Size = last_entry->size;
  57.       fakefib.fib_Date = last_entry->date;
  58.       fakefib.fib_DirEntryType = last_entry->type;
  59.       fakefib.fib_Protection = last_entry->protection;
  60.       
  61.       _lfibstat(name, &fakefib, last_info->task, 0, sbuf);
  62.  
  63.       return 1;
  64.     }
  65.     }
  66.   return 0;
  67. }
  68.  
  69. int stat(char *name, struct stat *sbuf)
  70. {
  71.   chkabort();
  72.   if (fakestat(0, name, sbuf)) return 0;
  73.   return _fibstat(name, sbuf);
  74. }
  75.  
  76. int lstat(char *name, struct stat *sbuf)
  77. {
  78.   chkabort();
  79.   if (fakestat(1, name, sbuf)) return 0;
  80.   if (readlink(name, _temp_fname, FNAMESIZE - 1) < 0) return _fibstat(name, sbuf);
  81.  
  82.   /* Symbolic link, fake a stat block */
  83.   sbuf->st_dev = 0;
  84.   sbuf->st_rdev = 0;
  85.   sbuf->st_uid = AMIGA_UID; sbuf->st_gid = AMIGA_GID;
  86.   sbuf->st_blksize = 512;
  87.   sbuf->st_nlink = 1;        
  88.   sbuf->st_blocks = 0;
  89.   sbuf->st_size = strlen(_temp_fname);
  90.   sbuf->st_ino = 0;
  91.   /* 1-Jan-1978 */
  92.   sbuf->st_ctime = sbuf->st_atime = sbuf->st_mtime = 252460800;
  93.   sbuf->st_mode = S_IFLNK | 0777;
  94.  
  95.   return 0;
  96. }
  97.