Rev 4264 | Rev 4301 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4264 | Rev 4279 | ||
|---|---|---|---|
| Line 802... | Line 802... | ||
| 802 | ipc_answer_0(rid, EOK); |
802 | ipc_answer_0(rid, EOK); |
| 803 | } |
803 | } |
| 804 | 804 | ||
| 805 | void vfs_rename(ipc_callid_t rid, ipc_call_t *request) |
805 | void vfs_rename(ipc_callid_t rid, ipc_call_t *request) |
| 806 | { |
806 | { |
| 807 | size_t len; |
807 | size_t olen, nlen; |
| 808 | ipc_callid_t callid; |
808 | ipc_callid_t callid; |
| 809 | int rc; |
809 | int rc; |
| 810 | 810 | ||
| 811 | /* Retrieve the old path. */ |
811 | /* Retrieve the old path. */ |
| 812 | if (!ipc_data_write_receive(&callid, &len)) { |
812 | if (!ipc_data_write_receive(&callid, &olen)) { |
| 813 | ipc_answer_0(callid, EINVAL); |
813 | ipc_answer_0(callid, EINVAL); |
| 814 | ipc_answer_0(rid, EINVAL); |
814 | ipc_answer_0(rid, EINVAL); |
| 815 | return; |
815 | return; |
| 816 | } |
816 | } |
| 817 | char *old = malloc(len + 1); |
817 | char *old = malloc(olen + 1); |
| 818 | if (!old) { |
818 | if (!old) { |
| 819 | ipc_answer_0(callid, ENOMEM); |
819 | ipc_answer_0(callid, ENOMEM); |
| 820 | ipc_answer_0(rid, ENOMEM); |
820 | ipc_answer_0(rid, ENOMEM); |
| 821 | return; |
821 | return; |
| 822 | } |
822 | } |
| 823 | if ((rc = ipc_data_write_finalize(callid, old, len))) { |
823 | if ((rc = ipc_data_write_finalize(callid, old, olen))) { |
| 824 | ipc_answer_0(rid, rc); |
824 | ipc_answer_0(rid, rc); |
| 825 | free(old); |
825 | free(old); |
| 826 | return; |
826 | return; |
| 827 | } |
827 | } |
| 828 | old[len] = '\0'; |
828 | old[olen] = '\0'; |
| 829 | 829 | ||
| 830 | /* Retrieve the new path. */ |
830 | /* Retrieve the new path. */ |
| 831 | if (!ipc_data_write_receive(&callid, &len)) { |
831 | if (!ipc_data_write_receive(&callid, &nlen)) { |
| 832 | ipc_answer_0(callid, EINVAL); |
832 | ipc_answer_0(callid, EINVAL); |
| 833 | ipc_answer_0(rid, EINVAL); |
833 | ipc_answer_0(rid, EINVAL); |
| 834 | free(old); |
834 | free(old); |
| 835 | return; |
835 | return; |
| 836 | } |
836 | } |
| 837 | char *new = malloc(len + 1); |
837 | char *new = malloc(nlen + 1); |
| 838 | if (!new) { |
838 | if (!new) { |
| 839 | ipc_answer_0(callid, ENOMEM); |
839 | ipc_answer_0(callid, ENOMEM); |
| 840 | ipc_answer_0(rid, ENOMEM); |
840 | ipc_answer_0(rid, ENOMEM); |
| 841 | free(old); |
841 | free(old); |
| 842 | return; |
842 | return; |
| 843 | } |
843 | } |
| 844 | if ((rc = ipc_data_write_finalize(callid, new, len))) { |
844 | if ((rc = ipc_data_write_finalize(callid, new, nlen))) { |
| 845 | ipc_answer_0(rid, rc); |
845 | ipc_answer_0(rid, rc); |
| 846 | free(old); |
846 | free(old); |
| 847 | free(new); |
847 | free(new); |
| 848 | return; |
848 | return; |
| 849 | } |
849 | } |
| 850 | new[len] = '\0'; |
850 | new[nlen] = '\0'; |
| 851 | 851 | ||
| 852 | char *oldc = canonify(old, &len); |
852 | char *oldc = canonify(old, &olen); |
| 853 | char *newc = canonify(new, NULL); |
853 | char *newc = canonify(new, &nlen); |
| 854 | if (!oldc || !newc) { |
854 | if (!oldc || !newc) { |
| 855 | ipc_answer_0(rid, EINVAL); |
855 | ipc_answer_0(rid, EINVAL); |
| 856 | free(old); |
856 | free(old); |
| 857 | free(new); |
857 | free(new); |
| 858 | return; |
858 | return; |
| 859 | } |
859 | } |
| - | 860 | oldc[olen] = '\0'; |
|
| - | 861 | newc[nlen] = '\0'; |
|
| 860 | if (!strncmp(newc, oldc, len)) { |
862 | if (!str_lcmp(newc, oldc, str_length(oldc))) { |
| 861 | /* oldc is a prefix of newc */ |
863 | /* oldc is a prefix of newc */ |
| 862 | ipc_answer_0(rid, EINVAL); |
864 | ipc_answer_0(rid, EINVAL); |
| 863 | free(old); |
865 | free(old); |
| 864 | free(new); |
866 | free(new); |
| 865 | return; |
867 | return; |