Re: [PATCH] handle rename of case only, for windows

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jan 14, 2011 at 8:44 PM, Tim Abell <tim@xxxxxxxxxxxxx> wrote:
> Â Â Â Â Â Â Â Âelse if (lstat(dst, &st) == 0) {
> - Â Â Â Â Â Â Â Â Â Â Â bad = "destination exists";
> - Â Â Â Â Â Â Â Â Â Â Â if (force) {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â /*
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â* only files can overwrite each other:
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â* check both source and destination
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â*/
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â warning("%s; will overwrite!", bad);
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â bad = NULL;
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â } else
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â bad = "Cannot overwrite";
> + Â Â Â Â Â Â Â Â Â Â Â /* If we are on a case insensitive files= system (windows) http://is.gd/kyxgg
> + Â Â Â Â Â Â Â Â Â Â Â Â* and we are only changing the case of the file then lstat for the
> + Â Â Â Â Â Â Â Â Â Â Â Â* destination will return != 0 because it sees the source file.
> + Â Â Â Â Â Â Â Â Â Â Â Â* To prevent this causing failure, lstat is used to get the inode of the src
> + Â Â Â Â Â Â Â Â Â Â Â Â* and see if it's actually the same file.
> + Â Â Â Â Â Â Â Â Â Â Â Â*/
> + Â Â Â Â Â Â Â Â Â Â Â lstat(src, &src_st); //get file serial number (inode) for source
> + Â Â Â Â Â Â Â Â Â Â Â #warning("src inode: %s, dst inode: %s", src_st.st_ino, st.st_ino);
> + Â Â Â Â Â Â Â Â Â Â Â if (src_st.st_ino != st.st_ino) {
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â bad = "destination exists";
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â if (force) {
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â /*
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â* only files can overwrite each other:
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â* check both source and destination
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â*/
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â warning("%s; will overwrite!", bad);
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â bad = NULL;
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â } else
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â bad = "Cannot overwrite";
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
> Â Â Â Â Â Â Â Â Â Â Â Â}
> Â Â Â Â Â Â Â Â} else if (string_list_has_string(&src_for_dst, dst))
> Â Â Â Â Â Â Â Â Â Â Â Âbad = "multiple sources for the same target";

I wonder if we can make lstat_case() that would only return 0 if it
matches exactly the filename, even on FAT. FindFirstFile/FindNextFile
should return true file name, I think. If not, we can make
lstat_case() take two paths (src and dst) and move all inode
comparison code in there. Much cleaner.
-- 
Duy
ÿô.nlj·Ÿ®‰­†+%ŠË±é¥Šwÿº{.nlj· ŠßžØn‡r¡öë¨è&£ûz¹Þúzf£¢·hšˆ§~†­†Ûÿÿïÿ‘ê_èæ+v‰¨þ)ßø

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]