sshfs używa protokołu przesyłania plików SSH (SFTP). Obejście, które włączyłeś, polega na obejściu semantyki operacji zmiany nazwy () na tym protokole, gdy „nowa” nazwa już istnieje.
Zachowanie POSIX dla rename () w tym przypadku polega na usunięciu istniejącego pliku i dokończeniu zmiany nazwy.
W protokole SFTP możesz zmienić nazwę pliku za pomocą operacji SSH_FXP_RENAME; jednak jego zachowanie, gdy nazwa docelowa już istnieje, zależy od wersji używanego protokołu i przekazywanych flag. Strona wikipedii dla protokołu SFTP zawiera linki do różnych wersji roboczych RFC dla różnych wersji protokołu. W wersji roboczej 00 zachowanie jest wymienione jako:
Jest to błąd, jeśli istnieje już plik o nazwie określonej przez newpath.
W wersji roboczej 13 zachowanie jest wymienione jako
Jeśli flagi nie zawierają SSH_FXP_RENAME_OVERWRITE i istnieje już plik o nazwie określonej przez newpath, serwer MUSI odpowiedzieć SSH_FX_FILE_ALREADY_EXISTS.
Jeśli flagi zawierają SSH_FXP_RENAME_ATOMIC, a plik docelowy już istnieje, zostanie zastąpiony w sposób atomowy. Tzn. Nie ma zauważalnej chwili, w której nazwa nie odnosi się ani do starego, ani do nowego pliku. SSH_FXP_RENAME_ATOMIC oznacza SSH_FXP_RENAME_OVERWRITE.
Aby poradzić sobie z możliwym niepowodzeniem operacji zmiany nazwy (), gdy istnieje nazwa docelowa, sshfs zapewnia następujące obejście (jeśli jest włączone) :
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);
}
}
}
W tym kodzie „z” to istniejąca nazwa pliku, którego nazwę chcemy zmienić, a „na” to nowa nazwa, której chcemy. Odkładając na bok pewną długość ścieżki i księgowanie błędów, to obejście
- Zmienia nazwy „na” na „totmp”
- Zmienia nazwę „z” na „na”
- Odłącza (usuwa) „totmp”
Pozwala to uniknąć konfliktu „plik już istnieje”, ale zmienia również semantykę operacji zmiany nazwy (), dlatego domyślnie nie chcesz tego robić.