source: rtems/cpukit/libmisc/shell/filemode.c @ ee0c82f

4.104.114.95
Last change on this file since ee0c82f was ee0c82f, checked in by Ralf Corsepius <ralf.corsepius@…>, on 08/02/08 at 05:16:26

Add missing prototypes.

  • Property mode set to 100644
File size: 3.5 KB
Line 
1/*-
2 * Copyright (c) 1990, 1993
3 *      The Regents of the University of California.  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 * 4. Neither the name of the University nor the names of its contributors
14 *    may be used to endorse or promote products derived from this software
15 *    without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#if defined(LIBC_SCCS) && !defined(lint)
31static char sccsid[] = "@(#)strmode.c   8.3 (Berkeley) 8/15/94";
32#endif /* LIBC_SCCS and not lint */
33#include <sys/cdefs.h>
34__FBSDID("$FreeBSD: src/lib/libc/string/strmode.c,v 1.5 2007/01/09 00:28:12 imp Exp $");
35
36#include <sys/types.h>
37#include <sys/stat.h>
38#include <string.h>
39
40void
41strmode(
42        mode_t mode,
43        char *p)
44{
45         /* print type */
46        switch (mode & S_IFMT) {
47        case S_IFDIR:                   /* directory */
48                *p++ = 'd';
49                break;
50        case S_IFCHR:                   /* character special */
51                *p++ = 'c';
52                break;
53        case S_IFBLK:                   /* block special */
54                *p++ = 'b';
55                break;
56        case S_IFREG:                   /* regular */
57                *p++ = '-';
58                break;
59        case S_IFLNK:                   /* symbolic link */
60                *p++ = 'l';
61                break;
62        case S_IFSOCK:                  /* socket */
63                *p++ = 's';
64                break;
65#ifdef S_IFIFO
66        case S_IFIFO:                   /* fifo */
67                *p++ = 'p';
68                break;
69#endif
70#ifdef S_IFWHT
71        case S_IFWHT:                   /* whiteout */
72                *p++ = 'w';
73                break;
74#endif
75        default:                        /* unknown */
76                *p++ = '?';
77                break;
78        }
79        /* usr */
80        if (mode & S_IRUSR)
81                *p++ = 'r';
82        else
83                *p++ = '-';
84        if (mode & S_IWUSR)
85                *p++ = 'w';
86        else
87                *p++ = '-';
88        switch (mode & (S_IXUSR | S_ISUID)) {
89        case 0:
90                *p++ = '-';
91                break;
92        case S_IXUSR:
93                *p++ = 'x';
94                break;
95        case S_ISUID:
96                *p++ = 'S';
97                break;
98        case S_IXUSR | S_ISUID:
99                *p++ = 's';
100                break;
101        }
102        /* group */
103        if (mode & S_IRGRP)
104                *p++ = 'r';
105        else
106                *p++ = '-';
107        if (mode & S_IWGRP)
108                *p++ = 'w';
109        else
110                *p++ = '-';
111        switch (mode & (S_IXGRP | S_ISGID)) {
112        case 0:
113                *p++ = '-';
114                break;
115        case S_IXGRP:
116                *p++ = 'x';
117                break;
118        case S_ISGID:
119                *p++ = 'S';
120                break;
121        case S_IXGRP | S_ISGID:
122                *p++ = 's';
123                break;
124        }
125        /* other */
126        if (mode & S_IROTH)
127                *p++ = 'r';
128        else
129                *p++ = '-';
130        if (mode & S_IWOTH)
131                *p++ = 'w';
132        else
133                *p++ = '-';
134        switch (mode & (S_IXOTH | S_ISVTX)) {
135        case 0:
136                *p++ = '-';
137                break;
138        case S_IXOTH:
139                *p++ = 'x';
140                break;
141        case S_ISVTX:
142                *p++ = 'T';
143                break;
144        case S_IXOTH | S_ISVTX:
145                *p++ = 't';
146                break;
147        }
148        *p++ = ' ';             /* will be a '+' if ACL's implemented */
149        *p = '\0';
150}
Note: See TracBrowser for help on using the repository browser.