`sshfs -oworkaround = rename` क्या करता है?


17

एक ऑपरेटिंग सिस्टम क्लास के लिए, मुझे Freebsd5.4 चलाने की आवश्यकता है। चूँकि मैं git रिलीज़ होने से पहले रिलीज़ किए गए bsd के एक संस्करण पर git बनाने की कोशिश नहीं करना चाहता था, इसलिए मुझे लगा कि gitArch के ऊपर से इसका उपयोग करना अच्छा होगा sshfs

किसी भी दर पर मुझे एक वैकल्पिक हल मिला जिसमें मैंने सुझाव दिया था कि मैं sshfsविकल्प देता हूँ -o workaround=rename

यह gitखुश करने के लिए लगता है , लेकिन मैं सिर्फ क्या हुआ के रूप में उलझन में हूँ ...

सभी मैन पेज वर्कअराउंड के बारे में कहते हैं

fix renaming to existing file

लेकिन मैं पूरी तरह से चकित हूँ कि इसका क्या मतलब है ...

वास्तव में वह विकल्प क्या करता है?


3
किसी व्यक्ति के लिए सूचक जो वास्तव में इसका मतलब देखना चाहता है (और एक उत्तर लिखें, और उम्मीद है कि एक दस्तावेज पैच): sourceforge.net/p/fuse/sshfs/ci/master/tree/sshfs.c 2300 से शुरू हो रहा है।
derobert

जवाबों:


10

sshfs SSH फ़ाइल स्थानांतरण प्रोटोकॉल (SFTP) का उपयोग करता है। आपके द्वारा सक्षम किया गया वर्कअराउंड उस प्रोटोकॉल पर एक नाम () ऑपरेशन के शब्दार्थ के आसपास काम कर रहा है जब "नया" नाम पहले से मौजूद है।

इस मामले में नाम बदलने () के लिए POSIX व्यवहार मौजूदा फ़ाइल को हटाने और नाम बदलने को पूरा करने के लिए है।

SFTP प्रोटोकॉल में, आप SSH_FXP_RENAME ऑपरेशन के साथ फ़ाइल का नाम बदल सकते हैं; हालाँकि, इसका व्यवहार तब होता है जब लक्ष्य नाम पहले से मौजूद होता है, आप जिस प्रोटोकॉल का उपयोग कर रहे हैं उसके संस्करण पर निर्भर करते हैं और आप किस झंडे को पास करते हैं। SFTP प्रोटोकॉल के लिए विकिपीडिया पृष्ठ प्रोटोकॉल के विभिन्न संस्करणों के लिए विभिन्न मसौदा RFC के लिए संबंध हैं। में ड्राफ्ट 00 व्यवहार के रूप में सूचीबद्ध है:

यह एक त्रुटि है अगर वहाँ पहले से ही newpath द्वारा निर्दिष्ट नाम के साथ एक फ़ाइल मौजूद है।

में ड्राफ्ट 13 , व्यवहार रूप में सूचीबद्ध है

यदि झंडे में SSH_FXP_RENAME_OVERWRITE शामिल नहीं है, और पहले से ही newpath द्वारा निर्दिष्ट नाम के साथ एक फ़ाइल मौजूद है, तो सर्वर को SSH_FX_FILE_ALREADY_EXISTS के साथ जवाब देना होगा।

यदि झंडे में SSH_FXP_RENAME_ATOMIC शामिल है, और गंतव्य फ़ाइल पहले से मौजूद है, तो इसे एक परमाणु फैशन में बदल दिया जाता है। यानी, ऐसे समय में कोई भी अवलोकन योग्य नहीं है जहां नाम पुरानी या नई फ़ाइल का संदर्भ नहीं देता है। SSH_FXP_RENAME_ATOMIC का अर्थ है SSH_FXP_RENAME_OVERWRITE।

लक्ष्य नाम मौजूद होने पर नाम बदलने () संचालन की संभावित विफलता से निपटने के लिए, sshfs निम्नलिखित वर्कअराउंड प्रदान करता है (यदि सक्षम है) :

   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);
                    }
            }
    }

इस कोड में "से" उस फ़ाइल का मौजूदा नाम है जिसका हम नाम बदलना चाहते हैं और "to" वह नया नाम है जिसे हम चाहते हैं। कुछ पथ लंबाई और त्रुटि बहीखाता को एक तरफ रखकर, यह काम चारों ओर

  • "" से "टोटप" का नाम बदलें
  • "से" तक "नाम"
  • अनलिंक (हटाता है) "टोटप"

यह "फ़ाइल पहले से मौजूद है" संघर्ष से बचा जाता है, लेकिन नाम बदलने () संचालन के शब्दार्थ को भी बदल देता है, यही कारण है कि आप इसे डिफ़ॉल्ट रूप से नहीं करना चाहेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.