sshfs ใช้ SSH File Transfer Protocol (SFTP) วิธีแก้ปัญหาที่คุณเปิดใช้งานอยู่คือการแก้ไขความหมายของการดำเนินการเปลี่ยนชื่อ () ผ่านโปรโตคอลนั้นเมื่อชื่อ "ใหม่" มีอยู่แล้ว
พฤติกรรม POSIX สำหรับการเปลี่ยนชื่อ () ในกรณีนี้คือการลบไฟล์ที่มีอยู่และทำการเปลี่ยนชื่อให้สมบูรณ์
ในโปรโตคอล SFTP คุณสามารถเปลี่ยนชื่อไฟล์ด้วยการดำเนินการ SSH_FXP_RENAME อย่างไรก็ตามพฤติกรรมของมันเมื่อชื่อเป้าหมายมีอยู่แล้วดูเหมือนจะขึ้นอยู่กับรุ่นของโปรโตคอลที่คุณใช้และสิ่งที่คุณส่งผ่าน หน้าวิกิพีเดียสำหรับ SFTP โปรโตคอลมีการเชื่อมโยงไป RFCs ร่างต่างๆสำหรับรุ่นต่างๆของโปรโตคอล ในDraft 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);
}
}
}
ในรหัสนี้ "จาก" เป็นชื่อที่มีอยู่ของไฟล์ที่เราต้องการเปลี่ยนชื่อและ "เป็น" เป็นชื่อใหม่ที่เราต้องการ การวางความยาวเส้นทางและการทำบัญชีข้อผิดพลาดบางส่วนเป็นการทำงานนี้
- เปลี่ยนชื่อ "เป็น" ถึง "totmp"
- เปลี่ยนชื่อ "จาก" เป็น "ถึง"
- ยกเลิกการเชื่อมโยง (ลบ) "totmp"
นี่เป็นการหลีกเลี่ยงความขัดแย้ง "ไฟล์ที่มีอยู่แล้ว" แต่ยังเปลี่ยนความหมายของการดำเนินการเปลี่ยนชื่อ () ซึ่งเป็นสาเหตุที่คุณไม่ต้องการทำตามค่าเริ่มต้น