Rev 4437 | Rev 4445 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4437 | Rev 4443 | ||
|---|---|---|---|
| Line 484... | Line 484... | ||
| 484 | free(opts); |
484 | free(opts); |
| 485 | } |
485 | } |
| 486 | 486 | ||
| 487 | void vfs_open(ipc_callid_t rid, ipc_call_t *request) |
487 | void vfs_open(ipc_callid_t rid, ipc_call_t *request) |
| 488 | { |
488 | { |
| - | 489 | async_serialize_start(); |
|
| - | 490 | ||
| 489 | if (!vfs_files_init()) { |
491 | if (!vfs_files_init()) { |
| 490 | ipc_answer_0(rid, ENOMEM); |
492 | ipc_answer_0(rid, ENOMEM); |
| - | 493 | async_serialize_end(); |
|
| 491 | return; |
494 | return; |
| 492 | } |
495 | } |
| 493 | 496 | ||
| 494 | /* |
497 | /* |
| 495 | * The POSIX interface is open(path, oflag, mode). |
498 | * The POSIX interface is open(path, oflag, mode). |
| Line 509... | Line 512... | ||
| 509 | * L_DIRECTORY. |
512 | * L_DIRECTORY. |
| 510 | */ |
513 | */ |
| 511 | if ((lflag & (L_FILE | L_DIRECTORY)) == 0 || |
514 | if ((lflag & (L_FILE | L_DIRECTORY)) == 0 || |
| 512 | (lflag & (L_FILE | L_DIRECTORY)) == (L_FILE | L_DIRECTORY)) { |
515 | (lflag & (L_FILE | L_DIRECTORY)) == (L_FILE | L_DIRECTORY)) { |
| 513 | ipc_answer_0(rid, EINVAL); |
516 | ipc_answer_0(rid, EINVAL); |
| - | 517 | async_serialize_end(); |
|
| 514 | return; |
518 | return; |
| 515 | } |
519 | } |
| 516 | 520 | ||
| 517 | if (oflag & O_CREAT) |
521 | if (oflag & O_CREAT) |
| 518 | lflag |= L_CREATE; |
522 | lflag |= L_CREATE; |
| Line 522... | Line 526... | ||
| 522 | ipc_callid_t callid; |
526 | ipc_callid_t callid; |
| 523 | 527 | ||
| 524 | if (!ipc_data_write_receive(&callid, &len)) { |
528 | if (!ipc_data_write_receive(&callid, &len)) { |
| 525 | ipc_answer_0(callid, EINVAL); |
529 | ipc_answer_0(callid, EINVAL); |
| 526 | ipc_answer_0(rid, EINVAL); |
530 | ipc_answer_0(rid, EINVAL); |
| - | 531 | async_serialize_end(); |
|
| 527 | return; |
532 | return; |
| 528 | } |
533 | } |
| 529 | char *path = malloc(len + 1); |
534 | char *path = malloc(len + 1); |
| 530 | if (!path) { |
535 | if (!path) { |
| 531 | ipc_answer_0(callid, ENOMEM); |
536 | ipc_answer_0(callid, ENOMEM); |
| 532 | ipc_answer_0(rid, ENOMEM); |
537 | ipc_answer_0(rid, ENOMEM); |
| - | 538 | async_serialize_end(); |
|
| 533 | return; |
539 | return; |
| 534 | } |
540 | } |
| 535 | int rc; |
541 | int rc; |
| 536 | if ((rc = ipc_data_write_finalize(callid, path, len))) { |
542 | if ((rc = ipc_data_write_finalize(callid, path, len))) { |
| 537 | ipc_answer_0(rid, rc); |
543 | ipc_answer_0(rid, rc); |
| 538 | free(path); |
544 | free(path); |
| - | 545 | async_serialize_end(); |
|
| 539 | return; |
546 | return; |
| 540 | } |
547 | } |
| 541 | path[len] = '\0'; |
548 | path[len] = '\0'; |
| 542 | 549 | ||
| 543 | /* |
550 | /* |
| Line 558... | Line 565... | ||
| 558 | rwlock_write_unlock(&namespace_rwlock); |
565 | rwlock_write_unlock(&namespace_rwlock); |
| 559 | else |
566 | else |
| 560 | rwlock_read_unlock(&namespace_rwlock); |
567 | rwlock_read_unlock(&namespace_rwlock); |
| 561 | ipc_answer_0(rid, rc); |
568 | ipc_answer_0(rid, rc); |
| 562 | free(path); |
569 | free(path); |
| - | 570 | async_serialize_end(); |
|
| 563 | return; |
571 | return; |
| 564 | } |
572 | } |
| 565 | 573 | ||
| 566 | /* Path is no longer needed. */ |
574 | /* Path is no longer needed. */ |
| 567 | free(path); |
575 | free(path); |
| Line 580... | Line 588... | ||
| 580 | node->dev_handle, node->index, 0); |
588 | node->dev_handle, node->index, 0); |
| 581 | if (rc) { |
589 | if (rc) { |
| 582 | rwlock_write_unlock(&node->contents_rwlock); |
590 | rwlock_write_unlock(&node->contents_rwlock); |
| 583 | vfs_node_put(node); |
591 | vfs_node_put(node); |
| 584 | ipc_answer_0(rid, rc); |
592 | ipc_answer_0(rid, rc); |
| - | 593 | async_serialize_end(); |
|
| 585 | return; |
594 | return; |
| 586 | } |
595 | } |
| 587 | node->size = 0; |
596 | node->size = 0; |
| 588 | } |
597 | } |
| 589 | rwlock_write_unlock(&node->contents_rwlock); |
598 | rwlock_write_unlock(&node->contents_rwlock); |
| Line 595... | Line 604... | ||
| 595 | */ |
604 | */ |
| 596 | int fd = vfs_fd_alloc(); |
605 | int fd = vfs_fd_alloc(); |
| 597 | if (fd < 0) { |
606 | if (fd < 0) { |
| 598 | vfs_node_put(node); |
607 | vfs_node_put(node); |
| 599 | ipc_answer_0(rid, fd); |
608 | ipc_answer_0(rid, fd); |
| - | 609 | async_serialize_end(); |
|
| 600 | return; |
610 | return; |
| 601 | } |
611 | } |
| 602 | vfs_file_t *file = vfs_file_get(fd); |
612 | vfs_file_t *file = vfs_file_get(fd); |
| 603 | file->node = node; |
613 | file->node = node; |
| 604 | if (oflag & O_APPEND) |
614 | if (oflag & O_APPEND) |
| Line 614... | Line 624... | ||
| 614 | vfs_node_addref(node); |
624 | vfs_node_addref(node); |
| 615 | vfs_node_put(node); |
625 | vfs_node_put(node); |
| 616 | 626 | ||
| 617 | /* Success! Return the new file descriptor to the client. */ |
627 | /* Success! Return the new file descriptor to the client. */ |
| 618 | ipc_answer_1(rid, EOK, fd); |
628 | ipc_answer_1(rid, EOK, fd); |
| - | 629 | async_serialize_end(); |
|
| 619 | } |
630 | } |
| 620 | 631 | ||
| 621 | void vfs_close(ipc_callid_t rid, ipc_call_t *request) |
632 | void vfs_close(ipc_callid_t rid, ipc_call_t *request) |
| 622 | { |
633 | { |
| 623 | int fd = IPC_GET_ARG1(*request); |
634 | int fd = IPC_GET_ARG1(*request); |