Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
  2. /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
  3. #include <libc/stubs.h>
  4. #include <unistd.h>
  5. #include <stdio.h>
  6. #include <sys/stat.h>
  7. #include <io.h>
  8. #include <dirent.h>
  9. #include <errno.h>
  10.  
  11. int access(const char *fn, int flags)
  12. {
  13.   unsigned attr = _chmod(fn, 0);
  14.  
  15.   if (attr == -1) {
  16.     char fixed_path[FILENAME_MAX];
  17.     const char* p;
  18.     int nums = 0;
  19.     DIR* d;
  20.  
  21.     /* Root directories on some non-local drives (e.g. CD-ROM)
  22.        might fail `_chmod'.  `findfirst' to the rescue.  */
  23.     _fixpath(fn, fixed_path);
  24.     for (p=fixed_path;*p;p++) if (*p == '/') ++nums;
  25.     if (nums <= 2)
  26.     {
  27.       d = opendir(fn);
  28.       if (d) {closedir(d);return 0;}
  29.     }
  30.  
  31.     errno = ENOENT;
  32.     return -1;
  33.   }
  34.  
  35.   if (attr & 0x10)              /* directory? */
  36.       return 0;                 /* directories always OK */
  37.   if (flags & D_OK)
  38.   {
  39.     errno = EACCES;
  40.     return -1;                  /* not a directory */
  41.   }
  42.  
  43.   if ((flags & W_OK) && (attr & 1))
  44.   {
  45.     errno = EACCES;
  46.     return -1;                  /* not writable */
  47.   }
  48.  
  49.   if (flags & X_OK)
  50.   {
  51.     if (!_is_executable(fn, 0, 0))
  52.     {
  53.       errno = EACCES;
  54.       return -1;
  55.     }
  56.   }
  57.  
  58.   return 0;                     /* everything else is OK */
  59. }
  60.