| Index: emcore/trunk/file.c |
| — | — | @@ -60,7 +60,7 @@ |
| 61 | 61 | return open(pathname, O_WRONLY|O_CREAT|O_TRUNC, 0666);
|
| 62 | 62 | }
|
| 63 | 63 |
|
| 64 | | -static int open_internal(const char* pathname, int flags, bool use_cache)
|
| | 64 | +static int open_internal(const char* pathname, int flags, bool ignoredir)
|
| 65 | 65 | {
|
| 66 | 66 | DIR* dir;
|
| 67 | 67 | struct dirent* entry;
|
| — | — | @@ -75,7 +75,7 @@ |
| 76 | 76 | DEBUGF("'%s' is not an absolute path.", pathname);
|
| 77 | 77 | DEBUGF("Only absolute pathnames supported at the moment");
|
| 78 | 78 | errno = EINVAL;
|
| 79 | | - return -1;
|
| | 79 | + return 0;
|
| 80 | 80 | }
|
| 81 | 81 |
|
| 82 | 82 | file = (struct filedesc*)memalign(0x10, sizeof(struct filedesc));
|
| — | — | @@ -82,7 +82,7 @@ |
| 83 | 83 | if (!file)
|
| 84 | 84 | {
|
| 85 | 85 | errno = EMFILE;
|
| 86 | | - return -2;
|
| | 86 | + return 0;
|
| 87 | 87 | }
|
| 88 | 88 | reownalloc(file, KERNEL_OWNER(KERNEL_OWNER_FILE_HANDLE));
|
| 89 | 89 | memset(file, 0, sizeof(struct filedesc));
|
| — | — | @@ -112,7 +112,7 @@ |
| 113 | 113 | DEBUGF("Failed opening dir");
|
| 114 | 114 | errno = EIO;
|
| 115 | 115 | free(file);
|
| 116 | | - return -4;
|
| | 116 | + return 0;
|
| 117 | 117 | }
|
| 118 | 118 |
|
| 119 | 119 | if(name[0] == 0) {
|
| — | — | @@ -120,7 +120,7 @@ |
| 121 | 121 | errno = EINVAL;
|
| 122 | 122 | free(file);
|
| 123 | 123 | closedir(dir);
|
| 124 | | - return -5;
|
| | 124 | + return 0;
|
| 125 | 125 | }
|
| 126 | 126 |
|
| 127 | 127 | /* scan dir for name */
|
| — | — | @@ -137,34 +137,34 @@ |
| 138 | 138 | }
|
| 139 | 139 |
|
| 140 | 140 | if ( !entry ) {
|
| 141 | | - DEBUGF("Didn't find file %s",name);
|
| 142 | 141 | if ( file->write && (flags & O_CREAT) ) {
|
| 143 | 142 | rc = fat_create_file(name,
|
| 144 | 143 | &(file->fatfile),
|
| 145 | 144 | &(dir->fatdir));
|
| 146 | 145 | if (rc < 0) {
|
| 147 | | - DEBUGF("Couldn't create %s in %s",name,pathnamecopy);
|
| | 146 | + DEBUGF("Couldn't create %s", pathnamecopy);
|
| 148 | 147 | errno = EIO;
|
| 149 | 148 | free(file);
|
| 150 | 149 | closedir(dir);
|
| 151 | | - return rc * 10 - 6;
|
| | 150 | + return 0;
|
| 152 | 151 | }
|
| | 152 | + DEBUGF("File %s doesn't exist, creating it", pathnamecopy);
|
| 153 | 153 | file->size = 0;
|
| 154 | 154 | file->attr = 0;
|
| 155 | 155 | }
|
| 156 | 156 | else {
|
| 157 | | - DEBUGF("Couldn't find %s in %s",name,pathnamecopy);
|
| | 157 | + DEBUGF("Couldn't find %s", pathnamecopy);
|
| 158 | 158 | errno = ENOENT;
|
| 159 | 159 | free(file);
|
| 160 | 160 | closedir(dir);
|
| 161 | | - return -7;
|
| | 161 | + return 0;
|
| 162 | 162 | }
|
| 163 | 163 | } else {
|
| 164 | | - if(file->attr & FAT_ATTR_DIRECTORY) {
|
| | 164 | + if (file->attr & FAT_ATTR_DIRECTORY && !ignoredir) {
|
| 165 | 165 | errno = EISDIR;
|
| 166 | 166 | free(file);
|
| 167 | 167 | closedir(dir);
|
| 168 | | - return -8;
|
| | 168 | + return 0;
|
| 169 | 169 | }
|
| 170 | 170 | }
|
| 171 | 171 | closedir(dir);
|
| — | — | @@ -177,7 +177,8 @@ |
| 178 | 178 | if (rc < 0 )
|
| 179 | 179 | {
|
| 180 | 180 | free(file);
|
| 181 | | - return rc * 10 - 9;
|
| | 181 | + errno = EIO;
|
| | 182 | + return 0;
|
| 182 | 183 | }
|
| 183 | 184 | }
|
| 184 | 185 |
|
| — | — | @@ -191,8 +192,7 @@ |
| 192 | 193 |
|
| 193 | 194 | int file_open(const char* pathname, int flags)
|
| 194 | 195 | {
|
| 195 | | - /* By default, use the dircache if available. */
|
| 196 | | - return open_internal(pathname, flags, true);
|
| | 196 | + return open_internal(pathname, flags, false);
|
| 197 | 197 | }
|
| 198 | 198 |
|
| 199 | 199 | void reown_file(int fd, struct scheduler_thread* owner)
|
| — | — | @@ -299,10 +299,8 @@ |
| 300 | 300 | int remove(const char* name)
|
| 301 | 301 | {
|
| 302 | 302 | int rc;
|
| 303 | | - /* Can't use dircache now, because we need to access the fat structures. */
|
| 304 | 303 | int fd = open_internal(name, O_WRONLY, false);
|
| 305 | | - if ( fd < 0 )
|
| 306 | | - return fd * 10 - 1;
|
| | 304 | + if (!fd) return - 1;
|
| 307 | 305 |
|
| 308 | 306 | struct filedesc* file = (struct filedesc*)fd;
|
| 309 | 307 | rc = fat_remove(&(file->fatfile));
|
| — | — | @@ -332,18 +330,17 @@ |
| 333 | 331 |
|
| 334 | 332 | /* verify new path does not already exist */
|
| 335 | 333 | /* If it is a directory, errno == EISDIR if the name exists */
|
| 336 | | - fd = open(newpath, O_RDONLY);
|
| 337 | | - if ( fd >= 0 || errno == EISDIR) {
|
| | 334 | + fd = open_internal(newpath, O_RDONLY, true);
|
| | 335 | + if (fd) {
|
| 338 | 336 | close(fd);
|
| 339 | 337 | errno = EBUSY;
|
| 340 | 338 | return -1;
|
| 341 | 339 | }
|
| 342 | | - close(fd);
|
| 343 | 340 |
|
| 344 | | - fd = open_internal(path, O_RDONLY, false);
|
| 345 | | - if ( fd < 0 ) {
|
| | 341 | + fd = open_internal(path, O_RDONLY, true);
|
| | 342 | + if (!fd) {
|
| 346 | 343 | errno = EIO;
|
| 347 | | - return fd * 10 - 2;
|
| | 344 | + return -2;
|
| 348 | 345 | }
|
| 349 | 346 |
|
| 350 | 347 | /* extract new file name */
|