1 /**
2 * @node libcomprex/fsnode.c FsNodesystem node structures
3 *
4 * $Id: fsnode.c,v 1.5 2003/01/01 06:22:36 chipx86 Exp $
5 *
6 * @Copyright (C) 2001-2003 The GNUpdate Project.
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
17 *
18 * You should have received a copy of the GNU Library General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
22 */
23 #include <libcomprex/internal.h>
24 #include <libcomprex/fsnode.h>
25
26 CxFsNode *
cxNewFsNode(void)27 cxNewFsNode(void)
28 {
29 CxFsNode *node;
30
31 MEM_CHECK(node = (CxFsNode *)malloc(sizeof(CxFsNode)));
32 memset(node, 0, sizeof(CxFsNode));
33
34 cxSetFsNodeType(node, CX_FSNODETYPE_UNKNOWN);
35
36 CX_LINK(node);
37
38 return node;
39 }
40
41 void
cxDestroyFsNode(CxFsNode * node)42 cxDestroyFsNode(CxFsNode *node)
43 {
44 if (node == NULL || node->refCount == 0)
45 return;
46
47 CX_UNLINK(node);
48
49 if (node->refCount > 0)
50 return;
51
52 if (node->name != NULL) free(node->name);
53 if (node->path != NULL) free(node->path);
54
55 free(node);
56 }
57
58 void
cxSetFsNodeArchive(CxFsNode * node,CxArchive * archive)59 cxSetFsNodeArchive(CxFsNode *node, CxArchive *archive)
60 {
61 if (node == NULL)
62 return;
63
64 #if 0
65 if (node->archive != NULL && node->archive->refCount > 0)
66 cxDestroyArchive(node->archive);
67 #endif
68
69 node->archive = archive;
70
71 #if 0
72 if (archive != NULL)
73 {
74 CX_LINK(archive);
75 }
76 #endif
77 }
78
79 void
cxSetFsNodeParent(CxFsNode * node,CxDirectory * parent)80 cxSetFsNodeParent(CxFsNode *node, CxDirectory *parent)
81 {
82 if (node == NULL)
83 return;
84
85 node->parentDir = parent;
86 }
87
88 void
cxSetFsNodeName(CxFsNode * node,const char * name)89 cxSetFsNodeName(CxFsNode *node, const char *name)
90 {
91 if (node == NULL)
92 return;
93
94 if (node->name != NULL)
95 free(node->name);
96
97 node->name = (name == NULL ? NULL : strdup(name));
98 }
99
100 void
cxSetFsNodeType(CxFsNode * node,CxFsNodeType type)101 cxSetFsNodeType(CxFsNode *node, CxFsNodeType type)
102 {
103 if (node == NULL)
104 return;
105
106 node->type = type;
107 }
108
109 void
cxSetFsNodeMode(CxFsNode * node,mode_t mode)110 cxSetFsNodeMode(CxFsNode *node, mode_t mode)
111 {
112 if (node == NULL)
113 return;
114
115 node->mode = mode;
116 }
117
118 void
cxSetFsNodeUid(CxFsNode * node,uid_t uid)119 cxSetFsNodeUid(CxFsNode *node, uid_t uid)
120 {
121 if (node == NULL)
122 return;
123
124 node->uid = uid;
125 }
126
127 void
cxSetFsNodeGid(CxFsNode * node,gid_t gid)128 cxSetFsNodeGid(CxFsNode *node, gid_t gid)
129 {
130 if (node == NULL)
131 return;
132
133 node->gid = gid;
134 }
135
136 void
cxSetFsNodeDate(CxFsNode * node,time_t date)137 cxSetFsNodeDate(CxFsNode *node, time_t date)
138 {
139 if (node == NULL)
140 return;
141
142 node->date = date;
143 }
144
145 void
cxSetFsNodeLocal(CxFsNode * node,char isLocalFsNode)146 cxSetFsNodeLocal(CxFsNode *node, char isLocalFsNode)
147 {
148 if (node == NULL)
149 return;
150
151 node->isLocal = (isLocalFsNode == 0 ? 0 : 1);
152 }
153
154 CxArchive *
cxGetFsNodeArchive(CxFsNode * node)155 cxGetFsNodeArchive(CxFsNode *node)
156 {
157 if (node == NULL)
158 return NULL;
159
160 return node->archive;
161 }
162
163 CxDirectory *
cxGetFsNodeParent(CxFsNode * node)164 cxGetFsNodeParent(CxFsNode *node)
165 {
166 if (node == NULL)
167 return NULL;
168
169 return node->parentDir;
170 }
171
172 const char *
cxGetFsNodeName(CxFsNode * node)173 cxGetFsNodeName(CxFsNode *node)
174 {
175 if (node == NULL)
176 return NULL;
177
178 return node->name;
179 }
180
181 const char *
cxGetFsNodePath(CxFsNode * node)182 cxGetFsNodePath(CxFsNode *node)
183 {
184 int len = 0;
185 const char *parentPath, *nodeName;
186 char *path;
187
188 if (node == NULL)
189 return NULL;
190
191 if ((nodeName = cxGetFsNodeName(node)) == NULL)
192 return NULL;
193
194 len += strlen(nodeName);
195
196 if ((parentPath = cxGetFsNodePath(cxGetFsNodeParent(node))) != NULL)
197 {
198 len += strlen(parentPath);
199
200 if (strcmp(parentPath, "/"))
201 len++;
202 }
203
204 MEM_CHECK(path = (char *)malloc(len + 1));
205
206 if (parentPath != NULL)
207 {
208 snprintf(path, len + 1, "%s/%s",
209 (!strcmp(parentPath, "/") ? "" : parentPath),
210 nodeName);
211 }
212 else
213 {
214 path = strdup(nodeName);
215 }
216
217 return path;
218 }
219
220 CxFsNodeType
cxGetFsNodeType(CxFsNode * node)221 cxGetFsNodeType(CxFsNode *node)
222 {
223 if (node == NULL)
224 return CX_FSNODETYPE_UNKNOWN;
225
226 return node->type;
227 }
228
229 mode_t
cxGetFsNodeMode(CxFsNode * node)230 cxGetFsNodeMode(CxFsNode *node)
231 {
232 if (node == NULL)
233 return 0;
234
235 return node->mode;
236 }
237
238 uid_t
cxGetFsNodeUid(CxFsNode * node)239 cxGetFsNodeUid(CxFsNode *node)
240 {
241 if (node == NULL)
242 return 0; /* ??? */
243
244 return node->uid;
245 }
246
247 gid_t
cxGetFsNodeGid(CxFsNode * node)248 cxGetFsNodeGid(CxFsNode *node)
249 {
250 if (node == NULL)
251 return 0; /* ??? */
252
253 return node->gid;
254 }
255
256 time_t
cxGetFsNodeDate(CxFsNode * node)257 cxGetFsNodeDate(CxFsNode *node)
258 {
259 if (node == NULL)
260 return 0;
261
262 return node->date;
263 }
264
265 char
cxIsFsNodeLocal(CxFsNode * node)266 cxIsFsNodeLocal(CxFsNode *node)
267 {
268 if (node == NULL)
269 return 0;
270
271 return node->isLocal;
272 }
273
274 CxFsNode *
cxGetNextFsNode(CxFsNode * node)275 cxGetNextFsNode(CxFsNode *node)
276 {
277 if (node == NULL)
278 return NULL;
279
280 return node->next;
281 }
282
283 CxFsNode *
cxGetPreviousFsNode(CxFsNode * node)284 cxGetPreviousFsNode(CxFsNode *node)
285 {
286 if (node == NULL)
287 return NULL;
288
289 return node->prev;
290 }
291
292