| Index: emcore/trunk/tools/emcorefs/emcore.h | 
| — | — | @@ -119,6 +119,8 @@ | 
| 120 | 120 | int emcore_dir_read(struct emcore_dir_entry* entry, const uint32_t handle); | 
| 121 | 121 | int emcore_dir_close(const uint32_t handle); | 
| 122 | 122 | int emcore_dir_close_all(uint32_t* count); | 
|  | 123 | +int emcore_dir_create(const char* name); | 
|  | 124 | +int emcore_dir_remove(const char* name); | 
| 123 | 125 | int emcore_errno(uint32_t* emcore_errno_value); | 
| 124 | 126 | int emcore_malloc(uint32_t* ptr, const uint32_t size); | 
| 125 | 127 | int emcore_memalign(uint32_t* ptr, const uint32_t align, const uint32_t size); | 
| Index: emcore/trunk/tools/emcorefs/fuse.c | 
| — | — | @@ -29,6 +29,23 @@ | 
| 30 | 30 | #include "emcore.h" | 
| 31 | 31 |  | 
| 32 | 32 |  | 
|  | 33 | +int emcorefs_init(void) | 
|  | 34 | +{ | 
|  | 35 | +    int res; | 
|  | 36 | +    uint32_t count; | 
|  | 37 | + | 
|  | 38 | +    res = emcore_file_close_all(&count); | 
|  | 39 | + | 
|  | 40 | +    if (EMCORE_SUCCESS != res) | 
|  | 41 | +    { | 
|  | 42 | +        return res; | 
|  | 43 | +    } | 
|  | 44 | + | 
|  | 45 | +    res = emcore_dir_close_all(&count); | 
|  | 46 | + | 
|  | 47 | +    return res; | 
|  | 48 | +} | 
|  | 49 | + | 
| 33 | 50 | int emcorefs_getattr(const char* path, struct stat* stbuf) | 
| 34 | 51 | { | 
| 35 | 52 | int res = 0; | 
| — | — | @@ -38,6 +55,12 @@ | 
| 39 | 56 |  | 
| 40 | 57 | memset(stbuf, 0, sizeof(*stbuf)); | 
| 41 | 58 |  | 
|  | 59 | +#ifdef DEBUG2 | 
|  | 60 | +    if (0 == strcmp(path, "/__cache_dump")) | 
|  | 61 | +    { | 
|  | 62 | +        cache_dump(); | 
|  | 63 | +    } | 
|  | 64 | +#endif | 
| 42 | 65 | entry = cache_get(path); | 
| 43 | 66 |  | 
| 44 | 67 | if (NULL == entry) | 
| — | — | @@ -200,7 +223,11 @@ | 
| 201 | 224 | { | 
| 202 | 225 | int res; | 
| 203 | 226 | uint32_t handle, emcore_errno_value; | 
| 204 |  | -
 | 
|  | 227 | + | 
|  | 228 | +#ifdef DEBUG | 
|  | 229 | +    fprintf(stderr, "FILE OPEN: [%s], 0x%08x\n", path, fi->flags); | 
|  | 230 | +#endif | 
|  | 231 | + | 
| 205 | 232 | res = emcore_file_open(&handle, path, fi->flags); | 
| 206 | 233 |  | 
| 207 | 234 | if (EMCORE_ERROR_IO == res) | 
| — | — | @@ -354,3 +381,122 @@ | 
| 355 | 382 |  | 
| 356 | 383 | return 0; | 
| 357 | 384 | } | 
|  | 385 | + | 
|  | 386 | +int emcorefs_mkdir(const char* path, mode_t mode) | 
|  | 387 | +{ | 
|  | 388 | +    (void)mode; | 
|  | 389 | +    int res; | 
|  | 390 | +    uint32_t emcore_errno_value; | 
|  | 391 | + | 
|  | 392 | +    res = emcore_dir_create(path); | 
|  | 393 | + | 
|  | 394 | +    if (EMCORE_ERROR_IO == res) | 
|  | 395 | +    { | 
|  | 396 | +        res = emcore_errno(&emcore_errno_value); | 
|  | 397 | + | 
|  | 398 | +        if (EMCORE_SUCCESS != res) | 
|  | 399 | +        { | 
|  | 400 | +            return -EIO; | 
|  | 401 | +        } | 
|  | 402 | + | 
|  | 403 | +        if (EMCORE_SUCCESS != emcore_errno_value) | 
|  | 404 | +        { | 
|  | 405 | +            return -emcore_errno_value; | 
|  | 406 | +        } | 
|  | 407 | +    } | 
|  | 408 | + | 
|  | 409 | +    if (EMCORE_SUCCESS != res) | 
|  | 410 | +    { | 
|  | 411 | +        return -EIO; | 
|  | 412 | +    } | 
|  | 413 | + | 
|  | 414 | +    return 0; | 
|  | 415 | +} | 
|  | 416 | + | 
|  | 417 | +int emcorefs_rmdir(const char* path) | 
|  | 418 | +{ | 
|  | 419 | +    int res; | 
|  | 420 | +    uint32_t emcore_errno_value; | 
|  | 421 | + | 
|  | 422 | +    res = emcore_dir_remove(path); | 
|  | 423 | + | 
|  | 424 | +    if (EMCORE_ERROR_IO == res) | 
|  | 425 | +    { | 
|  | 426 | +        res = emcore_errno(&emcore_errno_value); | 
|  | 427 | + | 
|  | 428 | +        if (EMCORE_SUCCESS != res) | 
|  | 429 | +        { | 
|  | 430 | +            return -EIO; | 
|  | 431 | +        } | 
|  | 432 | + | 
|  | 433 | +        if (EMCORE_SUCCESS != emcore_errno_value) | 
|  | 434 | +        { | 
|  | 435 | +            return -emcore_errno_value; | 
|  | 436 | +        } | 
|  | 437 | +    } | 
|  | 438 | + | 
|  | 439 | +    if (EMCORE_SUCCESS != res) | 
|  | 440 | +    { | 
|  | 441 | +        return -EIO; | 
|  | 442 | +    } | 
|  | 443 | + | 
|  | 444 | +    cache_remove(path); | 
|  | 445 | + | 
|  | 446 | +    return 0; | 
|  | 447 | +} | 
|  | 448 | + | 
|  | 449 | +int emcorefs_create(const char* path, mode_t mode, struct fuse_file_info* fi) | 
|  | 450 | +{ | 
|  | 451 | +    (void)mode; | 
|  | 452 | +    return emcorefs_open(path, fi); | 
|  | 453 | +} | 
|  | 454 | + | 
|  | 455 | +int emcorefs_mknod(const char* path, mode_t mode, dev_t dev) | 
|  | 456 | +{ | 
|  | 457 | +    (void)dev; | 
|  | 458 | +    int res; | 
|  | 459 | +    struct fuse_file_info fi; | 
|  | 460 | + | 
|  | 461 | +    fi.flags = O_WRONLY | O_CREAT | O_TRUNC; | 
|  | 462 | + | 
|  | 463 | +    res = emcorefs_create(path, mode, &fi); | 
|  | 464 | + | 
|  | 465 | +    if (0 != res) { | 
|  | 466 | +        return res; | 
|  | 467 | +    } | 
|  | 468 | + | 
|  | 469 | +    return emcorefs_release(path, &fi); | 
|  | 470 | +} | 
|  | 471 | + | 
|  | 472 | +int emcorefs_unlink(const char* path) | 
|  | 473 | +{ | 
|  | 474 | + | 
|  | 475 | +    int res; | 
|  | 476 | +    uint32_t emcore_errno_value; | 
|  | 477 | + | 
|  | 478 | +    res = emcore_file_unlink(path); | 
|  | 479 | + | 
|  | 480 | +    if (EMCORE_ERROR_IO == res) | 
|  | 481 | +    { | 
|  | 482 | +        res = emcore_errno(&emcore_errno_value); | 
|  | 483 | + | 
|  | 484 | +        if (EMCORE_SUCCESS != res) | 
|  | 485 | +        { | 
|  | 486 | +            return -EIO; | 
|  | 487 | +        } | 
|  | 488 | + | 
|  | 489 | +        if (EMCORE_SUCCESS != emcore_errno_value) | 
|  | 490 | +        { | 
|  | 491 | +            return -emcore_errno_value; | 
|  | 492 | +        } | 
|  | 493 | +    } | 
|  | 494 | + | 
|  | 495 | +    if (EMCORE_SUCCESS != res) | 
|  | 496 | +    { | 
|  | 497 | +        return -EIO; | 
|  | 498 | +    } | 
|  | 499 | + | 
|  | 500 | +    cache_remove(path); | 
|  | 501 | + | 
|  | 502 | +    return 0; | 
|  | 503 | +} | 
| \ No newline at end of file | 
| Index: emcore/trunk/tools/emcorefs/cache.c | 
| — | — | @@ -63,7 +63,7 @@ | 
| 64 | 64 | for (i = 0; i < emcore_dir_cache_length; ++i) | 
| 65 | 65 | { | 
| 66 | 66 | #ifdef DEBUG2 | 
| 67 |  | -        fprintf(stderr, "strcmp([%s], [%s]) == %d\n", name, emcore_dir_entry_cache[i].name, strcmp(name, emcore_dir_entry_cache[i].name)); | 
|  | 67 | +        fprintf(stderr, "cache_get: strcmp([%s], [%s]) == %d\n", name, emcore_dir_entry_cache[i].name, strcmp(name, emcore_dir_entry_cache[i].name)); | 
| 68 | 68 | #endif | 
| 69 | 69 | if (0 == strcmp(name, emcore_dir_entry_cache[i].name)) | 
| 70 | 70 | { | 
| — | — | @@ -138,6 +138,43 @@ | 
| 139 | 139 | ++emcore_dir_cache_length; | 
| 140 | 140 | } | 
| 141 | 141 |  | 
|  | 142 | +void cache_remove(const char* name) | 
|  | 143 | +{ | 
|  | 144 | +    size_t i; | 
|  | 145 | +    void* new_ptr; | 
|  | 146 | + | 
|  | 147 | +    for (i = 0; i < emcore_dir_cache_length; ++i) | 
|  | 148 | +    { | 
|  | 149 | +#ifdef DEBUG2 | 
|  | 150 | +        fprintf(stderr, "cache_remove: strcmp([%s], [%s]) == %d\n", name, emcore_dir_entry_cache[i].name, strcmp(name, emcore_dir_entry_cache[i].name)); | 
|  | 151 | +#endif | 
|  | 152 | +        if (0 == strcmp(name, emcore_dir_entry_cache[i].name)) | 
|  | 153 | +        { | 
|  | 154 | +#ifdef DEBUG2 | 
|  | 155 | +            fprintf(stderr, "CACHE REMOVE: [%s]\n", name); | 
|  | 156 | +#endif | 
|  | 157 | +            free(emcore_dir_entry_cache[i].name); | 
|  | 158 | + | 
|  | 159 | +            if (emcore_dir_cache_length > i + 1) { | 
|  | 160 | +                memcpy(emcore_dir_entry_cache + i, emcore_dir_entry_cache + i + 1, (emcore_dir_cache_length - i - 1) * sizeof(*emcore_dir_entry_cache)); | 
|  | 161 | +            } | 
|  | 162 | + | 
|  | 163 | +            --emcore_dir_cache_length; | 
|  | 164 | + | 
|  | 165 | +            new_ptr = realloc(emcore_dir_entry_cache, | 
|  | 166 | +                sizeof(*emcore_dir_entry_cache) * (emcore_dir_cache_length)); | 
|  | 167 | + | 
|  | 168 | +            if (!new_ptr) | 
|  | 169 | +            { | 
|  | 170 | +                return; | 
|  | 171 | +            } | 
|  | 172 | + | 
|  | 173 | +            emcore_dir_entry_cache = new_ptr; | 
|  | 174 | +        } | 
|  | 175 | +    } | 
|  | 176 | + | 
|  | 177 | +} | 
|  | 178 | + | 
| 142 | 179 | void cache_destroy(void) | 
| 143 | 180 | { | 
| 144 | 181 | #ifdef DEBUG | 
| — | — | @@ -153,3 +190,20 @@ | 
| 154 | 191 | fprintf(stderr, "Cache destroyed!\n"); | 
| 155 | 192 | #endif | 
| 156 | 193 | } | 
|  | 194 | + | 
|  | 195 | +#ifdef DEBUG2 | 
|  | 196 | +void cache_dump(void) | 
|  | 197 | +{ | 
|  | 198 | +    size_t i; | 
|  | 199 | + | 
|  | 200 | +    if (!emcore_dir_cache_length) | 
|  | 201 | +    { | 
|  | 202 | +        return; | 
|  | 203 | +    } | 
|  | 204 | + | 
|  | 205 | +    for (i = 0; i < emcore_dir_cache_length; ++i) | 
|  | 206 | +    { | 
|  | 207 | +        fprintf(stderr, "cache_dump: [%s] 0x%08x %d %d %lu\n", emcore_dir_entry_cache[i].name, emcore_dir_entry_cache[i].attributes, emcore_dir_entry_cache[i].size, emcore_dir_entry_cache[i].startcluster, fat_time_to_unix_ts(emcore_dir_entry_cache[i].wrtdate, emcore_dir_entry_cache[i].wrttime)); | 
|  | 208 | +    } | 
|  | 209 | +} | 
|  | 210 | +#endif | 
| Index: emcore/trunk/tools/emcorefs/emcorefs.c | 
| — | — | @@ -40,25 +40,13 @@ | 
| 41 | 41 | .open       = emcorefs_open, | 
| 42 | 42 | .read       = emcorefs_read, | 
| 43 | 43 | .release    = emcorefs_release, | 
|  | 44 | +    .mkdir      = emcorefs_mkdir, | 
|  | 45 | +    .rmdir      = emcorefs_rmdir, | 
|  | 46 | +    .create     = emcorefs_create, | 
|  | 47 | +    .mknod      = emcorefs_mknod, | 
|  | 48 | +    .unlink     = emcorefs_unlink, | 
| 44 | 49 | }; | 
| 45 | 50 |  | 
| 46 |  | -int emcorefs_init(void) | 
| 47 |  | -{ | 
| 48 |  | -    int res; | 
| 49 |  | -    uint32_t count; | 
| 50 |  | - | 
| 51 |  | -    res = emcore_file_close_all(&count); | 
| 52 |  | - | 
| 53 |  | -    if (EMCORE_SUCCESS != res) | 
| 54 |  | -    { | 
| 55 |  | -        return res; | 
| 56 |  | -    } | 
| 57 |  | - | 
| 58 |  | -    res = emcore_dir_close_all(&count); | 
| 59 |  | - | 
| 60 |  | -    return res; | 
| 61 |  | -} | 
| 62 |  | - | 
| 63 | 51 | int main(int argc, char* argv[]) | 
| 64 | 52 | { | 
| 65 | 53 | int res, res2; | 
| Index: emcore/trunk/tools/emcorefs/fuse.h | 
| — | — | @@ -26,7 +26,7 @@ | 
| 27 | 27 |  | 
| 28 | 28 | #include "global.h" | 
| 29 | 29 |  | 
| 30 |  | -
 | 
|  | 30 | +int emcorefs_init(void); | 
| 31 | 31 | int emcorefs_getattr(const char* path, struct stat* stbuf); | 
| 32 | 32 | int emcorefs_opendir(const char* path, struct fuse_file_info* fi); | 
| 33 | 33 | int emcorefs_readdir(const char* path, void* buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info* fi); | 
| — | — | @@ -34,5 +34,10 @@ | 
| 35 | 35 | int emcorefs_open(const char* path, struct fuse_file_info* fi); | 
| 36 | 36 | int emcorefs_read(const char* path, char* buf, uint32_t size, off_t offset, struct fuse_file_info* fi); | 
| 37 | 37 | int emcorefs_release(const char* path, struct fuse_file_info* fi); | 
|  | 38 | +int emcorefs_mkdir(const char* path, mode_t mode); | 
|  | 39 | +int emcorefs_rmdir(const char* path); | 
|  | 40 | +int emcorefs_create(const char* path, mode_t mode, struct fuse_file_info* fi); | 
|  | 41 | +int emcorefs_mknod(const char* path, mode_t mode, dev_t dev); | 
|  | 42 | +int emcorefs_unlink(const char* path); | 
| 38 | 43 |  | 
| 39 | 44 | #endif /* __FUSE_H__ */ | 
| Index: emcore/trunk/tools/emcorefs/cache.h | 
| — | — | @@ -30,6 +30,11 @@ | 
| 31 | 31 | void cache_init(void); | 
| 32 | 32 | struct emcore_dir_entry* cache_get(const char* name); | 
| 33 | 33 | void cache_insert(const char* dir_name, const struct emcore_dir_entry* entry); | 
|  | 34 | +void cache_remove(const char* dir_name); | 
| 34 | 35 | void cache_destroy(void); | 
| 35 | 36 |  | 
|  | 37 | +#ifdef DEBUG2 | 
|  | 38 | +void cache_dump(void); | 
|  | 39 | +#endif | 
|  | 40 | + | 
| 36 | 41 | #endif /* __CACHE_H__ */ | 
| Index: emcore/trunk/tools/emcorefs/emcorefs.h | 
| — | — | @@ -27,7 +27,6 @@ | 
| 28 | 28 | #include "global.h" | 
| 29 | 29 |  | 
| 30 | 30 |  | 
| 31 |  | -int emcorefs_init(void);
 | 
| 32 | 31 | int main(int argc, char* argv[]); | 
| 33 | 32 |  | 
| 34 | 33 | #endif /* __EMCOREFS_H__ */ | 
| Index: emcore/trunk/tools/emcorefs/emcore.c | 
| — | — | @@ -375,6 +375,7 @@ | 
| 376 | 376 | { | 
| 377 | 377 | int res; | 
| 378 | 378 | uint32_t str_length, data_length, in[4], *out; | 
|  | 379 | +    int flags_emcore = 0; | 
| 379 | 380 |  | 
| 380 | 381 | *handle = 0; | 
| 381 | 382 |  | 
| — | — | @@ -389,8 +390,38 @@ | 
| 390 | 391 | out = calloc(sizeof(char), data_length); | 
| 391 | 392 |  | 
| 392 | 393 | *(out) = 30; | 
| 393 |  | -    *(out + 1) = flags;
 | 
| 394 | 394 |  | 
|  | 395 | +    /* | 
|  | 396 | +    #define O_RDONLY 0 | 
|  | 397 | +    #define O_WRONLY 1 | 
|  | 398 | +    #define O_RDWR   2 | 
|  | 399 | +    #define O_CREAT  4 | 
|  | 400 | +    #define O_APPEND 8 | 
|  | 401 | +    #define O_TRUNC  0x10 | 
|  | 402 | +    */ | 
|  | 403 | + | 
|  | 404 | +    if (flags & O_WRONLY) { | 
|  | 405 | +        flags_emcore |= 0x01; | 
|  | 406 | +    } | 
|  | 407 | + | 
|  | 408 | +    if (flags & O_RDWR) { | 
|  | 409 | +        flags_emcore |= 0x02; | 
|  | 410 | +    } | 
|  | 411 | + | 
|  | 412 | +    if (flags & O_CREAT) { | 
|  | 413 | +        flags_emcore |= 0x04; | 
|  | 414 | +    } | 
|  | 415 | + | 
|  | 416 | +    if (flags & O_APPEND) { | 
|  | 417 | +        flags_emcore |= 0x08; | 
|  | 418 | +    } | 
|  | 419 | + | 
|  | 420 | +    if (flags & O_TRUNC) { | 
|  | 421 | +        flags_emcore |= 0x10; | 
|  | 422 | +    } | 
|  | 423 | + | 
|  | 424 | +    *(out + 1) = flags_emcore; | 
|  | 425 | + | 
| 395 | 426 | strncpy(((char*)(out + 4)), path, str_length); | 
| 396 | 427 |  | 
| 397 | 428 | res = emcore_monitor_command(out, in, data_length, 16); | 
| — | — | @@ -746,8 +777,8 @@ | 
| 747 | 778 | { | 
| 748 | 779 | return res; | 
| 749 | 780 | } | 
| 750 |  | -
 | 
| 751 |  | -        if (EMCORE_SUCCESS != emcore_errno_value)
 | 
|  | 781 | + | 
|  | 782 | +        if (EMCORE_SUCCESS != emcore_errno_value && 2 != emcore_errno_value) | 
| 752 | 783 | { | 
| 753 | 784 | return EMCORE_ERROR_IO; | 
| 754 | 785 | } | 
| — | — | @@ -836,6 +867,74 @@ | 
| 837 | 868 | return EMCORE_SUCCESS; | 
| 838 | 869 | } | 
| 839 | 870 |  | 
|  | 871 | +int emcore_dir_create(const char* name) | 
|  | 872 | +{ | 
|  | 873 | +    int res; | 
|  | 874 | +    uint32_t str_length, data_length, in[4], *out; | 
|  | 875 | + | 
|  | 876 | +    str_length = strlen(name); | 
|  | 877 | +    data_length = str_length + 1 + EMCORE_HEADER_SIZE; | 
|  | 878 | + | 
|  | 879 | +    if (data_length > emcore_usb_eps_mps.cout) | 
|  | 880 | +    { | 
|  | 881 | +        return EMCORE_ERROR_OVERFLOW; | 
|  | 882 | +    } | 
|  | 883 | + | 
|  | 884 | +    out = calloc(sizeof(char), data_length); | 
|  | 885 | + | 
|  | 886 | +    *(out) = 47; | 
|  | 887 | + | 
|  | 888 | +    strncpy(((char*)(out + 4)), name, str_length); | 
|  | 889 | + | 
|  | 890 | +    res = emcore_monitor_command(out, in, data_length, 16); | 
|  | 891 | + | 
|  | 892 | +    if (EMCORE_SUCCESS != res) | 
|  | 893 | +    { | 
|  | 894 | +        return res; | 
|  | 895 | +    } | 
|  | 896 | + | 
|  | 897 | +    if (in[1] > 0x80000000) | 
|  | 898 | +    { | 
|  | 899 | +        return EMCORE_ERROR_IO; | 
|  | 900 | +    } | 
|  | 901 | + | 
|  | 902 | +    return EMCORE_SUCCESS; | 
|  | 903 | +} | 
|  | 904 | + | 
|  | 905 | +int emcore_dir_remove(const char* name) | 
|  | 906 | +{ | 
|  | 907 | +    int res; | 
|  | 908 | +    uint32_t str_length, data_length, in[4], *out; | 
|  | 909 | + | 
|  | 910 | +    str_length = strlen(name); | 
|  | 911 | +    data_length = str_length + 1 + EMCORE_HEADER_SIZE; | 
|  | 912 | + | 
|  | 913 | +    if (data_length > emcore_usb_eps_mps.cout) | 
|  | 914 | +    { | 
|  | 915 | +        return EMCORE_ERROR_OVERFLOW; | 
|  | 916 | +    } | 
|  | 917 | + | 
|  | 918 | +    out = calloc(sizeof(char), data_length); | 
|  | 919 | + | 
|  | 920 | +    *(out) = 48; | 
|  | 921 | + | 
|  | 922 | +    strncpy(((char*)(out + 4)), name, str_length); | 
|  | 923 | + | 
|  | 924 | +    res = emcore_monitor_command(out, in, data_length, 16); | 
|  | 925 | + | 
|  | 926 | +    if (EMCORE_SUCCESS != res) | 
|  | 927 | +    { | 
|  | 928 | +        return res; | 
|  | 929 | +    } | 
|  | 930 | + | 
|  | 931 | +    if (in[1] > 0x80000000) | 
|  | 932 | +    { | 
|  | 933 | +        return EMCORE_ERROR_IO; | 
|  | 934 | +    } | 
|  | 935 | + | 
|  | 936 | +    return EMCORE_SUCCESS; | 
|  | 937 | +} | 
|  | 938 | + | 
| 840 | 939 | int emcore_errno(uint32_t* emcore_errno_value) | 
| 841 | 940 | { | 
| 842 | 941 | int res; |