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

  1. #include "amiga.h"
  2. #include <sys/stat.h>
  3.  
  4. int use_amiga_flags;
  5.  
  6. int _make_protection(int mode)
  7. {
  8.   int amode;
  9.  
  10.   if (use_amiga_flags) return mode;
  11.  
  12.   /* We always turn archive off */
  13.   amode = 0;
  14.  
  15.   /* Read: if any unix read */
  16.   if (mode & (S_IRUSR | S_IRGRP | S_IROTH)) amode |= FIBF_READ;
  17.  
  18.   /* Write: if user write or group write
  19.      Delete: if user write or world write */
  20.   if (mode & S_IWUSR) amode |= FIBF_WRITE | FIBF_DELETE;
  21.   if (mode & S_IWGRP) amode |= FIBF_WRITE;
  22.   if (mode & S_IWOTH) amode |= FIBF_DELETE;
  23.  
  24.   /* Execute: if group execute or user execute and not world execute
  25.      Script: if world execute or user execute ant not group execute */
  26.   if (mode & S_IXGRP) amode |= FIBF_EXECUTE;
  27.   if (mode & S_IXOTH) amode |= FIBF_SCRIPT;
  28.   if ((mode & (S_IXUSR | S_IXGRP | S_IXOTH)) == S_IXUSR)
  29.     amode |= FIBF_EXECUTE | FIBF_SCRIPT;
  30.  
  31.   /* Pure: if sticky */
  32.   if (mode & S_ISVTX) amode |= FIBF_PURE;
  33.  
  34.   /* Make correct bits active 0 */
  35.   amode ^= FIBF_READ | FIBF_WRITE | FIBF_EXECUTE | FIBF_DELETE;
  36.   return amode;
  37. }
  38.  
  39. int _make_mode(int protection)
  40. {
  41.     int mode;
  42.  
  43.     if (use_amiga_flags) return protection & ~S_IFMT;
  44.  
  45.     mode = 0;
  46.     /* make all bits active 1 */
  47.     protection ^= FIBF_READ | FIBF_WRITE | FIBF_EXECUTE | FIBF_DELETE;
  48.  
  49.     /* Read user, group, world if amiga read */
  50.     if (protection & FIBF_READ) mode |= S_IRUSR | S_IRGRP | S_IROTH;
  51.  
  52.     /* Write:
  53.          user if amiga write & delete
  54.      group if amiga write
  55.      other if amiga delete */
  56.     if ((protection & (FIBF_WRITE | FIBF_DELETE)) == (FIBF_WRITE | FIBF_DELETE))
  57.       mode |= S_IWUSR;
  58.     if (protection & FIBF_WRITE) mode |= S_IWGRP;
  59.     if (protection & FIBF_DELETE) mode |= S_IWOTH;
  60.  
  61.     /* Execute:
  62.          user if amiga execute or script
  63.      group if amiga execute
  64.      world if amiga script */
  65.     if (protection & (FIBF_EXECUTE | FIBF_SCRIPT)) mode |= S_IXUSR;
  66.     if (protection & FIBF_EXECUTE) mode |= S_IXGRP;
  67.     if (protection & FIBF_SCRIPT) mode |= S_IXOTH;
  68.  
  69.     /* Sticky: if pure */
  70.     if (protection & FIBF_PURE) mode |= S_ISVTX;
  71.  
  72.     return mode;
  73. }
  74.