| 1 | #include "git-compat-util.h" |
| 2 | #include "config.h" |
| 3 | #include "fsmonitor-ll.h" |
| 4 | #include "fsmonitor-ipc.h" |
| 5 | #include "fsmonitor-settings.h" |
| 6 | #include "fsmonitor-path-utils.h" |
| 7 | |
| 8 | /* |
| 9 | * For the builtin FSMonitor, we create the Unix domain socket for the |
| 10 | * IPC in the .git directory. If the working directory is remote, |
| 11 | * then the socket will be created on the remote file system. This |
| 12 | * can fail if the remote file system does not support UDS file types |
| 13 | * (e.g. smbfs to a Windows server) or if the remote kernel does not |
| 14 | * allow a non-local process to bind() the socket. (These problems |
| 15 | * could be fixed by moving the UDS out of the .git directory and to a |
| 16 | * well-known local directory on the client machine, but care should |
| 17 | * be taken to ensure that $HOME is actually local and not a managed |
| 18 | * file share.) |
| 19 | * |
| 20 | * FAT32 and NTFS working directories are problematic too. |
| 21 | * |
| 22 | * The builtin FSMonitor uses a Unix domain socket in the .git |
| 23 | * directory for IPC. These Windows drive formats do not support |
| 24 | * Unix domain sockets, so mark them as incompatible for the daemon. |
| 25 | * |
| 26 | */ |
| 27 | static enum fsmonitor_reason check_uds_volume(struct repository *r) |
| 28 | { |
| 29 | struct fs_info fs; |
| 30 | const char *ipc_path = fsmonitor_ipc__get_path(r); |
| 31 | struct strbuf path = STRBUF_INIT; |
| 32 | strbuf_add(&path, ipc_path, strlen(ipc_path)); |
| 33 | |
| 34 | if (fsmonitor__get_fs_info(dirname(path.buf), &fs) == -1) { |
| 35 | strbuf_release(&path); |
| 36 | return FSMONITOR_REASON_ERROR; |
| 37 | } |
| 38 | |
| 39 | strbuf_release(&path); |
| 40 | |
| 41 | if (fs.is_remote || |
| 42 | !strcmp(fs.typename, "msdos") || |
| 43 | !strcmp(fs.typename, "ntfs")) { |
| 44 | free(fs.typename); |
| 45 | return FSMONITOR_REASON_NOSOCKETS; |
| 46 | } |
| 47 | |
| 48 | free(fs.typename); |
| 49 | return FSMONITOR_REASON_OK; |
| 50 | } |
| 51 | |
| 52 | enum fsmonitor_reason fsm_os__incompatible(struct repository *r, int ipc) |
| 53 | { |
| 54 | enum fsmonitor_reason reason; |
| 55 | |
| 56 | if (ipc) { |
| 57 | reason = check_uds_volume(r); |
| 58 | if (reason != FSMONITOR_REASON_OK) |
| 59 | return reason; |
| 60 | } |
| 61 | |
| 62 | return FSMONITOR_REASON_OK; |
| 63 | } |