1662909a7SPeter Wemm /*- 28a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 38a16b7a1SPedro F. Giffuni * 4662909a7SPeter Wemm * Copyright (c) 1990, 1993 5662909a7SPeter Wemm * The Regents of the University of California. All rights reserved. 6662909a7SPeter Wemm * 7662909a7SPeter Wemm * Redistribution and use in source and binary forms, with or without 8662909a7SPeter Wemm * modification, are permitted provided that the following conditions 9662909a7SPeter Wemm * are met: 10662909a7SPeter Wemm * 1. Redistributions of source code must retain the above copyright 11662909a7SPeter Wemm * notice, this list of conditions and the following disclaimer. 12662909a7SPeter Wemm * 2. Redistributions in binary form must reproduce the above copyright 13662909a7SPeter Wemm * notice, this list of conditions and the following disclaimer in the 14662909a7SPeter Wemm * documentation and/or other materials provided with the distribution. 153fb3b97cSEd Maste * 3. Neither the name of the University nor the names of its contributors 16662909a7SPeter Wemm * may be used to endorse or promote products derived from this software 17662909a7SPeter Wemm * without specific prior written permission. 18662909a7SPeter Wemm * 19662909a7SPeter Wemm * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20662909a7SPeter Wemm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21662909a7SPeter Wemm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22662909a7SPeter Wemm * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23662909a7SPeter Wemm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24662909a7SPeter Wemm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25662909a7SPeter Wemm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26662909a7SPeter Wemm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27662909a7SPeter Wemm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28662909a7SPeter Wemm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29662909a7SPeter Wemm * SUCH DAMAGE. 30662909a7SPeter Wemm */ 31662909a7SPeter Wemm 32662909a7SPeter Wemm #if defined(LIBC_SCCS) && !defined(lint) 33662909a7SPeter Wemm static char sccsid[] = "@(#)strmode.c 8.3 (Berkeley) 8/15/94"; 34662909a7SPeter Wemm #endif /* LIBC_SCCS and not lint */ 35de5fe5d5SDavid E. O'Brien #include <sys/cdefs.h> 36de5fe5d5SDavid E. O'Brien __FBSDID("$FreeBSD$"); 37662909a7SPeter Wemm 38662909a7SPeter Wemm #include <sys/types.h> 39662909a7SPeter Wemm #include <sys/stat.h> 40662909a7SPeter Wemm #include <string.h> 41662909a7SPeter Wemm 42662909a7SPeter Wemm void 43*849dcdb1SAlfonso Gregory strmode(mode_t mode, char *p) 44662909a7SPeter Wemm { 45662909a7SPeter Wemm /* print type */ 46662909a7SPeter Wemm switch (mode & S_IFMT) { 47662909a7SPeter Wemm case S_IFDIR: /* directory */ 48662909a7SPeter Wemm *p++ = 'd'; 49662909a7SPeter Wemm break; 50662909a7SPeter Wemm case S_IFCHR: /* character special */ 51662909a7SPeter Wemm *p++ = 'c'; 52662909a7SPeter Wemm break; 53662909a7SPeter Wemm case S_IFBLK: /* block special */ 54662909a7SPeter Wemm *p++ = 'b'; 55662909a7SPeter Wemm break; 56662909a7SPeter Wemm case S_IFREG: /* regular */ 57662909a7SPeter Wemm *p++ = '-'; 58662909a7SPeter Wemm break; 59662909a7SPeter Wemm case S_IFLNK: /* symbolic link */ 60662909a7SPeter Wemm *p++ = 'l'; 61662909a7SPeter Wemm break; 62662909a7SPeter Wemm case S_IFSOCK: /* socket */ 63662909a7SPeter Wemm *p++ = 's'; 64662909a7SPeter Wemm break; 65662909a7SPeter Wemm #ifdef S_IFIFO 66662909a7SPeter Wemm case S_IFIFO: /* fifo */ 67662909a7SPeter Wemm *p++ = 'p'; 68662909a7SPeter Wemm break; 69662909a7SPeter Wemm #endif 70662909a7SPeter Wemm #ifdef S_IFWHT 71662909a7SPeter Wemm case S_IFWHT: /* whiteout */ 72662909a7SPeter Wemm *p++ = 'w'; 73662909a7SPeter Wemm break; 74662909a7SPeter Wemm #endif 75662909a7SPeter Wemm default: /* unknown */ 76662909a7SPeter Wemm *p++ = '?'; 77662909a7SPeter Wemm break; 78662909a7SPeter Wemm } 79662909a7SPeter Wemm /* usr */ 80662909a7SPeter Wemm if (mode & S_IRUSR) 81662909a7SPeter Wemm *p++ = 'r'; 82662909a7SPeter Wemm else 83662909a7SPeter Wemm *p++ = '-'; 84662909a7SPeter Wemm if (mode & S_IWUSR) 85662909a7SPeter Wemm *p++ = 'w'; 86662909a7SPeter Wemm else 87662909a7SPeter Wemm *p++ = '-'; 88662909a7SPeter Wemm switch (mode & (S_IXUSR | S_ISUID)) { 89662909a7SPeter Wemm case 0: 90662909a7SPeter Wemm *p++ = '-'; 91662909a7SPeter Wemm break; 92662909a7SPeter Wemm case S_IXUSR: 93662909a7SPeter Wemm *p++ = 'x'; 94662909a7SPeter Wemm break; 95662909a7SPeter Wemm case S_ISUID: 96662909a7SPeter Wemm *p++ = 'S'; 97662909a7SPeter Wemm break; 98662909a7SPeter Wemm case S_IXUSR | S_ISUID: 99662909a7SPeter Wemm *p++ = 's'; 100662909a7SPeter Wemm break; 101662909a7SPeter Wemm } 102662909a7SPeter Wemm /* group */ 103662909a7SPeter Wemm if (mode & S_IRGRP) 104662909a7SPeter Wemm *p++ = 'r'; 105662909a7SPeter Wemm else 106662909a7SPeter Wemm *p++ = '-'; 107662909a7SPeter Wemm if (mode & S_IWGRP) 108662909a7SPeter Wemm *p++ = 'w'; 109662909a7SPeter Wemm else 110662909a7SPeter Wemm *p++ = '-'; 111662909a7SPeter Wemm switch (mode & (S_IXGRP | S_ISGID)) { 112662909a7SPeter Wemm case 0: 113662909a7SPeter Wemm *p++ = '-'; 114662909a7SPeter Wemm break; 115662909a7SPeter Wemm case S_IXGRP: 116662909a7SPeter Wemm *p++ = 'x'; 117662909a7SPeter Wemm break; 118662909a7SPeter Wemm case S_ISGID: 119662909a7SPeter Wemm *p++ = 'S'; 120662909a7SPeter Wemm break; 121662909a7SPeter Wemm case S_IXGRP | S_ISGID: 122662909a7SPeter Wemm *p++ = 's'; 123662909a7SPeter Wemm break; 124662909a7SPeter Wemm } 125662909a7SPeter Wemm /* other */ 126662909a7SPeter Wemm if (mode & S_IROTH) 127662909a7SPeter Wemm *p++ = 'r'; 128662909a7SPeter Wemm else 129662909a7SPeter Wemm *p++ = '-'; 130662909a7SPeter Wemm if (mode & S_IWOTH) 131662909a7SPeter Wemm *p++ = 'w'; 132662909a7SPeter Wemm else 133662909a7SPeter Wemm *p++ = '-'; 134662909a7SPeter Wemm switch (mode & (S_IXOTH | S_ISVTX)) { 135662909a7SPeter Wemm case 0: 136662909a7SPeter Wemm *p++ = '-'; 137662909a7SPeter Wemm break; 138662909a7SPeter Wemm case S_IXOTH: 139662909a7SPeter Wemm *p++ = 'x'; 140662909a7SPeter Wemm break; 141662909a7SPeter Wemm case S_ISVTX: 142662909a7SPeter Wemm *p++ = 'T'; 143662909a7SPeter Wemm break; 144662909a7SPeter Wemm case S_IXOTH | S_ISVTX: 145662909a7SPeter Wemm *p++ = 't'; 146662909a7SPeter Wemm break; 147662909a7SPeter Wemm } 148bab43babSEdward Tomasz Napierala *p++ = ' '; 149662909a7SPeter Wemm *p = '\0'; 150662909a7SPeter Wemm } 151