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