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