diff options
Diffstat (limited to 'firmware/common')
-rw-r--r-- | firmware/common/dir.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/firmware/common/dir.c b/firmware/common/dir.c index 61c3ccbf90..98adc5c730 100644 --- a/firmware/common/dir.c +++ b/firmware/common/dir.c | |||
@@ -114,3 +114,55 @@ struct dirent* readdir(DIR* dir) | |||
114 | 114 | ||
115 | return theent; | 115 | return theent; |
116 | } | 116 | } |
117 | |||
118 | int mkdir(char *name) | ||
119 | { | ||
120 | DIR *dir; | ||
121 | char namecopy[MAX_PATH]; | ||
122 | char* end; | ||
123 | char *basename; | ||
124 | char *parent; | ||
125 | struct dirent *entry; | ||
126 | struct fat_dir newdir; | ||
127 | int rc; | ||
128 | |||
129 | if ( name[0] != '/' ) { | ||
130 | DEBUGF("Only absolute paths supported right now\n"); | ||
131 | return -1; | ||
132 | } | ||
133 | |||
134 | strncpy(namecopy,name,sizeof(namecopy)); | ||
135 | namecopy[sizeof(namecopy)-1] = 0; | ||
136 | |||
137 | /* Split the base name and the path */ | ||
138 | end = strrchr(namecopy, '/'); | ||
139 | *end = 0; | ||
140 | basename = end+1; | ||
141 | |||
142 | if(namecopy == end) /* Root dir? */ | ||
143 | parent = "/"; | ||
144 | else | ||
145 | parent = namecopy; | ||
146 | |||
147 | DEBUGF("mkdir: parent: %s, name: %s\n", parent, basename); | ||
148 | |||
149 | dir = opendir(parent); | ||
150 | |||
151 | if(!dir) { | ||
152 | DEBUGF("mkdir: can't open parent dir\n"); | ||
153 | return -2; | ||
154 | } | ||
155 | |||
156 | /* Now check if the name already exists */ | ||
157 | while ((entry = readdir(dir))) { | ||
158 | if ( !strcasecmp(basename, entry->d_name) ) { | ||
159 | DEBUGF("mkdir error: file exists\n"); | ||
160 | errno = EEXIST; | ||
161 | return - 3; | ||
162 | } | ||
163 | } | ||
164 | |||
165 | rc = fat_create_dir(basename, &newdir, &(dir->fatdir)); | ||
166 | |||
167 | return rc; | ||
168 | } | ||