Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

164 lines
3.7 KiB

  1. /*-
  2. * Copyright (c) 1990 The Regents of the University of California.
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions
  7. * are met:
  8. * 1. Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. * 2. Redistributions in binary form must reproduce the above copyright
  11. * notice, this list of conditions and the following disclaimer in the
  12. * documentation and/or other materials provided with the distribution.
  13. * 3. All advertising materials mentioning features or use of this software
  14. * must display the following acknowledgement:
  15. * This product includes software developed by the University of
  16. * California, Berkeley and its contributors.
  17. * 4. Neither the name of the University nor the names of its contributors
  18. * may be used to endorse or promote products derived from this software
  19. * without specific prior written permission.
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31. * SUCH DAMAGE.
  32. */
  33. #if defined(LIBC_SCCS) && !defined(lint)
  34. static char sccsid[] = "@(#)strmode.c 5.3 (Berkeley) 5/18/90";
  35. #endif /* LIBC_SCCS and not lint */
  36. #include <sys/types.h>
  37. #include <sys/stat.h>
  38. #include <string.h>
  39. void
  40. strmode(mode, p)
  41. register mode_t mode;
  42. register char *p;
  43. {
  44. //#ifdef ENHANCE
  45. /* print type */
  46. switch (mode & S_IFMT)
  47. {
  48. case S_IFDIR: /* directory */
  49. *p++ = 'd';
  50. break;
  51. case S_IFCHR: /* character special */
  52. *p++ = 'c';
  53. break;
  54. case S_IFBLK: /* block special */
  55. *p++ = 'b';
  56. break;
  57. case S_IFREG: /* regular */
  58. *p++ = '-';
  59. break;
  60. #ifndef _POSIX_SOURCE
  61. case S_IFLNK: /* symbolic link */
  62. *p++ = 'l';
  63. break;
  64. case S_IFSOCK: /* socket */
  65. *p++ = 's';
  66. break;
  67. #endif
  68. #ifdef S_IFIFO
  69. case S_IFIFO: /* fifo */
  70. *p++ = 'p';
  71. break;
  72. #endif
  73. default: /* unknown */
  74. *p++ = '?';
  75. break;
  76. }
  77. //#endif
  78. /* usr */
  79. if (mode & S_IRUSR)
  80. *p++ = 'r';
  81. else
  82. *p++ = '-';
  83. if (mode & S_IWUSR)
  84. *p++ = 'w';
  85. else
  86. *p++ = '-';
  87. switch (mode & (S_IXUSR | S_ISUID)) {
  88. case 0:
  89. *p++ = '-';
  90. break;
  91. case S_IXUSR:
  92. *p++ = 'x';
  93. break;
  94. case S_ISUID:
  95. *p++ = 'S';
  96. break;
  97. case S_IXUSR | S_ISUID:
  98. *p++ = 's';
  99. break;
  100. }
  101. /* group */
  102. if (mode & S_IRGRP)
  103. *p++ = 'r';
  104. else
  105. *p++ = '-';
  106. if (mode & S_IWGRP)
  107. *p++ = 'w';
  108. else
  109. *p++ = '-';
  110. switch (mode & (S_IXGRP | S_ISGID)) {
  111. case 0:
  112. *p++ = '-';
  113. break;
  114. case S_IXGRP:
  115. *p++ = 'x';
  116. break;
  117. case S_ISGID:
  118. *p++ = 'S';
  119. break;
  120. case S_IXGRP | S_ISGID:
  121. *p++ = 's';
  122. break;
  123. }
  124. /* other */
  125. if (mode & S_IROTH)
  126. *p++ = 'r';
  127. else
  128. *p++ = '-';
  129. if (mode & S_IWOTH)
  130. *p++ = 'w';
  131. else
  132. *p++ = '-';
  133. //#ifdef ENHANCE
  134. #ifdef _POSIX_SOURCE
  135. switch (mode & (S_IXOTH)) {
  136. #else
  137. switch (mode & (S_IXOTH | S_ISVTX)) {
  138. #endif
  139. case 0:
  140. *p++ = '-';
  141. break;
  142. case S_IXOTH:
  143. *p++ = 'x';
  144. break;
  145. #ifndef _POSIX_SOURCE
  146. case S_ISVTX:
  147. *p++ = 'T';
  148. break;
  149. case S_IXOTH | S_ISVTX:
  150. *p++ = 't';
  151. break;
  152. #endif
  153. }
  154. //#endif
  155. *p++ = ' '; /* will be a '+' if ACL's implemented */
  156. *p = '\0';
  157. }