sshfs verwendet das SSH File Transfer Protocol (SFTP). Die von Ihnen aktivierte Problemumgehung besteht darin, die Semantik einer Rename () - Operation für dieses Protokoll zu umgehen, wenn der "neue" Name bereits vorhanden ist.
In diesem Fall besteht das POSIX-Verhalten für rename () darin, die vorhandene Datei zu entfernen und die Umbenennung abzuschließen.
Im SFTP-Protokoll können Sie eine Datei mit der Operation SSH_FXP_RENAME umbenennen. Das Verhalten, wenn der Zielname bereits vorhanden ist, scheint jedoch von der Version des verwendeten Protokolls und den übergebenen Flags abzuhängen. Die Wikipedia-Seite für das SFTP-Protokoll enthält Links zu verschiedenen RFC-Entwürfen für verschiedene Versionen des Protokolls. In Entwurf 00 ist das Verhalten wie folgt aufgeführt:
Es ist ein Fehler, wenn bereits eine Datei mit dem durch newpath angegebenen Namen existiert.
In Entwurf 13 wird das Verhalten als aufgeführt
Wenn Flags nicht SSH_FXP_RENAME_OVERWRITE enthalten und bereits eine Datei mit dem von newpath angegebenen Namen vorhanden ist, MUSS der Server mit SSH_FX_FILE_ALREADY_EXISTS antworten.
Wenn Flags SSH_FXP_RENAME_ATOMIC enthalten und die Zieldatei bereits vorhanden ist, wird sie atomar ersetzt. Das heißt, es gibt keinen beobachtbaren Zeitpunkt, zu dem der Name weder auf die alte noch auf die neue Datei verweist. SSH_FXP_RENAME_ATOMIC impliziert SSH_FXP_RENAME_OVERWRITE.
Um den möglichen Fehler einer Rename () - Operation zu beheben, wenn der Zielname vorhanden ist, bietet sshfs die folgende Problemumgehung (falls aktiviert) :
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 diesem Code ist "from" der vorhandene Name der Datei, die wir umbenennen möchten, und "to" der neue Name, den wir möchten. Wenn Sie die Pfadlänge und die Fehlerbuchhaltung beiseite lassen, können Sie dies umgehen
- Benennt "to" in "totmp" um
- Benennt "von" nach "nach" um
- Entfernt (löscht) "totmp"
Dies vermeidet den Konflikt "Datei existiert bereits", ändert aber auch die Semantik der rename () -Operationen, weshalb Sie dies standardmäßig nicht möchten.