Rev 3625 | Rev 4268 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3625 | Rev 4264 | ||
---|---|---|---|
Line 253... | Line 253... | ||
253 | { |
253 | { |
254 | unsigned long key = (unsigned long) parentp; |
254 | unsigned long key = (unsigned long) parentp; |
255 | link_t *hlp = hash_table_find(&childp->names, &key); |
255 | link_t *hlp = hash_table_find(&childp->names, &key); |
256 | assert(hlp); |
256 | assert(hlp); |
257 | tmpfs_name_t *namep = hash_table_get_instance(hlp, tmpfs_name_t, link); |
257 | tmpfs_name_t *namep = hash_table_get_instance(hlp, tmpfs_name_t, link); |
258 | return !strcmp(namep->name, component); |
258 | return !str_cmp(namep->name, component); |
259 | } |
259 | } |
260 | 260 | ||
261 | void *tmpfs_match(void *prnt, const char *component) |
261 | void *tmpfs_match(void *prnt, const char *component) |
262 | { |
262 | { |
263 | tmpfs_dentry_t *parentp = (tmpfs_dentry_t *) prnt; |
263 | tmpfs_dentry_t *parentp = (tmpfs_dentry_t *) prnt; |
Line 317... | Line 317... | ||
317 | 317 | ||
318 | tmpfs_name_t *namep = malloc(sizeof(tmpfs_name_t)); |
318 | tmpfs_name_t *namep = malloc(sizeof(tmpfs_name_t)); |
319 | if (!namep) |
319 | if (!namep) |
320 | return ENOMEM; |
320 | return ENOMEM; |
321 | tmpfs_name_initialize(namep); |
321 | tmpfs_name_initialize(namep); |
322 | size_t len = strlen(nm); |
322 | size_t size = str_size(nm); |
323 | namep->name = malloc(len + 1); |
323 | namep->name = malloc(size + 1); |
324 | if (!namep->name) { |
324 | if (!namep->name) { |
325 | free(namep); |
325 | free(namep); |
326 | return ENOMEM; |
326 | return ENOMEM; |
327 | } |
327 | } |
328 | strcpy(namep->name, nm); |
328 | strcpy(namep->name, nm); |
Line 452... | Line 452... | ||
452 | 452 | ||
453 | /* |
453 | /* |
454 | * Receive the read request. |
454 | * Receive the read request. |
455 | */ |
455 | */ |
456 | ipc_callid_t callid; |
456 | ipc_callid_t callid; |
457 | size_t len; |
457 | size_t size; |
458 | if (!ipc_data_read_receive(&callid, &len)) { |
458 | if (!ipc_data_read_receive(&callid, &size)) { |
459 | ipc_answer_0(callid, EINVAL); |
459 | ipc_answer_0(callid, EINVAL); |
460 | ipc_answer_0(rid, EINVAL); |
460 | ipc_answer_0(rid, EINVAL); |
461 | return; |
461 | return; |
462 | } |
462 | } |
463 | 463 | ||
464 | size_t bytes; |
464 | size_t bytes; |
465 | if (dentry->type == TMPFS_FILE) { |
465 | if (dentry->type == TMPFS_FILE) { |
466 | bytes = max(0, min(dentry->size - pos, len)); |
466 | bytes = max(0, min(dentry->size - pos, size)); |
467 | (void) ipc_data_read_finalize(callid, dentry->data + pos, |
467 | (void) ipc_data_read_finalize(callid, dentry->data + pos, |
468 | bytes); |
468 | bytes); |
469 | } else { |
469 | } else { |
470 | int i; |
470 | int i; |
471 | tmpfs_dentry_t *cur; |
471 | tmpfs_dentry_t *cur; |
Line 492... | Line 492... | ||
492 | assert(hlp); |
492 | assert(hlp); |
493 | tmpfs_name_t *namep = hash_table_get_instance(hlp, tmpfs_name_t, |
493 | tmpfs_name_t *namep = hash_table_get_instance(hlp, tmpfs_name_t, |
494 | link); |
494 | link); |
495 | 495 | ||
496 | (void) ipc_data_read_finalize(callid, namep->name, |
496 | (void) ipc_data_read_finalize(callid, namep->name, |
497 | strlen(namep->name) + 1); |
497 | str_size(namep->name) + 1); |
498 | bytes = 1; |
498 | bytes = 1; |
499 | } |
499 | } |
500 | 500 | ||
501 | /* |
501 | /* |
502 | * Answer the VFS_READ call. |
502 | * Answer the VFS_READ call. |
Line 525... | Line 525... | ||
525 | 525 | ||
526 | /* |
526 | /* |
527 | * Receive the write request. |
527 | * Receive the write request. |
528 | */ |
528 | */ |
529 | ipc_callid_t callid; |
529 | ipc_callid_t callid; |
530 | size_t len; |
530 | size_t size; |
531 | if (!ipc_data_write_receive(&callid, &len)) { |
531 | if (!ipc_data_write_receive(&callid, &size)) { |
532 | ipc_answer_0(callid, EINVAL); |
532 | ipc_answer_0(callid, EINVAL); |
533 | ipc_answer_0(rid, EINVAL); |
533 | ipc_answer_0(rid, EINVAL); |
534 | return; |
534 | return; |
535 | } |
535 | } |
536 | 536 | ||
537 | /* |
537 | /* |
538 | * Check whether the file needs to grow. |
538 | * Check whether the file needs to grow. |
539 | */ |
539 | */ |
540 | if (pos + len <= dentry->size) { |
540 | if (pos + size <= dentry->size) { |
541 | /* The file size is not changing. */ |
541 | /* The file size is not changing. */ |
542 | (void) ipc_data_write_finalize(callid, dentry->data + pos, len); |
542 | (void) ipc_data_write_finalize(callid, dentry->data + pos, size); |
543 | ipc_answer_2(rid, EOK, len, dentry->size); |
543 | ipc_answer_2(rid, EOK, size, dentry->size); |
544 | return; |
544 | return; |
545 | } |
545 | } |
546 | size_t delta = (pos + len) - dentry->size; |
546 | size_t delta = (pos + size) - dentry->size; |
547 | /* |
547 | /* |
548 | * At this point, we are deliberately extremely straightforward and |
548 | * At this point, we are deliberately extremely straightforward and |
549 | * simply realloc the contents of the file on every write that grows the |
549 | * simply realloc the contents of the file on every write that grows the |
550 | * file. In the end, the situation might not be as bad as it may look: |
550 | * file. In the end, the situation might not be as bad as it may look: |
551 | * our heap allocator can save us and just grow the block whenever |
551 | * our heap allocator can save us and just grow the block whenever |
Line 559... | Line 559... | ||
559 | } |
559 | } |
560 | /* Clear any newly allocated memory in order to emulate gaps. */ |
560 | /* Clear any newly allocated memory in order to emulate gaps. */ |
561 | memset(newdata + dentry->size, 0, delta); |
561 | memset(newdata + dentry->size, 0, delta); |
562 | dentry->size += delta; |
562 | dentry->size += delta; |
563 | dentry->data = newdata; |
563 | dentry->data = newdata; |
564 | (void) ipc_data_write_finalize(callid, dentry->data + pos, len); |
564 | (void) ipc_data_write_finalize(callid, dentry->data + pos, size); |
565 | ipc_answer_2(rid, EOK, len, dentry->size); |
565 | ipc_answer_2(rid, EOK, size, dentry->size); |
566 | } |
566 | } |
567 | 567 | ||
568 | void tmpfs_truncate(ipc_callid_t rid, ipc_call_t *request) |
568 | void tmpfs_truncate(ipc_callid_t rid, ipc_call_t *request) |
569 | { |
569 | { |
570 | dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request); |
570 | dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request); |