]> git.wh0rd.org - dump.git/blob - compat/lib/rmtflags.c
145d6d77b198a2ea05594e669d43dbdef833e51d
[dump.git] / compat / lib / rmtflags.c
1 /*
2 * Ported to Linux's Second Extended File System as part of the
3 * dump and restore backup suit
4 * Remy Card <card@Linux.EU.Org>, 1994-1997
5 * Stelian Pop <stelian@popies.net>, 1999-2000
6 * Stelian Pop <stelian@popies.net> - Alcôve <www.alcove.com>, 2000-2002
7 */
8
9 /*
10 * Copyright (c) 1983, 1993
11 * The Regents of the University of California. All rights reserved.
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution.
21 * 3. All advertising materials mentioning features or use of this software
22 * must display the following acknowledgement:
23 * This product includes software developed by the University of
24 * California, Berkeley and its contributors.
25 * 4. Neither the name of the University nor the names of its contributors
26 * may be used to endorse or promote products derived from this software
27 * without specific prior written permission.
28 *
29 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
30 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 * SUCH DAMAGE.
40 */
41
42 #ifndef lint
43 static const char rcsid[] =
44 "$Id: rmtflags.c,v 1.2 2002/11/15 10:03:12 stelian Exp $";
45 #endif /* not linux */
46
47 /*
48 * rmt
49 */
50 #include <config.h>
51 #include <fcntl.h>
52 #include <string.h>
53 #include <stdio.h>
54 #include <stdlib.h>
55 #include <malloc.h>
56 #include <rmtflags.h>
57
58 struct openflags {
59 char *name;
60 int value;
61 } openflags[] = {
62 { "O_RDONLY", O_RDONLY },
63 { "O_WRONLY", O_WRONLY },
64 { "O_RDWR", O_RDWR },
65 #ifdef O_CREAT
66 { "O_CREAT", O_CREAT },
67 #endif
68 #ifdef O_EXCL
69 { "O_EXCL", O_EXCL },
70 #endif
71 #ifdef O_NOCTTY
72 { "O_NOCTTY", O_NOCTTY },
73 #endif
74 #ifdef O_TRUNC
75 { "O_TRUNC", O_TRUNC },
76 #endif
77 #ifdef O_APPEND
78 { "O_APPEND", O_APPEND },
79 #endif
80 #ifdef O_NONBLOCK
81 { "O_NONBLOCK", O_NONBLOCK },
82 #endif
83 #ifdef O_NDELAY
84 { "O_NDELAY", O_NDELAY },
85 #endif
86 #ifdef O_SYNC
87 { "O_SYNC", O_SYNC },
88 #endif
89 #ifdef O_FSYNC
90 { "O_FSYNC", O_FSYNC },
91 #endif
92 #ifdef O_ASYNC
93 { "O_ASYNC", O_ASYNC },
94 #endif
95 #ifdef O_TEXT
96 { "O_TEXT", O_TEXT },
97 #endif
98 #ifdef O_DSYNC
99 { "O_DSYNC", O_DSYNC },
100 #endif
101 #ifdef O_RSYNC
102 { "O_RSYNC", O_RSYNC },
103 #endif
104 #ifdef O_PRIV
105 { "O_PRIV", O_PRIV },
106 #endif
107 #ifdef O_LARGEFILE
108 { "O_LARGEFILE",O_LARGEFILE },
109 #endif
110 { NULL, 0 }
111 };
112
113 /* Parts of this stolen again from Jörg Schilling's star package... */
114 int
115 rmtflags_toint(char *filemode)
116 {
117 char *p = filemode;
118 struct openflags *op;
119 int result = 0;
120 int numresult = 0;
121 int seentext = 0;
122
123 do {
124 /* skip space */
125 while (*p != '\0' && *p == ' ')
126 p++;
127 /* get O_XXXX constant */
128 if (p[0] != 'O' || p[1] != '_') {
129 /* numeric syntax detected */
130 numresult = atoi(filemode);
131 numresult &= O_RDONLY | O_WRONLY | O_RDWR;
132 while (*p != ' ' && *p != '\0')
133 p++;
134 while (*p != '\0' && *p == ' ')
135 p++;
136 }
137
138 if (*p == '\0')
139 break;
140
141 /* translate O_XXXX constant */
142 for (op = openflags; op->name; op++) {
143 int slen = strlen(op->name);
144 if ((strncmp(op->name, p, slen) == 0) &&
145 (p[slen] == '|' || p[slen] == ' ' ||
146 p[slen] == '\0')) {
147 seentext = 1;
148 result |= op->value;
149 break;
150 }
151 }
152
153 /* goto next constant */
154 p = strchr(p, '|');
155 } while (p && *p++ == '|');
156
157 if (!seentext)
158 result = numresult;
159 return result;
160 }
161
162 char *
163 rmtflags_tochar(int filemode)
164 {
165 struct openflags *op;
166 char *result = (char *) malloc(4096); /* enough space */
167
168 switch (filemode & O_ACCMODE) {
169 case O_RDONLY:
170 strcpy(result, "O_RDONLY");
171 break;
172 case O_WRONLY:
173 strcpy(result, "O_WRONLY");
174 break;
175 case O_RDWR:
176 strcpy(result, "O_RDWR");
177 break;
178 default:
179 strcat(result, "ERROR");
180 }
181 for (op = openflags; op->name; op++) {
182 if (op->value == O_RDONLY ||
183 op->value == O_WRONLY ||
184 op->value == O_RDWR)
185 continue;
186 if (filemode & op->value) {
187 strcat(result, "|");
188 strcat(result, op->name);
189 }
190 }
191 return result;
192 }