summaryrefslogtreecommitdiff
path: root/firmware/common/dir_uncached.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/common/dir_uncached.c')
-rw-r--r--firmware/common/dir_uncached.c25
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}