Subversion Repositories HelenOS

Rev

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;