home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / LIBSRC.ZOO / libsrc / string / strmode.c < prev    next >
C/C++ Source or Header  |  1992-01-31  |  4KB  |  148 lines

  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.  
  34. #if defined(LIBC_SCCS) && !defined(lint)
  35. static char sccsid[] = "@(#)strmode.c    5.3 (Berkeley) 5/18/90";
  36. #endif /* LIBC_SCCS and not lint */
  37.  
  38. #include <sys/types.h>
  39. #include <sys/stat.h>
  40. #include <string.h>
  41.  
  42. void
  43. strmode(mode, p)
  44.     register mode_t mode;
  45.     register char *p;
  46. {
  47.      /* print type */
  48.     switch (mode & S_IFMT) {
  49.     case S_IFDIR:            /* directory */
  50.         *p++ = 'd';
  51.         break;
  52.     case S_IFCHR:            /* character special */
  53.         *p++ = 'c';
  54.         break;
  55.     case S_IFBLK:            /* block special */
  56.         *p++ = 'b';
  57.         break;
  58.     case S_IFREG:            /* regular */
  59.         *p++ = '-';
  60.         break;
  61.     case S_IFLNK:            /* symbolic link */
  62.         *p++ = 'l';
  63.         break;
  64.     case S_IFSOCK:            /* socket */
  65.         *p++ = 's';
  66.         break;
  67. #ifdef S_IFIFO
  68.     case S_IFIFO:            /* fifo */
  69.         *p++ = 'p';
  70.         break;
  71. #endif
  72.     default:            /* unknown */
  73.         *p++ = '?';
  74.         break;
  75.     }
  76.     /* usr */
  77.     if (mode & S_IRUSR)
  78.         *p++ = 'r';
  79.     else
  80.         *p++ = '-';
  81.     if (mode & S_IWUSR)
  82.         *p++ = 'w';
  83.     else
  84.         *p++ = '-';
  85.     switch (mode & (S_IXUSR | S_ISUID)) {
  86.     case 0:
  87.         *p++ = '-';
  88.         break;
  89.     case S_IXUSR:
  90.         *p++ = 'x';
  91.         break;
  92.     case S_ISUID:
  93.         *p++ = 'S';
  94.         break;
  95.     case S_IXUSR | S_ISUID:
  96.         *p++ = 's';
  97.         break;
  98.     }
  99.     /* group */
  100.     if (mode & S_IRGRP)
  101.         *p++ = 'r';
  102.     else
  103.         *p++ = '-';
  104.     if (mode & S_IWGRP)
  105.         *p++ = 'w';
  106.     else
  107.         *p++ = '-';
  108.     switch (mode & (S_IXGRP | S_ISGID)) {
  109.     case 0:
  110.         *p++ = '-';
  111.         break;
  112.     case S_IXGRP:
  113.         *p++ = 'x';
  114.         break;
  115.     case S_ISGID:
  116.         *p++ = 'S';
  117.         break;
  118.     case S_IXGRP | S_ISGID:
  119.         *p++ = 's';
  120.         break;
  121.     }
  122.     /* other */
  123.     if (mode & S_IROTH)
  124.         *p++ = 'r';
  125.     else
  126.         *p++ = '-';
  127.     if (mode & S_IWOTH)
  128.         *p++ = 'w';
  129.     else
  130.         *p++ = '-';
  131.     switch (mode & (S_IXOTH | S_ISVTX)) {
  132.     case 0:
  133.         *p++ = '-';
  134.         break;
  135.     case S_IXOTH:
  136.         *p++ = 'x';
  137.         break;
  138.     case S_ISVTX:
  139.         *p++ = 'T';
  140.         break;
  141.     case S_IXOTH | S_ISVTX:
  142.         *p++ = 't';
  143.         break;
  144.     }
  145.     *p++ = ' ';        /* will be a '+' if ACL's implemented */
  146.     *p = '\0';
  147. }
  148.