sshfs -oworkaround = rename` ne yapar?


17

Aldığım bir işletim sistemi sınıfı için Freebsd5.4'ü çalıştırmam gerekiyordu. Ben serbest bırakıldı Git önce yayımlanan bsd bir sürümüne inşa Git çalışmakla güreşine istemediğini beri, kullanımı temiz olacağını düşündüm gitüzerinde Arch sshfs.

Ne olursa olsun ben seçeneği vermek önerilen bir geçici çözüm buldum .sshfs-o workaround=rename

gitMutlu görünüyor , ama ne olduğu konusunda kafam karıştı ...

Çözüm sayfası hakkında söylenen tüm sayfa

fix renaming to existing file

ama bunun ne anlama geldiğine tamamen şaşkınım ...

Bu seçenek tam olarak ne yapıyor?


3
Tam olarak ne anlama geldiğini görmek isteyen (ve bir cevap ve umarım bir belge yaması) isteyen bir kişi için işaretçi: 2300 satırından başlayarak sourceforge.net/p/fuse/sshfs/ci/master/tree/sshfs.c .
derobert

Yanıtlar:


10

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.