/src/git/compat/fsmonitor/fsm-settings-unix.c
Line | Count | Source |
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 | 0 | { |
29 | 0 | struct fs_info fs; |
30 | 0 | const char *ipc_path = fsmonitor_ipc__get_path(r); |
31 | 0 | struct strbuf path = STRBUF_INIT; |
32 | 0 | strbuf_add(&path, ipc_path, strlen(ipc_path)); |
33 | |
|
34 | 0 | if (fsmonitor__get_fs_info(dirname(path.buf), &fs) == -1) { |
35 | 0 | strbuf_release(&path); |
36 | 0 | return FSMONITOR_REASON_ERROR; |
37 | 0 | } |
38 | | |
39 | 0 | strbuf_release(&path); |
40 | |
|
41 | 0 | if (fs.is_remote || |
42 | 0 | !strcmp(fs.typename, "msdos") || |
43 | 0 | !strcmp(fs.typename, "ntfs")) { |
44 | 0 | free(fs.typename); |
45 | 0 | return FSMONITOR_REASON_NOSOCKETS; |
46 | 0 | } |
47 | | |
48 | 0 | free(fs.typename); |
49 | 0 | return FSMONITOR_REASON_OK; |
50 | 0 | } |
51 | | |
52 | | enum fsmonitor_reason fsm_os__incompatible(struct repository *r, int ipc) |
53 | 0 | { |
54 | 0 | enum fsmonitor_reason reason; |
55 | |
|
56 | 0 | if (ipc) { |
57 | 0 | reason = check_uds_volume(r); |
58 | 0 | if (reason != FSMONITOR_REASON_OK) |
59 | 0 | return reason; |
60 | 0 | } |
61 | | |
62 | 0 | return FSMONITOR_REASON_OK; |
63 | 0 | } |