forked from enlightenment/enlightenment
From: Maxime Villard <rustyBSD@gmx.fr>
There is a problem with the realpath() call. When moving a symlink, realpath() gets the path of the pointed file, and the name assigned to the copied link is the name of this file. So we shouldn't use realpath(), but I don't know an equivalent which doesn't take care of symlinks. Here is an example patch. SVN revision: 76721
This commit is contained in:
parent
e406dbd435
commit
3dc989c695
|
@ -230,14 +230,14 @@ main(int argc, char **argv)
|
||||||
done = 0;
|
done = 0;
|
||||||
total = last - 2;
|
total = last - 2;
|
||||||
|
|
||||||
|
char *p;
|
||||||
|
|
||||||
for (; i < last; i++)
|
for (; i < last; i++)
|
||||||
{
|
{
|
||||||
char *p = ecore_file_realpath(argv[i]);
|
p = argv[i];
|
||||||
const char *name;
|
const char *name;
|
||||||
int name_len;
|
int name_len;
|
||||||
|
|
||||||
if (!p) continue;
|
|
||||||
|
|
||||||
/* Don't move a dir into itself */
|
/* Don't move a dir into itself */
|
||||||
if (ecore_file_is_dir(p) &&
|
if (ecore_file_is_dir(p) &&
|
||||||
(strncmp(p, p2, PATH_MAX) == 0) &&
|
(strncmp(p, p2, PATH_MAX) == 0) &&
|
||||||
|
@ -317,7 +317,7 @@ main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
skip_arg:
|
skip_arg:
|
||||||
E_FREE(p);
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
E_FREE(p2);
|
E_FREE(p2);
|
||||||
|
@ -1385,31 +1385,6 @@ _e_fm_op_copy_atom(E_Fm_Op_Task *task)
|
||||||
task->finished = 1;
|
task->finished = 1;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (S_ISLNK(task->src.st.st_mode))
|
|
||||||
{
|
|
||||||
char *dst_dir;
|
|
||||||
|
|
||||||
dst_dir = ecore_file_dir_get(task->dst.name);
|
|
||||||
if (dst_dir)
|
|
||||||
{
|
|
||||||
const char *dst_name;
|
|
||||||
|
|
||||||
dst_name = ecore_file_file_get(task->src.name);
|
|
||||||
if (dst_name)
|
|
||||||
{
|
|
||||||
char dst_path[PATH_MAX];
|
|
||||||
|
|
||||||
if ((strlen(dst_dir) + strlen(dst_name)) >= PATH_MAX)
|
|
||||||
_E_FM_OP_ERROR_SEND_WORK(task, 0, "Not copying link: path too long", dst_path);
|
|
||||||
|
|
||||||
snprintf(dst_path, sizeof(dst_path), "%s/%s", dst_dir, dst_name);
|
|
||||||
task->dst.name = strdup(dst_path);
|
|
||||||
}
|
|
||||||
E_FREE(dst_dir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_e_fm_op_handle_overwrite(task)) return 1;
|
if (_e_fm_op_handle_overwrite(task)) return 1;
|
||||||
|
|
||||||
if (S_ISDIR(task->src.st.st_mode))
|
if (S_ISDIR(task->src.st.st_mode))
|
||||||
|
|
Loading…
Reference in New Issue