]> git.wh0rd.org - dump.git/blob - compat/lib/rmtflags.c
Be sure the di_size in a map header has the correct value.
[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. Neither the name of the University nor the names of its contributors
22 * may be used to endorse or promote products derived from this software
23 * without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * SUCH DAMAGE.
36 */
37
38 #ifndef lint
39 static const char rcsid[] =
40 "$Id: rmtflags.c,v 1.3 2003/03/30 15:40:35 stelian Exp $";
41 #endif /* not linux */
42
43 /*
44 * rmt
45 */
46 #include <config.h>
47 #include <fcntl.h>
48 #include <string.h>
49 #include <stdio.h>
50 #include <stdlib.h>
51 #include <malloc.h>
52 #include <rmtflags.h>
53
54 struct openflags {
55 char *name;
56 int value;
57 } openflags[] = {
58 { "O_RDONLY", O_RDONLY },
59 { "O_WRONLY", O_WRONLY },
60 { "O_RDWR", O_RDWR },
61 #ifdef O_CREAT
62 { "O_CREAT", O_CREAT },
63 #endif
64 #ifdef O_EXCL
65 { "O_EXCL", O_EXCL },
66 #endif
67 #ifdef O_NOCTTY
68 { "O_NOCTTY", O_NOCTTY },
69 #endif
70 #ifdef O_TRUNC
71 { "O_TRUNC", O_TRUNC },
72 #endif
73 #ifdef O_APPEND
74 { "O_APPEND", O_APPEND },
75 #endif
76 #ifdef O_NONBLOCK
77 { "O_NONBLOCK", O_NONBLOCK },
78 #endif
79 #ifdef O_NDELAY
80 { "O_NDELAY", O_NDELAY },
81 #endif
82 #ifdef O_SYNC
83 { "O_SYNC", O_SYNC },
84 #endif
85 #ifdef O_FSYNC
86 { "O_FSYNC", O_FSYNC },
87 #endif
88 #ifdef O_ASYNC
89 { "O_ASYNC", O_ASYNC },
90 #endif
91 #ifdef O_TEXT
92 { "O_TEXT", O_TEXT },
93 #endif
94 #ifdef O_DSYNC
95 { "O_DSYNC", O_DSYNC },
96 #endif
97 #ifdef O_RSYNC
98 { "O_RSYNC", O_RSYNC },
99 #endif
100 #ifdef O_PRIV
101 { "O_PRIV", O_PRIV },
102 #endif
103 #ifdef O_LARGEFILE
104 { "O_LARGEFILE",O_LARGEFILE },
105 #endif
106 { NULL, 0 }
107 };
108
109 /* Parts of this stolen again from Jörg Schilling's star package... */
110 int
111 rmtflags_toint(char *filemode)
112 {
113 char *p = filemode;
114 struct openflags *op;
115 int result = 0;
116 int numresult = 0;
117 int seentext = 0;
118
119 do {
120 /* skip space */
121 while (*p != '\0' && *p == ' ')
122 p++;
123 /* get O_XXXX constant */
124 if (p[0] != 'O' || p[1] != '_') {
125 /* numeric syntax detected */
126 numresult = atoi(filemode);
127 numresult &= O_RDONLY | O_WRONLY | O_RDWR;
128 while (*p != ' ' && *p != '\0')
129 p++;
130 while (*p != '\0' && *p == ' ')
131 p++;
132 }
133
134 if (*p == '\0')
135 break;
136
137 /* translate O_XXXX constant */
138 for (op = openflags; op->name; op++) {
139 int slen = strlen(op->name);
140 if ((strncmp(op->name, p, slen) == 0) &&
141 (p[slen] == '|' || p[slen] == ' ' ||
142 p[slen] == '\0')) {
143 seentext = 1;
144 result |= op->value;
145 break;
146 }
147 }
148
149 /* goto next constant */
150 p = strchr(p, '|');
151 } while (p && *p++ == '|');
152
153 if (!seentext)
154 result = numresult;
155 return result;
156 }
157
158 char *
159 rmtflags_tochar(int filemode)
160 {
161 struct openflags *op;
162 char *result = (char *) malloc(4096); /* enough space */
163
164 switch (filemode & O_ACCMODE) {
165 case O_RDONLY:
166 strcpy(result, "O_RDONLY");
167 break;
168 case O_WRONLY:
169 strcpy(result, "O_WRONLY");
170 break;
171 case O_RDWR:
172 strcpy(result, "O_RDWR");
173 break;
174 default:
175 strcat(result, "ERROR");
176 }
177 for (op = openflags; op->name; op++) {
178 if (op->value == O_RDONLY ||
179 op->value == O_WRONLY ||
180 op->value == O_RDWR)
181 continue;
182 if (filemode & op->value) {
183 strcat(result, "|");
184 strcat(result, op->name);
185 }
186 }
187 return result;
188 }