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