~ubuntu-branches/ubuntu/edgy/openssh/edgy

« back to all changes in this revision

Viewing changes to openbsd-compat/strmode.c

  • Committer: Bazaar Package Importer
  • Author(s): Noah Meyerhans
  • Date: 2006-10-31 17:53:38 UTC
  • Revision ID: james.westby@ubuntu.com-20061031175338-kh299ada2qc2kzlb
Tags: upstream-3.8.1p1
ImportĀ upstreamĀ versionĀ 3.8.1p1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* OPENBSD ORIGINAL: lib/libc/string/strmode.c */
 
2
 
 
3
/*-
 
4
 * Copyright (c) 1990 The Regents of the University of California.
 
5
 * All rights reserved.
 
6
 *
 
7
 * Redistribution and use in source and binary forms, with or without
 
8
 * modification, are permitted provided that the following conditions
 
9
 * are met:
 
10
 * 1. Redistributions of source code must retain the above copyright
 
11
 *    notice, this list of conditions and the following disclaimer.
 
12
 * 2. Redistributions in binary form must reproduce the above copyright
 
13
 *    notice, this list of conditions and the following disclaimer in the
 
14
 *    documentation and/or other materials provided with the distribution.
 
15
 * 3. Neither the name of the University nor the names of its contributors
 
16
 *    may be used to endorse or promote products derived from this software
 
17
 *    without specific prior written permission.
 
18
 *
 
19
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 
20
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
21
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 
22
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 
23
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 
24
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 
25
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
26
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 
27
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 
28
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 
29
 * SUCH DAMAGE.
 
30
 */
 
31
 
 
32
#include "includes.h"
 
33
#ifndef HAVE_STRMODE
 
34
 
 
35
#if defined(LIBC_SCCS) && !defined(lint)
 
36
static char *rcsid = "$OpenBSD: strmode.c,v 1.5 2003/06/11 21:08:16 deraadt Exp $";
 
37
#endif /* LIBC_SCCS and not lint */
 
38
 
 
39
#include <sys/types.h>
 
40
#include <sys/stat.h>
 
41
#include <string.h>
 
42
 
 
43
/* XXX mode should be mode_t */
 
44
 
 
45
void
 
46
strmode(int mode, 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