]> git.wh0rd.org - dump.git/blob - compat/lib/rmtflags.c
Fix rmtopen() extended format...
[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.1 2002/07/29 12:00:33 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
57 struct openflags {
58 char *name;
59 int value;
60 } openflags[] = {
61 { "O_RDONLY", O_RDONLY },
62 { "O_WRONLY", O_WRONLY },
63 { "O_RDWR", O_RDWR },
64 #ifdef O_CREAT
65 { "O_CREAT", O_CREAT },
66 #endif
67 #ifdef O_EXCL
68 { "O_EXCL", O_EXCL },
69 #endif
70 #ifdef O_NOCTTY
71 { "O_NOCTTY", O_NOCTTY },
72 #endif
73 #ifdef O_TRUNC
74 { "O_TRUNC", O_TRUNC },
75 #endif
76 #ifdef O_APPEND
77 { "O_APPEND", O_APPEND },
78 #endif
79 #ifdef O_NONBLOCK
80 { "O_NONBLOCK", O_NONBLOCK },
81 #endif
82 #ifdef O_NDELAY
83 { "O_NDELAY", O_NDELAY },
84 #endif
85 #ifdef O_SYNC
86 { "O_SYNC", O_SYNC },
87 #endif
88 #ifdef O_FSYNC
89 { "O_FSYNC", O_FSYNC },
90 #endif
91 #ifdef O_ASYNC
92 { "O_ASYNC", O_ASYNC },
93 #endif
94 #ifdef O_TEXT
95 { "O_TEXT", O_TEXT },
96 #endif
97 #ifdef O_DSYNC
98 { "O_DSYNC", O_DSYNC },
99 #endif
100 #ifdef O_RSYNC
101 { "O_RSYNC", O_RSYNC },
102 #endif
103 #ifdef O_PRIV
104 { "O_PRIV", O_PRIV },
105 #endif
106 #ifdef O_LARGEFILE
107 { "O_LARGEFILE",O_LARGEFILE },
108 #endif
109 { NULL, 0 }
110 };
111
112 /* Parts of this stolen again from Jörg Schilling's star package... */
113 int
114 rmtflags_toint(char *filemode)
115 {
116 char *p = filemode;
117 struct openflags *op;
118 int result = 0;
119 int numresult = 0;
120 int seentext = 0;
121
122 do {
123 /* skip space */
124 while (*p != '\0' && *p == ' ')
125 p++;
126 /* get O_XXXX constant */
127 if (p[0] != 'O' || p[1] != '_') {
128 /* numeric syntax detected */
129 numresult = atoi(filemode);
130 numresult &= O_RDONLY | O_WRONLY | O_RDWR;
131 while (*p != ' ' && *p != '\0')
132 p++;
133 while (*p != '\0' && *p == ' ')
134 p++;
135 }
136
137 if (*p == '\0')
138 break;
139
140 /* translate O_XXXX constant */
141 for (op = openflags; op->name; op++) {
142 int slen = strlen(op->name);
143 if ((strncmp(op->name, p, slen) == 0) &&
144 (p[slen] == '|' || p[slen] == ' ' ||
145 p[slen] == '\0')) {
146 seentext = 1;
147 result |= op->value;
148 break;
149 }
150 }
151
152 /* goto next constant */
153 p = strchr(p, '|');
154 } while (p && *p++ == '|');
155
156 if (!seentext)
157 result = numresult;
158 return result;
159 }
160
161 char *
162 rmtflags_tochar(int filemode)
163 {
164 struct openflags *op;
165 char *result = (char *) malloc(4096); /* enough space */
166
167 switch (filemode & O_ACCMODE) {
168 case O_RDONLY:
169 strcpy(result, "O_RDONLY");
170 break;
171 case O_WRONLY:
172 strcpy(result, "O_WRONLY");
173 break;
174 case O_RDWR:
175 strcpy(result, "O_RDWR");
176 break;
177 default:
178 strcat(result, "ERROR");
179 }
180 for (op = openflags; op->name; op++) {
181 if (op->value == O_RDONLY ||
182 op->value == O_WRONLY ||
183 op->value == O_RDWR)
184 continue;
185 if (filemode & op->value) {
186 strcat(result, "|");
187 strcat(result, op->name);
188 }
189 }
190 return result;
191 }