diff options
Diffstat (limited to 'firmware/common')
-rw-r--r-- | firmware/common/dir_uncached.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/firmware/common/dir_uncached.c b/firmware/common/dir_uncached.c index 2ce23e8b8e..e4c4397fe2 100644 --- a/firmware/common/dir_uncached.c +++ b/firmware/common/dir_uncached.c | |||
@@ -204,13 +204,28 @@ int mkdir_uncached(const char *name) | |||
204 | char *basename; | 204 | char *basename; |
205 | char *parent; | 205 | char *parent; |
206 | struct dirent_uncached *entry; | 206 | struct dirent_uncached *entry; |
207 | struct fat_dir newdir; | 207 | int dd; |
208 | DIR_UNCACHED* pdir = opendirs; | ||
209 | struct fat_dir *newdir; | ||
208 | int rc; | 210 | int rc; |
209 | 211 | ||
210 | if ( name[0] != '/' ) { | 212 | if ( name[0] != '/' ) { |
211 | DEBUGF("mkdir: Only absolute paths supported right now\n"); | 213 | DEBUGF("mkdir: Only absolute paths supported right now\n"); |
212 | return -1; | 214 | return -1; |
213 | } | 215 | } |
216 | /* find a free dir descriptor */ | ||
217 | for ( dd=0; dd<MAX_OPEN_DIRS; dd++, pdir++) | ||
218 | if ( !pdir->busy ) | ||
219 | break; | ||
220 | |||
221 | if ( dd == MAX_OPEN_DIRS ) { | ||
222 | DEBUGF("Too many dirs open\n"); | ||
223 | errno = EMFILE; | ||
224 | return -5; | ||
225 | } | ||
226 | |||
227 | pdir->busy = true; | ||
228 | newdir = &pdir->fatdir; | ||
214 | 229 | ||
215 | strlcpy(namecopy, name, sizeof(namecopy)); | 230 | strlcpy(namecopy, name, sizeof(namecopy)); |
216 | 231 | ||
@@ -230,11 +245,13 @@ int mkdir_uncached(const char *name) | |||
230 | 245 | ||
231 | if(!dir) { | 246 | if(!dir) { |
232 | DEBUGF("mkdir: can't open parent dir\n"); | 247 | DEBUGF("mkdir: can't open parent dir\n"); |
248 | pdir->busy = false; | ||
233 | return -2; | 249 | return -2; |
234 | } | 250 | } |
235 | 251 | ||
236 | if(basename[0] == 0) { | 252 | if(basename[0] == 0) { |
237 | DEBUGF("mkdir: Empty dir name\n"); | 253 | DEBUGF("mkdir: Empty dir name\n"); |
254 | pdir->busy = false; | ||
238 | errno = EINVAL; | 255 | errno = EINVAL; |
239 | return -3; | 256 | return -3; |
240 | } | 257 | } |
@@ -245,14 +262,16 @@ int mkdir_uncached(const char *name) | |||
245 | DEBUGF("mkdir error: file exists\n"); | 262 | DEBUGF("mkdir error: file exists\n"); |
246 | errno = EEXIST; | 263 | errno = EEXIST; |
247 | closedir_uncached(dir); | 264 | closedir_uncached(dir); |
265 | pdir->busy = false; | ||
248 | return - 4; | 266 | return - 4; |
249 | } | 267 | } |
250 | } | 268 | } |
251 | 269 | ||
252 | memset(&newdir, 0, sizeof(struct fat_dir)); | 270 | memset(newdir, 0, sizeof(struct fat_dir)); |
253 | 271 | ||
254 | rc = fat_create_dir(basename, &newdir, &(dir->fatdir)); | 272 | rc = fat_create_dir(basename, newdir, &(dir->fatdir)); |
255 | closedir_uncached(dir); | 273 | closedir_uncached(dir); |
274 | pdir->busy = false; | ||
256 | 275 | ||
257 | return rc; | 276 | return rc; |
258 | } | 277 | } |