sshfs, SSH Dosya Aktarım Protokolü'nü (SFTP) kullanır. Etkinleştirdiğiniz geçici çözüm, "yeni" ad zaten varsa, bir rename () işleminin anlambilimi etrafında çalışmaktır.
Bu durumda rename () için POSIX davranışı, varolan dosyayı kaldırmak ve yeniden adlandırmayı tamamlamaktır.
SFTP protokolünde, bir dosyayı SSH_FXP_RENAME işlemiyle yeniden adlandırabilirsiniz; ancak, hedef adın zaten var olduğu davranışı, kullandığınız protokolün sürümüne ve hangi bayrakları geçtiğinize bağlı gibi görünmektedir. SFTP protokolü için wikipedia sayfası protokolünün çeşitli sürümleri için çeşitli taslak RFC'lere bağlantıları vardır. Gelen Taslak 00 davranış olarak listelenmiştir:
Newpath tarafından belirtilen adda bir dosya zaten varsa bu bir hatadır.
Gelen Taslak 13 , davranış olarak listelenir
Bayraklar SSH_FXP_RENAME_OVERWRITE içermiyorsa ve newpath tarafından belirtilen adda bir dosya zaten varsa, sunucunun SSH_FX_FILE_ALREADY_EXISTS ile yanıt vermesi GEREKİR.
Bayraklar SSH_FXP_RENAME_ATOMIC içeriyorsa ve hedef dosya zaten varsa, atomik bir şekilde değiştirilir. Yani, adın eski veya yeni dosyaya atıfta bulunmadığı zamanda gözlemlenebilir bir an yoktur. SSH_FXP_RENAME_ATOMIC, SSH_FXP_RENAME_OVERWRITE anlamına gelir.
Hedef adı mevcut olduğunda rename () işleminin olası başarısızlığıyla başa çıkmak için, sshfs aşağıdaki geçici çözümü sağlar (etkinleştirilmişse) :
if (err == -EPERM && sshfs.rename_workaround) {
size_t tolen = strlen(to);
if (tolen + RENAME_TEMP_CHARS < PATH_MAX) {
int tmperr;
char totmp[PATH_MAX];
strcpy(totmp, to);
random_string(totmp + tolen, RENAME_TEMP_CHARS);
tmperr = sshfs_do_rename(to, totmp);
if (!tmperr) {
err = sshfs_do_rename(from, to);
if (!err)
err = sshfs_unlink(totmp);
else
sshfs_do_rename(totmp, to);
}
}
}
Bu kodda "from", yeniden adlandırmak istediğimiz dosyanın mevcut adı ve "to" istediğimiz yeni addır. Yol uzunluğunu ve hata defter tutmayı bir kenara bırakarak, bu geçici çözüm
- "To" ifadesini "totmp" olarak değiştirir
- "İle" arasında "olarak yeniden adlandırır
- "Totmp" bağlantısını kaldırır (siler)
Bu, "dosya zaten var" çakışmasını önler, ancak rename () işlemlerinin anlambilimini de değiştirir, bu nedenle varsayılan olarak bunu yapmak istemezsiniz.