sshfs utilizza il protocollo SFTP (SSH File Transfer Protocol). La soluzione alternativa che è stata abilitata è aggirare la semantica di un'operazione rename () su quel protocollo quando il "nuovo" nome esiste già.
Il comportamento POSIX per rename () in questo caso è rimuovere il file esistente e completare la ridenominazione.
Nel protocollo SFTP, è possibile rinominare un file con l'operazione SSH_FXP_RENAME; tuttavia, il suo comportamento quando il nome di destinazione esiste già sembra dipendere dalla versione del protocollo che si sta utilizzando e da quali flag si passa. La pagina di Wikipedia per il protocollo SFTP contiene collegamenti a varie bozze di RFC per varie versioni del protocollo. In Bozza 00 il comportamento è elencato come:
È un errore se esiste già un file con il nome specificato da newpath.
In Bozza 13 , il comportamento è elencato come
Se i flag non includono SSH_FXP_RENAME_OVERWRITE e esiste già un file con il nome specificato da newpath, il server DEVE rispondere con SSH_FX_FILE_ALREADY_EXISTS.
Se i flag includono SSH_FXP_RENAME_ATOMIC e il file di destinazione esiste già, viene sostituito in modo atomico. Vale a dire, non esiste un istante osservabile nel tempo in cui il nome non si riferisce al vecchio o al nuovo file. SSH_FXP_RENAME_ATOMIC implica SSH_FXP_RENAME_OVERWRITE.
Per far fronte al possibile fallimento di un'operazione rename () quando esiste il nome di destinazione, sshfs fornisce la seguente soluzione alternativa (se abilitata) :
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);
}
}
}
In questo codice "da" è il nome esistente del file che vogliamo rinominare e "a" è il nuovo nome che vogliamo. Mettendo da parte un po 'la lunghezza del percorso e la contabilità degli errori, questo lavoro intorno
- Rinomina "in" in "totmp"
- Rinomina "da" a "a"
- Scollega (elimina) "totmp"
Ciò evita il conflitto "file già esistente", ma modifica anche la semantica delle operazioni rename (), motivo per cui non si vorrebbe farlo di default.