annotate direct/yaffsfs.c @ 215:b08276bd7b2d

Clean up some yaffs1 mode issues.
author charles
date Wed, 02 Jul 2008 21:17:41 +0100
parents fad21fd1971d
children 6dbe40ae9e54
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1 /*
173
1c249b949b11 normalise licence headers
wookey
parents: 169
diff changeset
2 * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
3 *
173
1c249b949b11 normalise licence headers
wookey
parents: 169
diff changeset
4 * Copyright (C) 2002-2007 Aleph One Ltd.
1c249b949b11 normalise licence headers
wookey
parents: 169
diff changeset
5 * for Toby Churchill Ltd and Brightstar Engineering
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
6 *
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
7 * Created by Charles Manning <charles@aleph1.co.uk>
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
8 *
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
10 * it under the terms of the GNU General Public License version 2 as
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
11 * published by the Free Software Foundation.
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
12 */
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
13
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
14 #include "yaffsfs.h"
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
15 #include "yaffs_guts.h"
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
16 #include "yaffscfg.h"
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
17 #include <string.h> // for memset
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
18 #include "yportenv.h"
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
19
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
20 #define YAFFSFS_MAX_SYMLINK_DEREFERENCES 5
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
21
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
22 #ifndef NULL
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
23 #define NULL ((void *)0)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
24 #endif
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
25
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
26
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
27 const char *yaffsfs_c_version="$Id$";
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
28
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
29 // configurationList is the list of devices that are supported
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
30 static yaffsfs_DeviceConfiguration *yaffsfs_configurationList;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
31
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
32
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
33 /* Some forward references */
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
34 static yaffs_Object *yaffsfs_FindObject(yaffs_Object *relativeDirectory, const YCHAR *path, int symDepth);
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
35 static void yaffsfs_RemoveObjectCallback(yaffs_Object *obj);
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
36
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
37
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
38 // Handle management.
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
39 //
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
40
185
fa4e74c5013d Rolling in Ians and other changes
charles
parents: 177
diff changeset
41
fa4e74c5013d Rolling in Ians and other changes
charles
parents: 177
diff changeset
42 unsigned int yaffs_wr_attempts;
fa4e74c5013d Rolling in Ians and other changes
charles
parents: 177
diff changeset
43
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
44 typedef struct
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
45 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
46 __u8 inUse:1; // this handle is in use
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
47 __u8 readOnly:1; // this handle is read only
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
48 __u8 append:1; // append only
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
49 __u8 exclusive:1; // exclusive
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
50 __u32 position; // current position in file
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
51 yaffs_Object *obj; // the object
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
52 }yaffsfs_Handle;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
53
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
54
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
55 static yaffsfs_Handle yaffsfs_handle[YAFFSFS_N_HANDLES];
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
56
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
57 // yaffsfs_InitHandle
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
58 /// Inilitalise handles on start-up.
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
59 //
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
60 static int yaffsfs_InitHandles(void)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
61 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
62 int i;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
63 for(i = 0; i < YAFFSFS_N_HANDLES; i++)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
64 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
65 yaffsfs_handle[i].inUse = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
66 yaffsfs_handle[i].obj = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
67 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
68 return 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
69 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
70
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
71 yaffsfs_Handle *yaffsfs_GetHandlePointer(int h)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
72 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
73 if(h < 0 || h >= YAFFSFS_N_HANDLES)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
74 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
75 return NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
76 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
77
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
78 return &yaffsfs_handle[h];
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
79 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
80
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
81 yaffs_Object *yaffsfs_GetHandleObject(int handle)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
82 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
83 yaffsfs_Handle *h = yaffsfs_GetHandlePointer(handle);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
84
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
85 if(h && h->inUse)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
86 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
87 return h->obj;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
88 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
89
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
90 return NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
91 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
92
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
93
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
94 //yaffsfs_GetHandle
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
95 // Grab a handle (when opening a file)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
96 //
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
97
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
98 static int yaffsfs_GetHandle(void)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
99 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
100 int i;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
101 yaffsfs_Handle *h;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
102
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
103 for(i = 0; i < YAFFSFS_N_HANDLES; i++)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
104 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
105 h = yaffsfs_GetHandlePointer(i);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
106 if(!h)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
107 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
108 // todo bug: should never happen
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
109 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
110 if(!h->inUse)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
111 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
112 memset(h,0,sizeof(yaffsfs_Handle));
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
113 h->inUse=1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
114 return i;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
115 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
116 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
117 return -1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
118 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
119
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
120 // yaffs_PutHandle
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
121 // Let go of a handle (when closing a file)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
122 //
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
123 static int yaffsfs_PutHandle(int handle)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
124 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
125 yaffsfs_Handle *h = yaffsfs_GetHandlePointer(handle);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
126
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
127 if(h)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
128 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
129 h->inUse = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
130 h->obj = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
131 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
132 return 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
133 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
134
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
135
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
136
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
137 // Stuff to search for a directory from a path
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
138
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
139
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
140 int yaffsfs_Match(YCHAR a, YCHAR b)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
141 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
142 // case sensitive
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
143 return (a == b);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
144 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
145
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
146 int yaffsfs_IsPathDivider(YCHAR ch)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
147 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
148 YCHAR *str = YAFFS_PATH_DIVIDERS;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
149
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
150 while(*str){
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
151 if(*str == ch)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
152 return 1;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
153 str++;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
154 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
155
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
156 return 0;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
157 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
158
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
159 // yaffsfs_FindDevice
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
160 // yaffsfs_FindRoot
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
161 // Scan the configuration list to find the root.
94
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
162 // Curveballs: Should match paths that end in '/' too
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
163 // Curveball2 Might have "/x/ and "/x/y". Need to return the longest match
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
164 static yaffs_Device *yaffsfs_FindDevice(const YCHAR *path, YCHAR **restOfPath)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
165 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
166 yaffsfs_DeviceConfiguration *cfg = yaffsfs_configurationList;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
167 const YCHAR *leftOver;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
168 const YCHAR *p;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
169 yaffs_Device *retval = NULL;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
170 int thisMatchLength;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
171 int longestMatch = -1;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
172
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
173 // Check all configs, choose the one that:
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
174 // 1) Actually matches a prefix (ie /a amd /abc will not match
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
175 // 2) Matches the longest.
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
176 while(cfg && cfg->prefix && cfg->dev)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
177 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
178 leftOver = path;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
179 p = cfg->prefix;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
180 thisMatchLength = 0;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
181
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
182
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
183 // Strip off any leading /'s
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
184
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
185 while(yaffsfs_IsPathDivider(*p))
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
186 p++;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
187
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
188 while(yaffsfs_IsPathDivider(*leftOver))
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
189 leftOver++;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
190
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
191 while(*p && *leftOver &&
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
192 yaffsfs_Match(*p,*leftOver))
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
193 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
194 p++;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
195 leftOver++;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
196 thisMatchLength++;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
197
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
198 // Skip over any multiple /'s to treat them as one or
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
199 // skip over a trailling / in the prefix, but not the matching string
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
200 while(yaffsfs_IsPathDivider(*p) &&
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
201 (yaffsfs_IsPathDivider(*(p+1)) || !(*(p+1))))
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
202 p++;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
203
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
204 // Only skip over multiple /'s
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
205 while(yaffsfs_IsPathDivider(*leftOver) &&
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
206 yaffsfs_IsPathDivider(*(leftOver+1)))
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
207 leftOver++;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
208 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
209
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
210
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
211 if((!*p ) &&
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
212 (!*leftOver || yaffsfs_IsPathDivider(*leftOver)) && // no more in this path name part
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
213 (thisMatchLength > longestMatch))
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
214 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
215 // Matched prefix
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
216 *restOfPath = (YCHAR *)leftOver;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
217 retval = cfg->dev;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
218 longestMatch = thisMatchLength;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
219 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
220 cfg++;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
221 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
222 return retval;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
223 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
224
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
225 #if 0
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
226 static yaffs_Device *yaffsfs_FindDevice(const YCHAR *path, YCHAR **restOfPath)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
227 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
228 yaffsfs_DeviceConfiguration *cfg = yaffsfs_configurationList;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
229 const YCHAR *leftOver;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
230 const YCHAR *p;
94
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
231 yaffs_Device *retval = NULL;
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
232 int thisMatchLength;
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
233 int longestMatch = -1;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
234
94
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
235 // Check all configs, choose the one that:
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
236 // 1) Actually matches a prefix (ie /a amd /abc will not match
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
237 // 2) Matches the longest.
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
238 while(cfg && cfg->prefix && cfg->dev)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
239 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
240 leftOver = path;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
241 p = cfg->prefix;
94
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
242 thisMatchLength = 0;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
243
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
244 while(*p && //unmatched part of prefix
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
245 !(yaffsfs_IsPathDivider(*p) && (p[1] == 0)) && // the rest of the prefix is not / (to catch / at end)
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
246 *leftOver &&
94
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
247 yaffsfs_Match(*p,*leftOver))
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
248 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
249 p++;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
250 leftOver++;
94
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
251 thisMatchLength++;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
252 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
253
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
254
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
255 if((!*p || (yaffsfs_IsPathDivider(*p) && (p[1] == 0))) && // end of prefix
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
256 (!*leftOver || yaffsfs_IsPathDivider(*leftOver)) && // no more in this path name part
94
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
257 (thisMatchLength > longestMatch))
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
258 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
259 // Matched prefix
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
260 *restOfPath = (YCHAR *)leftOver;
94
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
261 retval = cfg->dev;
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
262 longestMatch = thisMatchLength;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
263 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
264 cfg++;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
265 }
94
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
266 return retval;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
267 }
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
268 #endif
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
269
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
270 static yaffs_Object *yaffsfs_FindRoot(const YCHAR *path, YCHAR **restOfPath)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
271 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
272
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
273 yaffs_Device *dev;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
274
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
275 dev= yaffsfs_FindDevice(path,restOfPath);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
276 if(dev && dev->isMounted)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
277 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
278 return dev->rootDir;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
279 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
280 return NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
281 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
282
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
283 static yaffs_Object *yaffsfs_FollowLink(yaffs_Object *obj,int symDepth)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
284 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
285
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
286 while(obj && obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
287 {
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
288 YCHAR *alias = obj->variant.symLinkVariant.alias;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
289
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
290 if(yaffsfs_IsPathDivider(*alias))
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
291 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
292 // Starts with a /, need to scan from root up
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
293 obj = yaffsfs_FindObject(NULL,alias,symDepth++);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
294 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
295 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
296 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
297 // Relative to here, so use the parent of the symlink as a start
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
298 obj = yaffsfs_FindObject(obj->parent,alias,symDepth++);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
299 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
300 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
301 return obj;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
302 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
303
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
304
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
305 // yaffsfs_FindDirectory
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
306 // Parse a path to determine the directory and the name within the directory.
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
307 //
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
308 // eg. "/data/xx/ff" --> puts name="ff" and returns the directory "/data/xx"
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
309 static yaffs_Object *yaffsfs_DoFindDirectory(yaffs_Object *startDir,const YCHAR *path,YCHAR **name,int symDepth)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
310 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
311 yaffs_Object *dir;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
312 YCHAR *restOfPath;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
313 YCHAR str[YAFFS_MAX_NAME_LENGTH+1];
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
314 int i;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
315
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
316 if(symDepth > YAFFSFS_MAX_SYMLINK_DEREFERENCES)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
317 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
318 return NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
319 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
320
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
321 if(startDir)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
322 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
323 dir = startDir;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
324 restOfPath = (YCHAR *)path;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
325 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
326 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
327 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
328 dir = yaffsfs_FindRoot(path,&restOfPath);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
329 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
330
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
331 while(dir)
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
332 {
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
333 // parse off /.
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
334 // curve ball: also throw away surplus '/'
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
335 // eg. "/ram/x////ff" gets treated the same as "/ram/x/ff"
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
336 while(yaffsfs_IsPathDivider(*restOfPath))
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
337 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
338 restOfPath++; // get rid of '/'
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
339 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
340
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
341 *name = restOfPath;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
342 i = 0;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
343
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
344 while(*restOfPath && !yaffsfs_IsPathDivider(*restOfPath))
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
345 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
346 if (i < YAFFS_MAX_NAME_LENGTH)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
347 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
348 str[i] = *restOfPath;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
349 str[i+1] = '\0';
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
350 i++;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
351 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
352 restOfPath++;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
353 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
354
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
355 if(!*restOfPath)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
356 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
357 // got to the end of the string
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
358 return dir;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
359 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
360 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
361 {
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
362 if(yaffs_strcmp(str,_Y(".")) == 0)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
363 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
364 // Do nothing
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
365 }
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
366 else if(yaffs_strcmp(str,_Y("..")) == 0)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
367 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
368 dir = dir->parent;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
369 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
370 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
371 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
372 dir = yaffs_FindObjectByName(dir,str);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
373
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
374 while(dir && dir->variantType == YAFFS_OBJECT_TYPE_SYMLINK)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
375 {
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
376
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
377 dir = yaffsfs_FollowLink(dir,symDepth);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
378
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
379 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
380
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
381 if(dir && dir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
382 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
383 dir = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
384 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
385 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
386 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
387 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
388 // directory did not exist.
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
389 return NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
390 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
391
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
392 static yaffs_Object *yaffsfs_FindDirectory(yaffs_Object *relativeDirectory,const YCHAR *path,YCHAR **name,int symDepth)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
393 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
394 return yaffsfs_DoFindDirectory(relativeDirectory,path,name,symDepth);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
395 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
396
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
397 // yaffsfs_FindObject turns a path for an existing object into the object
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
398 //
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
399 static yaffs_Object *yaffsfs_FindObject(yaffs_Object *relativeDirectory, const YCHAR *path,int symDepth)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
400 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
401 yaffs_Object *dir;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
402 YCHAR *name;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
403
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
404 dir = yaffsfs_FindDirectory(relativeDirectory,path,&name,symDepth);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
405
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
406 if(dir && *name)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
407 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
408 return yaffs_FindObjectByName(dir,name);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
409 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
410
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
411 return dir;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
412 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
413
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
414
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
415 int yaffs_dup(int fd)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
416 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
417 int newHandle = -1;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
418 yaffsfs_Handle *oldPtr = NULL;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
419 yaffsfs_Handle *newPtr = NULL;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
420
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
421 yaffsfs_Lock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
422
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
423 oldPtr = yaffsfs_GetHandlePointer(fd);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
424 if(oldPtr && oldPtr->inUse)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
425 newHandle = yaffsfs_GetHandle();
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
426 if(newHandle >= 0)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
427 newPtr = yaffsfs_GetHandlePointer(newHandle);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
428
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
429 if(newPtr){
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
430 *newPtr = *oldPtr;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
431 return newHandle;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
432 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
433
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
434 if(!oldPtr)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
435 yaffsfs_SetError(-EBADF);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
436 else
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
437 yaffsfs_SetError(-ENOMEM);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
438
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
439 return -1;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
440
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
441 }
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
442
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
443 int yaffs_open(const YCHAR *path, int oflag, int mode)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
444 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
445 yaffs_Object *obj = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
446 yaffs_Object *dir = NULL;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
447 YCHAR *name;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
448 int handle = -1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
449 yaffsfs_Handle *h = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
450 int alreadyOpen = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
451 int alreadyExclusive = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
452 int openDenied = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
453 int symDepth = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
454 int errorReported = 0;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
455
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
456 int i;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
457
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
458
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
459 // todo sanity check oflag (eg. can't have O_TRUNC without WRONLY or RDWR
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
460
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
461
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
462 yaffsfs_Lock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
463
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
464 handle = yaffsfs_GetHandle();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
465
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
466 if(handle >= 0)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
467 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
468
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
469 h = yaffsfs_GetHandlePointer(handle);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
470
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
471
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
472 // try to find the exisiting object
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
473 obj = yaffsfs_FindObject(NULL,path,0);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
474
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
475 if(obj && obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
476 {
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
477
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
478 obj = yaffsfs_FollowLink(obj,symDepth++);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
479 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
480
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
481 if(obj && obj->variantType != YAFFS_OBJECT_TYPE_FILE)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
482 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
483 obj = NULL;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
484 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
485
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
486 if(obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
487 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
488 // Check if the object is already in use
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
489 alreadyOpen = alreadyExclusive = 0;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
490
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
491 for(i = 0; i <= YAFFSFS_N_HANDLES; i++)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
492 {
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
493
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
494 if(i != handle &&
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
495 yaffsfs_handle[i].inUse &&
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
496 obj == yaffsfs_handle[i].obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
497 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
498 alreadyOpen = 1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
499 if(yaffsfs_handle[i].exclusive)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
500 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
501 alreadyExclusive = 1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
502 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
503 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
504 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
505
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
506 if(((oflag & O_EXCL) && alreadyOpen) || alreadyExclusive)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
507 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
508 openDenied = 1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
509 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
510
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
511 // Open should fail if O_CREAT and O_EXCL are specified
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
512 if((oflag & O_EXCL) && (oflag & O_CREAT))
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
513 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
514 openDenied = 1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
515 yaffsfs_SetError(-EEXIST);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
516 errorReported = 1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
517 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
518
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
519 // Check file permissions
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
520 if( (oflag & (O_RDWR | O_WRONLY)) == 0 && // ie O_RDONLY
23
12ec56e7ccfa Some tinkering on test harness and st_xxx to yst_xxx changes
charles
parents: 19
diff changeset
521 !(obj->yst_mode & S_IREAD))
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
522 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
523 openDenied = 1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
524 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
525
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
526 if( (oflag & O_RDWR) &&
23
12ec56e7ccfa Some tinkering on test harness and st_xxx to yst_xxx changes
charles
parents: 19
diff changeset
527 !(obj->yst_mode & S_IREAD))
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
528 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
529 openDenied = 1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
530 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
531
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
532 if( (oflag & (O_RDWR | O_WRONLY)) &&
23
12ec56e7ccfa Some tinkering on test harness and st_xxx to yst_xxx changes
charles
parents: 19
diff changeset
533 !(obj->yst_mode & S_IWRITE))
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
534 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
535 openDenied = 1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
536 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
537
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
538 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
539
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
540 else if((oflag & O_CREAT))
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
541 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
542 // Let's see if we can create this file
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
543 dir = yaffsfs_FindDirectory(NULL,path,&name,0);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
544 if(dir)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
545 {
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
546 obj = yaffs_MknodFile(dir,name,mode,0,0);
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
547 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
548 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
549 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
550 yaffsfs_SetError(-ENOTDIR);
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
551 errorReported = 1;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
552 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
553 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
554
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
555 if(obj && !openDenied)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
556 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
557 h->obj = obj;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
558 h->inUse = 1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
559 h->readOnly = (oflag & (O_WRONLY | O_RDWR)) ? 0 : 1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
560 h->append = (oflag & O_APPEND) ? 1 : 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
561 h->exclusive = (oflag & O_EXCL) ? 1 : 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
562 h->position = 0;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
563
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
564 obj->inUse++;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
565 if((oflag & O_TRUNC) && !h->readOnly)
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
566 {
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
567 yaffs_ResizeFile(obj,0);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
568 }
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
569
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
570 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
571 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
572 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
573 yaffsfs_PutHandle(handle);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
574 if(!errorReported)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
575 {
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
576 yaffsfs_SetError(-EACCES);
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
577 errorReported = 1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
578 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
579 handle = -1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
580 }
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
581
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
582 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
583
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
584 yaffsfs_Unlock();
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
585
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
586 return handle;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
587 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
588
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
589 int yaffs_flush(int fd)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
590 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
591 yaffsfs_Handle *h = NULL;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
592 int retVal = 0;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
593
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
594 yaffsfs_Lock();
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
595
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
596 h = yaffsfs_GetHandlePointer(fd);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
597
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
598 if(h && h->inUse)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
599 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
600 // flush the file
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
601 yaffs_FlushFile(h->obj,1);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
602 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
603 else
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
604 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
605 // bad handle
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
606 yaffsfs_SetError(-EBADF);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
607 retVal = -1;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
608 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
609
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
610 yaffsfs_Unlock();
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
611
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
612 return retVal;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
613 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
614
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
615
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
616 int yaffs_close(int fd)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
617 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
618 yaffsfs_Handle *h = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
619 int retVal = 0;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
620
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
621 yaffsfs_Lock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
622
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
623 h = yaffsfs_GetHandlePointer(fd);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
624
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
625 if(h && h->inUse)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
626 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
627 // clean up
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
628 yaffs_FlushFile(h->obj,1);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
629 h->obj->inUse--;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
630 if(h->obj->inUse <= 0 && h->obj->unlinked)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
631 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
632 yaffs_DeleteFile(h->obj);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
633 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
634 yaffsfs_PutHandle(fd);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
635 retVal = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
636 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
637 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
638 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
639 // bad handle
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
640 yaffsfs_SetError(-EBADF);
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
641 retVal = -1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
642 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
643
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
644 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
645
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
646 return retVal;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
647 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
648
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
649 int yaffs_read(int fd, void *buf, unsigned int nbyte)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
650 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
651 yaffsfs_Handle *h = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
652 yaffs_Object *obj = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
653 int pos = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
654 int nRead = -1;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
655 unsigned int maxRead;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
656
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
657 yaffsfs_Lock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
658 h = yaffsfs_GetHandlePointer(fd);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
659 obj = yaffsfs_GetHandleObject(fd);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
660
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
661 if(!h || !obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
662 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
663 // bad handle
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
664 yaffsfs_SetError(-EBADF);
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
665 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
666 else if( h && obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
667 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
668 pos= h->position;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
669 if(yaffs_GetObjectFileLength(obj) > pos)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
670 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
671 maxRead = yaffs_GetObjectFileLength(obj) - pos;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
672 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
673 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
674 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
675 maxRead = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
676 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
677
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
678 if(nbyte > maxRead)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
679 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
680 nbyte = maxRead;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
681 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
682
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
683
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
684 if(nbyte > 0)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
685 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
686 nRead = yaffs_ReadDataFromFile(obj,buf,pos,nbyte);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
687 if(nRead >= 0)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
688 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
689 h->position = pos + nRead;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
690 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
691 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
692 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
693 //todo error
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
694 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
695 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
696 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
697 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
698 nRead = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
699 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
700
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
701 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
702
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
703 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
704
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
705
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
706 return (nRead >= 0) ? nRead : -1;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
707
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
708 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
709
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
710 int yaffs_pread(int fd, void *buf, unsigned int nbyte, unsigned int offset)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
711 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
712 yaffsfs_Handle *h = NULL;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
713 yaffs_Object *obj = NULL;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
714 int pos = 0;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
715 int nRead = -1;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
716 unsigned int maxRead;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
717
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
718 yaffsfs_Lock();
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
719 h = yaffsfs_GetHandlePointer(fd);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
720 obj = yaffsfs_GetHandleObject(fd);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
721
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
722 if(!h || !obj)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
723 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
724 // bad handle
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
725 yaffsfs_SetError(-EBADF);
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
726 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
727 else if( h && obj)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
728 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
729 pos= offset;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
730 if(yaffs_GetObjectFileLength(obj) > pos)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
731 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
732 maxRead = yaffs_GetObjectFileLength(obj) - pos;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
733 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
734 else
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
735 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
736 maxRead = 0;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
737 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
738
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
739 if(nbyte > maxRead)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
740 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
741 nbyte = maxRead;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
742 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
743
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
744
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
745 if(nbyte > 0)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
746 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
747 nRead = yaffs_ReadDataFromFile(obj,buf,pos,nbyte);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
748 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
749 else
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
750 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
751 nRead = 0;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
752 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
753
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
754 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
755
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
756 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
757
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
758
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
759 return (nRead >= 0) ? nRead : -1;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
760
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
761 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
762
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
763 int yaffs_write(int fd, const void *buf, unsigned int nbyte)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
764 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
765 yaffsfs_Handle *h = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
766 yaffs_Object *obj = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
767 int pos = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
768 int nWritten = -1;
19
8d0f599f5920 *** empty log message ***
charles
parents: 12
diff changeset
769 int writeThrough = 0;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
770
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
771 yaffsfs_Lock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
772 h = yaffsfs_GetHandlePointer(fd);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
773 obj = yaffsfs_GetHandleObject(fd);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
774
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
775 if(!h || !obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
776 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
777 // bad handle
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
778 yaffsfs_SetError(-EBADF);
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
779 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
780 else if( h && obj && h->readOnly)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
781 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
782 // todo error
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
783 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
784 else if( h && obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
785 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
786 if(h->append)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
787 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
788 pos = yaffs_GetObjectFileLength(obj);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
789 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
790 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
791 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
792 pos = h->position;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
793 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
794
19
8d0f599f5920 *** empty log message ***
charles
parents: 12
diff changeset
795 nWritten = yaffs_WriteDataToFile(obj,buf,pos,nbyte,writeThrough);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
796
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
797 if(nWritten >= 0)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
798 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
799 h->position = pos + nWritten;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
800 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
801 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
802 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
803 //todo error
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
804 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
805
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
806 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
807
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
808 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
809
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
810
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
811 return (nWritten >= 0) ? nWritten : -1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
812
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
813 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
814
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
815 int yaffs_pwrite(int fd, const void *buf, unsigned int nbyte, unsigned int offset)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
816 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
817 yaffsfs_Handle *h = NULL;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
818 yaffs_Object *obj = NULL;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
819 int pos = 0;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
820 int nWritten = -1;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
821 int writeThrough = 0;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
822
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
823 yaffsfs_Lock();
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
824 h = yaffsfs_GetHandlePointer(fd);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
825 obj = yaffsfs_GetHandleObject(fd);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
826
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
827 if(!h || !obj)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
828 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
829 // bad handle
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
830 yaffsfs_SetError(-EBADF);
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
831 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
832 else if( h && obj && h->readOnly)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
833 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
834 // todo error
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
835 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
836 else if( h && obj)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
837 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
838 pos = offset;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
839
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
840 nWritten = yaffs_WriteDataToFile(obj,buf,pos,nbyte,writeThrough);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
841
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
842 if(nWritten < 0 || ((unsigned int)nWritten) < nbyte)
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
843 yaffsfs_SetError(-ENOSPC);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
844
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
845 }
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
846
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
847 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
848
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
849
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
850 return (nWritten >= 0) ? nWritten : -1;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
851
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
852 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
853
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
854
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
855 int yaffs_truncate(const YCHAR *path,off_t newSize)
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
856 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
857 yaffs_Object *obj = NULL;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
858 int result = YAFFS_FAIL;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
859
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
860 yaffsfs_Lock();
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
861
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
862 obj = yaffsfs_FindObject(NULL,path,0);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
863 if(obj)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
864 obj = yaffs_GetEquivalentObject(obj);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
865
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
866 if(!obj)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
867 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
868 yaffsfs_SetError(-ENOENT);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
869 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
870 else if(obj->variantType != YAFFS_OBJECT_TYPE_FILE)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
871 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
872 yaffsfs_SetError(-EISDIR);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
873 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
874 else
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
875 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
876 result = yaffs_ResizeFile(obj,newSize);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
877 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
878
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
879 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
880
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
881
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
882 return (result) ? 0 : -1;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
883 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
884
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
885 int yaffs_ftruncate(int fd, off_t newSize)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
886 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
887 yaffsfs_Handle *h = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
888 yaffs_Object *obj = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
889 int result = 0;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
890
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
891 yaffsfs_Lock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
892 h = yaffsfs_GetHandlePointer(fd);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
893 obj = yaffsfs_GetHandleObject(fd);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
894
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
895 if(!h || !obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
896 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
897 // bad handle
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
898 yaffsfs_SetError(-EBADF);
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
899 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
900 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
901 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
902 // resize the file
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
903 result = yaffs_ResizeFile(obj,newSize);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
904 }
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
905 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
906
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
907
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
908 return (result) ? 0 : -1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
909
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
910 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
911
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
912 off_t yaffs_lseek(int fd, off_t offset, int whence)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
913 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
914 yaffsfs_Handle *h = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
915 yaffs_Object *obj = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
916 int pos = -1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
917 int fSize = -1;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
918
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
919 yaffsfs_Lock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
920 h = yaffsfs_GetHandlePointer(fd);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
921 obj = yaffsfs_GetHandleObject(fd);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
922
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
923 if(!h || !obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
924 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
925 // bad handle
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
926 yaffsfs_SetError(-EBADF);
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
927 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
928 else if(whence == SEEK_SET)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
929 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
930 if(offset >= 0)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
931 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
932 pos = offset;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
933 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
934 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
935 else if(whence == SEEK_CUR)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
936 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
937 if( (h->position + offset) >= 0)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
938 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
939 pos = (h->position + offset);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
940 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
941 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
942 else if(whence == SEEK_END)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
943 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
944 fSize = yaffs_GetObjectFileLength(obj);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
945 if(fSize >= 0 && (fSize + offset) >= 0)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
946 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
947 pos = fSize + offset;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
948 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
949 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
950
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
951 if(pos >= 0)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
952 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
953 h->position = pos;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
954 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
955 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
956 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
957 // todo error
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
958 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
959
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
960
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
961 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
962
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
963 return pos;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
964 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
965
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
966
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
967 int yaffsfs_DoUnlink(const YCHAR *path,int isDirectory)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
968 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
969 yaffs_Object *dir = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
970 yaffs_Object *obj = NULL;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
971 YCHAR *name;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
972 int result = YAFFS_FAIL;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
973
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
974 yaffsfs_Lock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
975
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
976 obj = yaffsfs_FindObject(NULL,path,0);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
977 dir = yaffsfs_FindDirectory(NULL,path,&name,0);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
978 if(!dir)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
979 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
980 yaffsfs_SetError(-ENOTDIR);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
981 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
982 else if(!obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
983 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
984 yaffsfs_SetError(-ENOENT);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
985 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
986 else if(!isDirectory && obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
987 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
988 yaffsfs_SetError(-EISDIR);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
989 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
990 else if(isDirectory && obj->variantType != YAFFS_OBJECT_TYPE_DIRECTORY)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
991 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
992 yaffsfs_SetError(-ENOTDIR);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
993 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
994 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
995 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
996 result = yaffs_Unlink(dir,name);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
997
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
998 if(result == YAFFS_FAIL && isDirectory)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
999 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1000 yaffsfs_SetError(-ENOTEMPTY);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1001 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1002 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1003
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1004 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1005
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1006 // todo error
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1007
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1008 return (result == YAFFS_FAIL) ? -1 : 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1009 }
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1010
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1011
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1012 int yaffs_rmdir(const YCHAR *path)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1013 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1014 return yaffsfs_DoUnlink(path,1);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1015 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1016
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1017 int yaffs_unlink(const YCHAR *path)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1018 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1019 return yaffsfs_DoUnlink(path,0);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1020 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1021
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1022 int yaffs_rename(const YCHAR *oldPath, const YCHAR *newPath)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1023 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1024 yaffs_Object *olddir = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1025 yaffs_Object *newdir = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1026 yaffs_Object *obj = NULL;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1027 YCHAR *oldname;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1028 YCHAR *newname;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1029 int result= YAFFS_FAIL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1030 int renameAllowed = 1;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1031
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1032 yaffsfs_Lock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1033
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1034 olddir = yaffsfs_FindDirectory(NULL,oldPath,&oldname,0);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1035 newdir = yaffsfs_FindDirectory(NULL,newPath,&newname,0);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1036 obj = yaffsfs_FindObject(NULL,oldPath,0);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1037
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1038 if(!olddir || !newdir || !obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1039 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1040 // bad file
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1041 yaffsfs_SetError(-EBADF);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1042 renameAllowed = 0;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1043 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1044 else if(olddir->myDev != newdir->myDev)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1045 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1046 // oops must be on same device
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1047 // todo error
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1048 yaffsfs_SetError(-EXDEV);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1049 renameAllowed = 0;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1050 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1051 else if(obj && obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1052 {
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1053 // It is a directory, check that it is not being renamed to
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1054 // being its own decendent.
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1055 // Do this by tracing from the new directory back to the root, checking for obj
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1056
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1057 yaffs_Object *xx = newdir;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1058
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1059 while( renameAllowed && xx)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1060 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1061 if(xx == obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1062 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1063 renameAllowed = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1064 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1065 xx = xx->parent;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1066 }
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1067 if(!renameAllowed) yaffsfs_SetError(-EACCES);
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1068 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1069
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1070 if(renameAllowed)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1071 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1072 result = yaffs_RenameObject(olddir,oldname,newdir,newname);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1073 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1074
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1075 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1076
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1077 return (result == YAFFS_FAIL) ? -1 : 0;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1078 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1079
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1080
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1081 static int yaffsfs_DoStat(yaffs_Object *obj,struct yaffs_stat *buf)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1082 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1083 int retVal = -1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1084
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1085 if(obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1086 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1087 obj = yaffs_GetEquivalentObject(obj);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1088 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1089
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1090 if(obj && buf)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1091 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1092 buf->st_dev = (int)obj->myDev->genericDevice;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1093 buf->st_ino = obj->objectId;
23
12ec56e7ccfa Some tinkering on test harness and st_xxx to yst_xxx changes
charles
parents: 19
diff changeset
1094 buf->st_mode = obj->yst_mode & ~S_IFMT; // clear out file type bits
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1095
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1096 if(obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1097 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1098 buf->st_mode |= S_IFDIR;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1099 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1100 else if(obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1101 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1102 buf->st_mode |= S_IFLNK;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1103 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1104 else if(obj->variantType == YAFFS_OBJECT_TYPE_FILE)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1105 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1106 buf->st_mode |= S_IFREG;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1107 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1108
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1109 buf->st_nlink = yaffs_GetObjectLinkCount(obj);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1110 buf->st_uid = 0;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1111 buf->st_gid = 0;;
23
12ec56e7ccfa Some tinkering on test harness and st_xxx to yst_xxx changes
charles
parents: 19
diff changeset
1112 buf->st_rdev = obj->yst_rdev;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1113 buf->st_size = yaffs_GetObjectFileLength(obj);
152
3bc7020d669c Add large NAND support and improve retirement handling
charles
parents: 131
diff changeset
1114 buf->st_blksize = obj->myDev->nDataBytesPerChunk;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1115 buf->st_blocks = (buf->st_size + buf->st_blksize -1)/buf->st_blksize;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1116 #if CONFIG_YAFFS_WINCE
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1117 buf->yst_wince_atime[0] = obj->win_atime[0];
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1118 buf->yst_wince_atime[1] = obj->win_atime[1];
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1119 buf->yst_wince_ctime[0] = obj->win_ctime[0];
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1120 buf->yst_wince_ctime[1] = obj->win_ctime[1];
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1121 buf->yst_wince_mtime[0] = obj->win_mtime[0];
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1122 buf->yst_wince_mtime[1] = obj->win_mtime[1];
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1123 #else
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1124 buf->yst_atime = obj->yst_atime;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1125 buf->yst_ctime = obj->yst_ctime;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1126 buf->yst_mtime = obj->yst_mtime;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1127 #endif
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1128 retVal = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1129 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1130 return retVal;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1131 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1132
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1133 static int yaffsfs_DoStatOrLStat(const YCHAR *path, struct yaffs_stat *buf,int doLStat)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1134 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1135 yaffs_Object *obj;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1136
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1137 int retVal = -1;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1138
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1139 yaffsfs_Lock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1140 obj = yaffsfs_FindObject(NULL,path,0);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1141
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1142 if(!doLStat && obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1143 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1144 obj = yaffsfs_FollowLink(obj,0);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1145 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1146
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1147 if(obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1148 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1149 retVal = yaffsfs_DoStat(obj,buf);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1150 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1151 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1152 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1153 // todo error not found
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1154 yaffsfs_SetError(-ENOENT);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1155 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1156
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1157 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1158
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1159 return retVal;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1160
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1161 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1162
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1163 int yaffs_stat(const YCHAR *path, struct yaffs_stat *buf)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1164 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1165 return yaffsfs_DoStatOrLStat(path,buf,0);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1166 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1167
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1168 int yaffs_lstat(const YCHAR *path, struct yaffs_stat *buf)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1169 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1170 return yaffsfs_DoStatOrLStat(path,buf,1);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1171 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1172
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1173 int yaffs_fstat(int fd, struct yaffs_stat *buf)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1174 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1175 yaffs_Object *obj;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1176
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1177 int retVal = -1;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1178
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1179 yaffsfs_Lock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1180 obj = yaffsfs_GetHandleObject(fd);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1181
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1182 if(obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1183 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1184 retVal = yaffsfs_DoStat(obj,buf);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1185 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1186 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1187 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1188 // bad handle
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1189 yaffsfs_SetError(-EBADF);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1190 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1191
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1192 yaffsfs_Unlock();
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1193
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1194 return retVal;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1195 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1196
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1197 #ifdef CONFIG_YAFFS_WINCE
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1198 int yaffs_get_wince_times(int fd, unsigned *wctime, unsigned *watime, unsigned *wmtime)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1199 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1200 yaffs_Object *obj;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1201
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1202 int retVal = -1;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1203
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1204 yaffsfs_Lock();
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1205 obj = yaffsfs_GetHandleObject(fd);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1206
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1207 if(obj)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1208 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1209
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1210 if(wctime){
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1211 wctime[0] = obj->win_ctime[0];
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1212 wctime[1] = obj->win_ctime[1];
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1213 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1214 if(watime){
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1215 watime[0] = obj->win_atime[0];
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1216 watime[1] = obj->win_atime[1];
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1217 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1218 if(wmtime){
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1219 wmtime[0] = obj->win_mtime[0];
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1220 wmtime[1] = obj->win_mtime[1];
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1221 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1222
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1223
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1224 retVal = 0;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1225 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1226 else
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1227 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1228 // bad handle
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1229 yaffsfs_SetError(-EBADF);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1230 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1231
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1232 yaffsfs_Unlock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1233
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1234 return retVal;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1235 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1236
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1237
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1238 int yaffs_set_wince_times(int fd,
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1239 const unsigned *wctime,
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1240 const unsigned *watime,
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1241 const unsigned *wmtime)
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1242 {
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1243 yaffs_Object *obj;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1244 int result;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1245 int retVal = -1;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1246
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1247 yaffsfs_Lock();
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1248 obj = yaffsfs_GetHandleObject(fd);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1249
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1250 if(obj)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1251 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1252
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1253 if(wctime){
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1254 obj->win_ctime[0] = wctime[0];
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1255 obj->win_ctime[1] = wctime[1];
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1256 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1257 if(watime){
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1258 obj->win_atime[0] = watime[0];
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1259 obj->win_atime[1] = watime[1];
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1260 }
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1261 if(wmtime){
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1262 obj->win_mtime[0] = wmtime[0];
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1263 obj->win_mtime[1] = wmtime[1];
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1264 }
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1265
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1266 obj->dirty = 1;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1267 result = yaffs_FlushFile(obj,0);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1268 retVal = 0;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1269 }
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1270 else
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1271 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1272 // bad handle
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1273 yaffsfs_SetError(-EBADF);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1274 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1275
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1276 yaffsfs_Unlock();
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1277
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1278 return retVal;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1279 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1280
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1281 #endif
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1282
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1283
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1284 static int yaffsfs_DoChMod(yaffs_Object *obj,mode_t mode)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1285 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1286 int result;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1287
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1288 if(obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1289 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1290 obj = yaffs_GetEquivalentObject(obj);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1291 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1292
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1293 if(obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1294 {
23
12ec56e7ccfa Some tinkering on test harness and st_xxx to yst_xxx changes
charles
parents: 19
diff changeset
1295 obj->yst_mode = mode;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1296 obj->dirty = 1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1297 result = yaffs_FlushFile(obj,0);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1298 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1299
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1300 return result == YAFFS_OK ? 0 : -1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1301 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1302
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1303
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1304 int yaffs_access(const YCHAR *path, int amode)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1305 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1306 yaffs_Object *obj;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1307
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1308 int retval = 0;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1309
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1310 yaffsfs_Lock();
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1311 obj = yaffsfs_FindObject(NULL,path,0);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1312
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1313 if(obj)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1314 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1315 int access_ok = 1;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1316
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1317 if((amode & R_OK) && !(obj->yst_mode & S_IREAD))
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1318 access_ok = 0;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1319 if((amode & W_OK) && !(obj->yst_mode & S_IWRITE))
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1320 access_ok = 0;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1321 if((amode & X_OK) && !(obj->yst_mode & S_IEXEC))
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1322 access_ok = 0;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1323
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1324 if(!access_ok) {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1325 yaffsfs_SetError(-EACCES);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1326 retval = -1;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1327 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1328 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1329 else
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1330 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1331 // todo error not found
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1332 yaffsfs_SetError(-ENOENT);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1333 retval = -1;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1334 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1335
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1336 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1337
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1338 return retval;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1339
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1340 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1341
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1342
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1343 int yaffs_chmod(const YCHAR *path, mode_t mode)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1344 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1345 yaffs_Object *obj;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1346
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1347 int retVal = -1;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1348
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1349 yaffsfs_Lock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1350 obj = yaffsfs_FindObject(NULL,path,0);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1351
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1352 if(obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1353 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1354 retVal = yaffsfs_DoChMod(obj,mode);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1355 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1356 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1357 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1358 // todo error not found
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1359 yaffsfs_SetError(-ENOENT);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1360 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1361
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1362 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1363
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1364 return retVal;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1365
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1366 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1367
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1368
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1369 int yaffs_fchmod(int fd, mode_t mode)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1370 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1371 yaffs_Object *obj;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1372
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1373 int retVal = -1;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1374
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1375 yaffsfs_Lock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1376 obj = yaffsfs_GetHandleObject(fd);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1377
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1378 if(obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1379 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1380 retVal = yaffsfs_DoChMod(obj,mode);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1381 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1382 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1383 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1384 // bad handle
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1385 yaffsfs_SetError(-EBADF);
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1386 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1387
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1388 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1389
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1390 return retVal;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1391 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1392
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1393
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1394 int yaffs_mkdir(const YCHAR *path, mode_t mode)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1395 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1396 yaffs_Object *parent = NULL;
126
41fbe6d74849 Fix possible null ptr dereference
charles
parents: 122
diff changeset
1397 yaffs_Object *dir = NULL;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1398 YCHAR *name;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1399 int retVal= -1;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1400
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1401 yaffsfs_Lock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1402 parent = yaffsfs_FindDirectory(NULL,path,&name,0);
126
41fbe6d74849 Fix possible null ptr dereference
charles
parents: 122
diff changeset
1403 if(parent)
41fbe6d74849 Fix possible null ptr dereference
charles
parents: 122
diff changeset
1404 dir = yaffs_MknodDirectory(parent,name,mode,0,0);
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1405 if(dir)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1406 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1407 retVal = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1408 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1409 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1410 {
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1411 if(!parent){
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1412 yaffsfs_SetError(-ENOENT); // missing path
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1413 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1414 else if (yaffs_FindObjectByName(parent,name)){
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1415 yaffsfs_SetError(-EEXIST); // the name already exists
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1416 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1417 else
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1418 yaffsfs_SetError(-ENOSPC); // just assume no space
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1419 retVal = -1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1420 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1421
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1422 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1423
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1424 return retVal;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1425 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1426
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1427 int yaffs_mount(const YCHAR *path)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1428 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1429 int retVal=-1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1430 int result=YAFFS_FAIL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1431 yaffs_Device *dev=NULL;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1432 YCHAR *dummy;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1433
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1434 T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: Mounting %s" TENDSTR),path));
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1435
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1436 yaffsfs_Lock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1437 dev = yaffsfs_FindDevice(path,&dummy);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1438 if(dev)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1439 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1440 if(!dev->isMounted)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1441 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1442 result = yaffs_GutsInitialise(dev);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1443 if(result == YAFFS_FAIL)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1444 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1445 // todo error - mount failed
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1446 yaffsfs_SetError(-ENOMEM);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1447 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1448 retVal = result ? 0 : -1;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1449
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1450 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1451 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1452 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1453 //todo error - already mounted.
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1454 yaffsfs_SetError(-EBUSY);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1455 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1456 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1457 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1458 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1459 // todo error - no device
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1460 yaffsfs_SetError(-ENODEV);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1461 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1462 yaffsfs_Unlock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1463 return retVal;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1464
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1465 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1466
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1467 int yaffs_sync(const YCHAR *path)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1468 {
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1469 int retVal=-1;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1470 yaffs_Device *dev=NULL;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1471 YCHAR *dummy;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1472
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1473 yaffsfs_Lock();
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1474 dev = yaffsfs_FindDevice(path,&dummy);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1475 if(dev)
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1476 {
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1477 if(dev->isMounted)
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1478 {
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1479
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1480 yaffs_FlushEntireDeviceCache(dev);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1481 yaffs_CheckpointSave(dev);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1482
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1483
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1484 }
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1485 else
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1486 {
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1487 //todo error - not mounted.
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1488 yaffsfs_SetError(-EINVAL);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1489
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1490 }
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1491 }
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1492 else
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1493 {
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1494 // todo error - no device
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1495 yaffsfs_SetError(-ENODEV);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1496 }
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1497 yaffsfs_Unlock();
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1498 return retVal;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1499 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1500
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1501
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1502 int yaffs_unmount(const YCHAR *path)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1503 {
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1504 int retVal=-1;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1505 yaffs_Device *dev=NULL;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1506 YCHAR *dummy;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1507
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1508 yaffsfs_Lock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1509 dev = yaffsfs_FindDevice(path,&dummy);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1510 if(dev)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1511 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1512 if(dev->isMounted)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1513 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1514 int i;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1515 int inUse;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1516
127
89a8d2461783 Flush entire cache at umount
charles
parents: 126
diff changeset
1517 yaffs_FlushEntireDeviceCache(dev);
131
9371b1f460a4 Checkpointing changes
charles
parents: 129
diff changeset
1518 yaffs_CheckpointSave(dev);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1519
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1520 for(i = inUse = 0; i < YAFFSFS_N_HANDLES && !inUse; i++)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1521 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1522 if(yaffsfs_handle[i].inUse && yaffsfs_handle[i].obj->myDev == dev)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1523 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1524 inUse = 1; // the device is in use, can't unmount
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1525 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1526 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1527
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1528 if(!inUse)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1529 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1530 yaffs_Deinitialise(dev);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1531
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1532 retVal = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1533 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1534 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1535 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1536 // todo error can't unmount as files are open
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1537 yaffsfs_SetError(-EBUSY);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1538 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1539
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1540 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1541 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1542 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1543 //todo error - not mounted.
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1544 yaffsfs_SetError(-EINVAL);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1545
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1546 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1547 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1548 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1549 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1550 // todo error - no device
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1551 yaffsfs_SetError(-ENODEV);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1552 }
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1553 yaffsfs_Unlock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1554 return retVal;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1555
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1556 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1557
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1558 loff_t yaffs_freespace(const YCHAR *path)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1559 {
152
3bc7020d669c Add large NAND support and improve retirement handling
charles
parents: 131
diff changeset
1560 loff_t retVal=-1;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1561 yaffs_Device *dev=NULL;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1562 YCHAR *dummy;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1563
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1564 yaffsfs_Lock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1565 dev = yaffsfs_FindDevice(path,&dummy);
12
0ea63ca43a42 Fix problem when accessing unmounted fs
charles
parents: 6
diff changeset
1566 if(dev && dev->isMounted)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1567 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1568 retVal = yaffs_GetNumberOfFreeChunks(dev);
152
3bc7020d669c Add large NAND support and improve retirement handling
charles
parents: 131
diff changeset
1569 retVal *= dev->nDataBytesPerChunk;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1570
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1571 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1572 else
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1573 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1574 yaffsfs_SetError(-EINVAL);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1575 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1576
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1577 yaffsfs_Unlock();
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1578 return retVal;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1579 }
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1580
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1581 loff_t yaffs_totalspace(const YCHAR *path)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1582 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1583 loff_t retVal=-1;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1584 yaffs_Device *dev=NULL;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1585 YCHAR *dummy;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1586
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1587 yaffsfs_Lock();
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1588 dev = yaffsfs_FindDevice(path,&dummy);
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1589 if(dev && dev->isMounted)
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1590 {
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1591 retVal = (dev->endBlock - dev->startBlock + 1) - dev->nReservedBlocks;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1592 retVal *= dev->nChunksPerBlock;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1593 retVal *= dev->nDataBytesPerChunk;
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1594
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1595 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1596 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1597 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1598 yaffsfs_SetError(-EINVAL);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1599 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1600
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1601 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1602 return retVal;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1603 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1604
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1605
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1606
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1607 void yaffs_initialise(yaffsfs_DeviceConfiguration *cfgList)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1608 {
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1609
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1610 yaffsfs_DeviceConfiguration *cfg;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1611
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1612 yaffsfs_configurationList = cfgList;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1613
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1614 yaffsfs_InitHandles();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1615
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1616 cfg = yaffsfs_configurationList;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1617
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1618 while(cfg && cfg->prefix && cfg->dev)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1619 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1620 cfg->dev->isMounted = 0;
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1621 cfg->dev->removeObjectCallback = yaffsfs_RemoveObjectCallback;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1622 cfg++;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1623 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1624
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1625
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1626 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1627
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1628
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1629 //
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1630 // Directory search stuff.
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1631
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1632 //
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1633 // Directory search context
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1634 //
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1635 // NB this is an opaque structure.
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1636
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1637
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1638 typedef struct
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1639 {
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1640 __u32 magic;
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1641 yaffs_dirent de; /* directory entry being used by this dsc */
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1642 YCHAR name[NAME_MAX+1]; /* name of directory being searched */
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1643 yaffs_Object *dirObj; /* ptr to directory being searched */
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1644 yaffs_Object *nextReturn; /* obj to be returned by next readddir */
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1645 int offset;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1646 struct ylist_head others;
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1647 } yaffsfs_DirectorySearchContext;
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1648
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1649
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1650
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1651 static struct ylist_head search_contexts;
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1652
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1653
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1654 static void yaffsfs_SetDirRewound(yaffsfs_DirectorySearchContext *dsc)
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1655 {
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1656 if(dsc &&
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1657 dsc->dirObj &&
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1658 dsc->dirObj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY){
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1659
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1660 dsc->offset = 0;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1661
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1662 if( ylist_empty(&dsc->dirObj->variant.directoryVariant.children)){
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1663 dsc->nextReturn = NULL;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1664 } else {
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1665 dsc->nextReturn = ylist_entry(dsc->dirObj->variant.directoryVariant.children.next,
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1666 yaffs_Object,siblings);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1667 }
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1668 } else {
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1669 /* Hey someone isn't playing nice! */
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1670 }
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1671 }
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1672
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1673 static void yaffsfs_DirAdvance(yaffsfs_DirectorySearchContext *dsc)
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1674 {
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1675 if(dsc &&
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1676 dsc->dirObj &&
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1677 dsc->dirObj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY){
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1678
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1679 if( dsc->nextReturn == NULL ||
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1680 ylist_empty(&dsc->dirObj->variant.directoryVariant.children)){
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1681 dsc->nextReturn = NULL;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1682 } else {
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1683 struct ylist_head *next = dsc->nextReturn->siblings.next;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1684
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1685 if( next == &dsc->dirObj->variant.directoryVariant.children)
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1686 dsc->nextReturn = NULL; /* end of list */
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1687 else
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1688 dsc->nextReturn = ylist_entry(next,yaffs_Object,siblings);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1689 }
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1690 } else {
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1691 /* Hey someone isn't playing nice! */
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1692 }
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1693 }
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1694
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1695 static void yaffsfs_RemoveObjectCallback(yaffs_Object *obj)
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1696 {
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1697
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1698 struct ylist_head *i;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1699 yaffsfs_DirectorySearchContext *dsc;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1700
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1701 /* if search contexts not initilised then skip */
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1702 if(!search_contexts.next)
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1703 return;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1704
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1705 /* Iterate through the directory search contexts.
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1706 * If any are the one being removed, then advance the dsc to
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1707 * the next one to prevent a hanging ptr.
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1708 */
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1709 ylist_for_each(i, &search_contexts) {
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1710 if (i) {
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1711 dsc = ylist_entry(i, yaffsfs_DirectorySearchContext,others);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1712 if(dsc->nextReturn == obj)
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1713 yaffsfs_DirAdvance(dsc);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1714 }
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1715 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1716
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1717 }
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1718
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1719 yaffs_DIR *yaffs_opendir(const YCHAR *dirname)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1720 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1721 yaffs_DIR *dir = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1722 yaffs_Object *obj = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1723 yaffsfs_DirectorySearchContext *dsc = NULL;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1724
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1725 yaffsfs_Lock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1726
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1727 obj = yaffsfs_FindObject(NULL,dirname,0);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1728
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1729 if(obj && obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1730 {
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1731
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1732 dsc = YMALLOC(sizeof(yaffsfs_DirectorySearchContext));
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1733 dir = (yaffs_DIR *)dsc;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1734 if(dsc)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1735 {
94
c53efc2aec17 Improve YDI lookup and device prefic handling
charles
parents: 84
diff changeset
1736 memset(dsc,0,sizeof(yaffsfs_DirectorySearchContext));
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1737 dsc->magic = YAFFS_MAGIC;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1738 dsc->dirObj = obj;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1739 yaffs_strncpy(dsc->name,dirname,NAME_MAX);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1740 YINIT_LIST_HEAD(&dsc->others);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1741
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1742 if(!search_contexts.next)
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1743 YINIT_LIST_HEAD(&search_contexts);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1744
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1745 ylist_add(&dsc->others,&search_contexts);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1746 yaffsfs_SetDirRewound(dsc); }
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1747
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1748 }
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1749
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1750 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1751
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1752 return dir;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1753 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1754
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1755 struct yaffs_dirent *yaffs_readdir(yaffs_DIR *dirp)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1756 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1757 yaffsfs_DirectorySearchContext *dsc = (yaffsfs_DirectorySearchContext *)dirp;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1758 struct yaffs_dirent *retVal = NULL;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1759
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1760 yaffsfs_Lock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1761
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1762 if(dsc && dsc->magic == YAFFS_MAGIC){
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1763 yaffsfs_SetError(0);
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1764 if(dsc->nextReturn){
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1765 dsc->de.d_ino = yaffs_GetEquivalentObject(dsc->nextReturn)->objectId;
157
41dac3f9ad92 Add more test stuff
charles
parents: 152
diff changeset
1766 dsc->de.d_dont_use = (unsigned)dsc->nextReturn;
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1767 dsc->de.d_off = dsc->offset++;
157
41dac3f9ad92 Add more test stuff
charles
parents: 152
diff changeset
1768 yaffs_GetObjectName(dsc->nextReturn,dsc->de.d_name,NAME_MAX);
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1769 if(yaffs_strlen(dsc->de.d_name) == 0)
157
41dac3f9ad92 Add more test stuff
charles
parents: 152
diff changeset
1770 {
41dac3f9ad92 Add more test stuff
charles
parents: 152
diff changeset
1771 // this should not happen!
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1772 yaffs_strcpy(dsc->de.d_name,_Y("zz"));
157
41dac3f9ad92 Add more test stuff
charles
parents: 152
diff changeset
1773 }
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1774 dsc->de.d_reclen = sizeof(struct yaffs_dirent);
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1775 retVal = &dsc->de;
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1776 yaffsfs_DirAdvance(dsc);
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1777 } else
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1778 retVal = NULL;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1779 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1780 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1781 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1782 yaffsfs_SetError(-EBADF);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1783 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1784
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1785 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1786
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1787 return retVal;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1788
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1789 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1790
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1791
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1792 void yaffs_rewinddir(yaffs_DIR *dirp)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1793 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1794 yaffsfs_DirectorySearchContext *dsc = (yaffsfs_DirectorySearchContext *)dirp;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1795
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1796 yaffsfs_Lock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1797
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1798 yaffsfs_SetDirRewound(dsc);
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1799
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1800 yaffsfs_Unlock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1801 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1802
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1803
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1804 int yaffs_closedir(yaffs_DIR *dirp)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1805 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1806 yaffsfs_DirectorySearchContext *dsc = (yaffsfs_DirectorySearchContext *)dirp;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1807
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1808 yaffsfs_Lock();
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1809 dsc->magic = 0;
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1810 ylist_del(&dsc->others); /* unhook from list */
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1811 YFREE(dsc);
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1812 yaffsfs_Unlock();
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1813 return 0;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1814 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1815
84
9af8bbd3c1da Add support for faster yaffs direct look-ups.
charles
parents: 23
diff changeset
1816 // end of directory stuff
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1817
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1818
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1819 int yaffs_symlink(const YCHAR *oldpath, const YCHAR *newpath)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1820 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1821 yaffs_Object *parent = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1822 yaffs_Object *obj;
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1823 YCHAR *name;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1824 int retVal= -1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1825 int mode = 0; // ignore for now
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1826
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1827 yaffsfs_Lock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1828 parent = yaffsfs_FindDirectory(NULL,newpath,&name,0);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1829 obj = yaffs_MknodSymLink(parent,name,mode,0,0,oldpath);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1830 if(obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1831 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1832 retVal = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1833 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1834 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1835 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1836 yaffsfs_SetError(-ENOSPC); // just assume no space for now
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1837 retVal = -1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1838 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1839
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1840 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1841
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1842 return retVal;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1843
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1844 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1845
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1846 int yaffs_readlink(const YCHAR *path, YCHAR *buf, int bufsiz)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1847 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1848 yaffs_Object *obj = NULL;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1849 int retVal;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1850
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1851
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1852 yaffsfs_Lock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1853
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1854 obj = yaffsfs_FindObject(NULL,path,0);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1855
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1856 if(!obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1857 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1858 yaffsfs_SetError(-ENOENT);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1859 retVal = -1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1860 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1861 else if(obj->variantType != YAFFS_OBJECT_TYPE_SYMLINK)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1862 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1863 yaffsfs_SetError(-EINVAL);
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1864 retVal = -1;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1865 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1866 else
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1867 {
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1868 YCHAR *alias = obj->variant.symLinkVariant.alias;
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1869 memset(buf,0,bufsiz);
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1870 yaffs_strncpy(buf,alias,bufsiz - 1);
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1871 retVal = 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1872 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1873 yaffsfs_Unlock();
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1874 return retVal;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1875 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1876
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1877 int yaffs_link(const YCHAR *oldpath, const YCHAR *newpath)
122
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1878 {
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1879 // Creates a link called newpath to existing oldpath
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1880 yaffs_Object *obj = NULL;
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1881 yaffs_Object *target = NULL;
129
162e3c157c62 Fix trivial compiler warning
colin
parents: 127
diff changeset
1882 int retVal = 0;
122
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1883
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1884
122
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1885 yaffsfs_Lock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1886
122
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1887 obj = yaffsfs_FindObject(NULL,oldpath,0);
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1888 target = yaffsfs_FindObject(NULL,newpath,0);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1889
122
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1890 if(!obj)
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1891 {
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1892 yaffsfs_SetError(-ENOENT);
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1893 retVal = -1;
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1894 }
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1895 else if(target)
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1896 {
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1897 yaffsfs_SetError(-EEXIST);
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1898 retVal = -1;
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1899 }
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1900 else
122
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1901 {
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1902 yaffs_Object *newdir = NULL;
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1903 yaffs_Object *link = NULL;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1904
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1905 YCHAR *newname;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1906
122
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1907 newdir = yaffsfs_FindDirectory(NULL,newpath,&newname,0);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1908
122
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1909 if(!newdir)
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1910 {
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1911 yaffsfs_SetError(-ENOTDIR);
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1912 retVal = -1;
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1913 }
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1914 else if(newdir->myDev != obj->myDev)
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1915 {
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1916 yaffsfs_SetError(-EXDEV);
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1917 retVal = -1;
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1918 }
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1919 if(newdir && yaffs_strlen(newname) > 0)
122
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1920 {
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1921 link = yaffs_Link(newdir,newname,obj);
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1922 if(link)
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1923 retVal = 0;
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1924 else
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1925 {
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1926 yaffsfs_SetError(-ENOSPC);
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1927 retVal = -1;
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1928 }
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1929
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1930 }
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1931 }
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1932 yaffsfs_Unlock();
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1933
122
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1934 return retVal;
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1935 }
5dbd6682bfb2 Add hardlinks to yaffs direct
charles
parents: 94
diff changeset
1936
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1937 int yaffs_mknod(const YCHAR *pathname, mode_t mode, dev_t dev);
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1938
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1939 int yaffs_DumpDevStruct(const YCHAR *path)
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1940 {
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1941 #if 0
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1942 YCHAR *rest;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1943
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1944 yaffs_Object *obj = yaffsfs_FindRoot(path,&rest);
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1945
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1946 if(obj)
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1947 {
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1948 yaffs_Device *dev = obj->myDev;
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1949
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1950 printf("\n"
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1951 "nPageWrites.......... %d\n"
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1952 "nPageReads........... %d\n"
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1953 "nBlockErasures....... %d\n"
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1954 "nGCCopies............ %d\n"
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1955 "garbageCollections... %d\n"
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1956 "passiveGarbageColl'ns %d\n"
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1957 "\n",
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1958 dev->nPageWrites,
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1959 dev->nPageReads,
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1960 dev->nBlockErasures,
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1961 dev->nGCCopies,
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1962 dev->garbageCollections,
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1963 dev->passiveGarbageCollections
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1964 );
215
b08276bd7b2d Clean up some yaffs1 mode issues.
charles
parents: 211
diff changeset
1965
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1966 }
211
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1967
fad21fd1971d Check in inband tags, some extra yaffs direct functions and some other changes
charles
parents: 185
diff changeset
1968 #endif
1
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1969 return 0;
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1970 }
1a7b08737ec4 *** empty log message ***
charles
parents:
diff changeset
1971