sshfs sử dụng Giao thức truyền tệp SSH (SFTP). Cách giải quyết mà bạn đã kích hoạt là xoay quanh ngữ nghĩa của hoạt động đổi tên () trên giao thức đó khi tên "mới" đã tồn tại.
Hành vi POSIX để đổi tên () trong trường hợp này là xóa tệp hiện có và hoàn tất đổi tên.
Trong giao thức SFTP, bạn có thể đổi tên một tệp bằng thao tác SSH_FXP_RENAME; tuy nhiên, hành vi của nó khi tên đích đã tồn tại dường như phụ thuộc vào phiên bản của giao thức bạn đang sử dụng và cờ nào bạn vượt qua. Các trang wikipedia cho giao thức SFTP có liên kết đến dự thảo RFC khác nhau cho các phiên bản khác nhau của giao thức. Trong Dự thảo 00 , hành vi được liệt kê là:
Đó là một lỗi nếu đã tồn tại một tệp có tên được chỉ định bởi newpath.
Trong Dự thảo 13 , hành vi được liệt kê là
Nếu các cờ không bao gồm SSH_FXP_RENAME_OVERWRITE và đã tồn tại một tệp có tên được chỉ định bởi newpath, máy chủ PHẢI trả lời bằng SSH_FX_FILE_ALREADY_EXISTS.
Nếu các cờ bao gồm SSH_FXP_RENAME_ATOMIC và tệp đích đã tồn tại, thì nó được thay thế theo kiểu nguyên tử. Tức là, không có thời gian có thể quan sát được trong thời gian mà tên không đề cập đến tệp cũ hoặc tệp mới. SSH_FXP_RENAME_ATOMIC ngụ ý SSH_FXP_RENAME_OVERWRITE.
Để xử lý sự cố có thể xảy ra của thao tác đổi tên () khi tên đích tồn tại, sshfs cung cấp cách giải quyết sau (nếu được bật) :
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);
}
}
}
Trong mã này "từ" là tên hiện có của tệp chúng tôi muốn đổi tên và "thành" là tên mới mà chúng tôi muốn. Đặt một số độ dài đường dẫn và sổ sách lỗi sang một bên, công việc này xung quanh
- Đổi tên "thành" thành "totmp"
- Đổi tên "từ" thành "thành"
- Bỏ liên kết (xóa) "totmp"
Điều này tránh xung đột "tập tin đã tồn tại", nhưng cũng thay đổi ngữ nghĩa của các hoạt động đổi tên (), đó là lý do tại sao bạn không muốn làm điều đó theo mặc định.