cosa fa `sshfs -oworkaround = rename`?


17

Per una classe di sistemi operativi che sto prendendo, ho dovuto eseguire Freebsd5.4. Dato che non volevo lottare con il tentativo di compilare git su una versione di bsd rilasciata prima del rilascio di git, ho pensato che sarebbe stato bello usarlo gitda Arch over sshfs.

In ogni caso ho trovato una soluzione alternativa che mi ha suggerito di dare sshfsl'opzione -o workaround=rename.

Sembra essere gitfelice, ma sono piuttosto confuso su quello che è appena successo ...

Tutta la pagina man dice sulla soluzione alternativa

fix renaming to existing file

ma sono completamente sconcertato su cosa significhi ...

Cosa fa esattamente questa opzione?


3
Puntatore per qualcuno che vuole capire esattamente cosa significhi (e scrivere una risposta, e si spera una patch di documentazione): sourceforge.net/p/fuse/sshfs/ci/master/tree/sshfs.c a partire dalla riga 2300.
derobert,

Risposte:


10

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.