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; |