Changeset d6084ef in mainline
- Timestamp:
- 2008-03-02T15:05:26Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- dadcec1
- Parents:
- 9bb85f3
- Location:
- uspace/srv/vfs
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs.h
r9bb85f3 rd6084ef 251 251 extern int fs_name_to_handle(char *, bool); 252 252 253 extern int vfs_lookup_internal(char *, size_t, int, vfs_lookup_res_t *, 254 vfs_pair_t *); 253 extern int vfs_lookup_internal(char *, int, vfs_lookup_res_t *, vfs_pair_t *); 255 254 256 255 extern bool vfs_nodes_init(void); -
uspace/srv/vfs/vfs_lookup.c
r9bb85f3 rd6084ef 50 50 51 51 /* Forward static declarations. */ 52 static char *canonify(char *path );52 static char *canonify(char *path, size_t *lenp); 53 53 54 54 atomic_t plb_futex = FUTEX_INITIALIZER; … … 58 58 /** Perform a path lookup. 59 59 * 60 * @param path Path to be resolved; it needn't be an ASCIIZ string.61 * @param len Number of path characters pointed by path.60 * @param path Path to be resolved; it must be a NULL-terminated 61 * string. 62 62 * @param lflag Flags to be used during lookup. 63 63 * @param result Empty structure where the lookup result will be stored. … … 68 68 * @return EOK on success or an error code from errno.h. 69 69 */ 70 int vfs_lookup_internal(char *path, size_t len, int lflag,71 vfs_ lookup_res_t *result, vfs_pair_t *altroot)70 int vfs_lookup_internal(char *path, int lflag, vfs_lookup_res_t *result, 71 vfs_pair_t *altroot) 72 72 { 73 73 vfs_pair_t *root; 74 75 if (!len)76 return EINVAL;77 74 78 75 if (altroot) … … 83 80 if (!root->fs_handle) 84 81 return ENOENT; 82 83 size_t len; 84 path = canonify(path, &len); 85 if (!path) 86 return EINVAL; 85 87 86 88 futex_down(&plb_futex); … … 274 276 static void terminate_slash(token_t *t, token_t *tfsl, token_t *tlcomp) 275 277 { 276 tfsl->stop[1] = '\0'; 278 if (tfsl->stop[1]) /* avoid writing to a well-formatted path */ 279 tfsl->stop[1] = '\0'; 277 280 } 278 281 static void remove_trailing_slash(token_t *t, token_t *tfsl, token_t *tlcomp) … … 435 438 * It works in-place and requires a NULL-terminated input string. 436 439 * 437 * @param Path to be canonified. 440 * @param path Path to be canonified. 441 * @param lenp Pointer where the length of the final path will be 442 * stored. Can be NULL. 438 443 * 439 444 * @return Canonified path or NULL on failure. 440 445 */ 441 char *canonify(char *path )446 char *canonify(char *path, size_t *lenp) 442 447 { 443 448 state_t state; … … 451 456 state = S_INI; 452 457 t = tfsl; 458 tlcomp = tfsl; 453 459 while (state != S_ACCEPT && state != S_RESTART && state != S_REJECT) { 454 460 if (trans[state][t.kind].f) … … 464 470 return NULL; 465 471 case S_ACCEPT: 472 if (lenp) 473 *lenp = (size_t)((tlcomp.stop - tfsl.start) + 1); 466 474 return tfsl.start; 467 475 default: -
uspace/srv/vfs/vfs_ops.c
r9bb85f3 rd6084ef 76 76 }; 77 77 78 return vfs_lookup_internal("/", strlen("/"), L_DIRECTORY, result, 79 &altroot); 78 return vfs_lookup_internal("/", L_DIRECTORY, result, &altroot); 80 79 } 81 80 … … 150 149 /* Allocate buffer for the mount point data being received. */ 151 150 uint8_t *buf; 152 buf = malloc(size );151 buf = malloc(size + 1); 153 152 if (!buf) { 154 153 ipc_answer_0(callid, ENOMEM); … … 159 158 /* Deliver the mount point. */ 160 159 (void) ipc_data_write_finalize(callid, buf, size); 160 buf[size] = '\0'; 161 161 162 162 /* … … 187 187 /* We already have the root FS. */ 188 188 rwlock_write_lock(&namespace_rwlock); 189 rc = vfs_lookup_internal(buf, size, L_DIRECTORY, &mp_res, 190 NULL); 189 rc = vfs_lookup_internal(buf, L_DIRECTORY, &mp_res, NULL); 191 190 if (rc != EOK) { 192 191 /* The lookup failed for some reason. */ … … 315 314 * directly into the PLB using some kind of a callback. 316 315 */ 317 char *path = malloc(len );316 char *path = malloc(len + 1); 318 317 319 318 if (!path) { … … 329 328 return; 330 329 } 330 path[len] = '\0'; 331 331 332 332 /* … … 342 342 /* The path is now populated and we can call vfs_lookup_internal(). */ 343 343 vfs_lookup_res_t lr; 344 rc = vfs_lookup_internal(path, l en, lflag, &lr, NULL);344 rc = vfs_lookup_internal(path, lflag, &lr, NULL); 345 345 if (rc) { 346 346 if (lflag & L_CREATE) … … 637 637 * directly into the PLB using some kind of a callback. 638 638 */ 639 char *path = malloc(len );639 char *path = malloc(len + 1); 640 640 641 641 if (!path) { … … 651 651 return; 652 652 } 653 path[len] = '\0'; 653 654 654 655 rwlock_write_lock(&namespace_rwlock); 655 656 int lflag = L_DIRECTORY | L_CREATE | L_EXCLUSIVE; 656 rc = vfs_lookup_internal(path, l en, lflag, NULL, NULL);657 rc = vfs_lookup_internal(path, lflag, NULL, NULL); 657 658 rwlock_write_unlock(&namespace_rwlock); 658 659 free(path); … … 679 680 * directly into the PLB using some kind of a callback. 680 681 */ 681 char *path = malloc(len );682 char *path = malloc(len + 1); 682 683 683 684 if (!path) { … … 693 694 return; 694 695 } 696 path[len] = '\0'; 695 697 696 698 rwlock_write_lock(&namespace_rwlock); 697 699 lflag &= L_DIRECTORY; /* sanitize lflag */ 698 700 vfs_lookup_res_t lr; 699 rc = vfs_lookup_internal(path, l en, lflag | L_DESTROY, &lr, NULL);701 rc = vfs_lookup_internal(path, lflag | L_DESTROY, &lr, NULL); 700 702 free(path); 701 703 if (rc != EOK) {
Note:
See TracChangeset
for help on using the changeset viewer.