| #include "git-compat-util.h" |
| #include "config.h" |
| #include "fsmonitor-ll.h" |
| #include "fsmonitor-ipc.h" |
| #include "fsmonitor-settings.h" |
| #include "fsmonitor-path-utils.h" |
| |
| /* |
| * For the builtin FSMonitor, we create the Unix domain socket for the |
| * IPC in the .git directory. If the working directory is remote, |
| * then the socket will be created on the remote file system. This |
| * can fail if the remote file system does not support UDS file types |
| * (e.g. smbfs to a Windows server) or if the remote kernel does not |
| * allow a non-local process to bind() the socket. (These problems |
| * could be fixed by moving the UDS out of the .git directory and to a |
| * well-known local directory on the client machine, but care should |
| * be taken to ensure that $HOME is actually local and not a managed |
| * file share.) |
| * |
| * FAT32 and NTFS working directories are problematic too. |
| * |
| * The builtin FSMonitor uses a Unix domain socket in the .git |
| * directory for IPC. These Windows drive formats do not support |
| * Unix domain sockets, so mark them as incompatible for the daemon. |
| * |
| */ |
| static enum fsmonitor_reason check_uds_volume(struct repository *r) |
| { |
| struct fs_info fs; |
| const char *ipc_path = fsmonitor_ipc__get_path(r); |
| struct strbuf path = STRBUF_INIT; |
| strbuf_add(&path, ipc_path, strlen(ipc_path)); |
| |
| if (fsmonitor__get_fs_info(dirname(path.buf), &fs) == -1) { |
| strbuf_release(&path); |
| return FSMONITOR_REASON_ERROR; |
| } |
| |
| strbuf_release(&path); |
| |
| if (fs.is_remote || |
| !strcmp(fs.typename, "msdos") || |
| !strcmp(fs.typename, "ntfs")) { |
| free(fs.typename); |
| return FSMONITOR_REASON_NOSOCKETS; |
| } |
| |
| free(fs.typename); |
| return FSMONITOR_REASON_OK; |
| } |
| |
| enum fsmonitor_reason fsm_os__incompatible(struct repository *r, int ipc) |
| { |
| enum fsmonitor_reason reason; |
| |
| if (ipc) { |
| reason = check_uds_volume(r); |
| if (reason != FSMONITOR_REASON_OK) |
| return reason; |
| } |
| |
| return FSMONITOR_REASON_OK; |
| } |