1 #include "git-compat-util.h"
3 #include "fsmonitor-ll.h"
4 #include "fsmonitor-ipc.h"
5 #include "fsmonitor-settings.h"
6 #include "fsmonitor-path-utils.h"
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
20 * FAT32 and NTFS working directories are problematic too.
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.
27 static enum fsmonitor_reason
check_uds_volume(struct repository
*r
)
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
));
34 if (fsmonitor__get_fs_info(dirname(path
.buf
), &fs
) == -1) {
35 strbuf_release(&path
);
36 return FSMONITOR_REASON_ERROR
;
39 strbuf_release(&path
);
42 !strcmp(fs
.typename
, "msdos") ||
43 !strcmp(fs
.typename
, "ntfs")) {
45 return FSMONITOR_REASON_NOSOCKETS
;
49 return FSMONITOR_REASON_OK
;
52 enum fsmonitor_reason
fsm_os__incompatible(struct repository
*r
, int ipc
)
54 enum fsmonitor_reason reason
;
57 reason
= check_uds_volume(r
);
58 if (reason
!= FSMONITOR_REASON_OK
)
62 return FSMONITOR_REASON_OK
;