FileAttribUtil.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4. * This file is part of the nelexa/zip package.
  5. * (c) Ne-Lexa <https://github.com/Ne-Lexa/php-zip>
  6. * For the full copyright and license information, please view the LICENSE
  7. * file that was distributed with this source code.
  8. */
  9. namespace PhpZip\Util;
  10. use PhpZip\Constants\DosAttrs;
  11. use PhpZip\Constants\UnixStat;
  12. /**
  13. * @internal
  14. */
  15. class FileAttribUtil implements DosAttrs, UnixStat
  16. {
  17. /**
  18. * Get DOS mode.
  19. */
  20. public static function getDosMode(int $xattr): string
  21. {
  22. $mode = (($xattr & self::DOS_DIRECTORY) === self::DOS_DIRECTORY) ? 'd' : '-';
  23. $mode .= (($xattr & self::DOS_ARCHIVE) === self::DOS_ARCHIVE) ? 'a' : '-';
  24. $mode .= (($xattr & self::DOS_READ_ONLY) === self::DOS_READ_ONLY) ? 'r' : '-';
  25. $mode .= (($xattr & self::DOS_HIDDEN) === self::DOS_HIDDEN) ? 'h' : '-';
  26. $mode .= (($xattr & self::DOS_SYSTEM) === self::DOS_SYSTEM) ? 's' : '-';
  27. $mode .= (($xattr & self::DOS_LABEL) === self::DOS_LABEL) ? 'l' : '-';
  28. return $mode;
  29. }
  30. /**
  31. * @noinspection DuplicatedCode
  32. */
  33. public static function getUnixMode(int $permission): string
  34. {
  35. $mode = '';
  36. switch ($permission & self::UNX_IFMT) {
  37. case self::UNX_IFDIR:
  38. $mode .= 'd';
  39. break;
  40. case self::UNX_IFREG:
  41. $mode .= '-';
  42. break;
  43. case self::UNX_IFLNK:
  44. $mode .= 'l';
  45. break;
  46. case self::UNX_IFBLK:
  47. $mode .= 'b';
  48. break;
  49. case self::UNX_IFCHR:
  50. $mode .= 'c';
  51. break;
  52. case self::UNX_IFIFO:
  53. $mode .= 'p';
  54. break;
  55. case self::UNX_IFSOCK:
  56. $mode .= 's';
  57. break;
  58. default:
  59. $mode .= '?';
  60. break;
  61. }
  62. $mode .= ($permission & self::UNX_IRUSR) ? 'r' : '-';
  63. $mode .= ($permission & self::UNX_IWUSR) ? 'w' : '-';
  64. if ($permission & self::UNX_IXUSR) {
  65. $mode .= ($permission & self::UNX_ISUID) ? 's' : 'x';
  66. } else {
  67. $mode .= ($permission & self::UNX_ISUID) ? 'S' : '-'; // S==undefined
  68. }
  69. $mode .= ($permission & self::UNX_IRGRP) ? 'r' : '-';
  70. $mode .= ($permission & self::UNX_IWGRP) ? 'w' : '-';
  71. if ($permission & self::UNX_IXGRP) {
  72. $mode .= ($permission & self::UNX_ISGID) ? 's' : 'x';
  73. } // == self::UNX_ENFMT
  74. else {
  75. $mode .= ($permission & self::UNX_ISGID) ? 'S' : '-';
  76. } // SunOS 4.1.x
  77. $mode .= ($permission & self::UNX_IROTH) ? 'r' : '-';
  78. $mode .= ($permission & self::UNX_IWOTH) ? 'w' : '-';
  79. if ($permission & self::UNX_IXOTH) {
  80. $mode .= ($permission & self::UNX_ISVTX) ? 't' : 'x';
  81. } // "sticky bit"
  82. else {
  83. $mode .= ($permission & self::UNX_ISVTX) ? 'T' : '-';
  84. } // T==undefined
  85. return $mode;
  86. }
  87. }