-
Notifications
You must be signed in to change notification settings - Fork 25.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
235986b
commit f2d6291
Showing
7 changed files
with
142 additions
and
119 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
#include "cache.h" | ||
#include "config.h" | ||
#include "fsmonitor.h" | ||
#include "fsm-health.h" | ||
#include "fsmonitor--daemon.h" | ||
|
||
int fsm_health__ctor(struct fsmonitor_daemon_state *state) | ||
{ | ||
return 0; | ||
} | ||
|
||
void fsm_health__dtor(struct fsmonitor_daemon_state *state) | ||
{ | ||
return; | ||
} | ||
|
||
void fsm_health__loop(struct fsmonitor_daemon_state *state) | ||
{ | ||
return; | ||
} | ||
|
||
void fsm_health__stop_async(struct fsmonitor_daemon_state *state) | ||
{ | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,56 +1 @@ | ||
#include "git-compat-util.h" | ||
#include "config.h" | ||
#include "gettext.h" | ||
#include "hex.h" | ||
#include "path.h" | ||
#include "repository.h" | ||
#include "strbuf.h" | ||
#include "fsmonitor-ll.h" | ||
#include "fsmonitor-ipc.h" | ||
#include "fsmonitor-path-utils.h" | ||
|
||
static GIT_PATH_FUNC(fsmonitor_ipc__get_default_path, "fsmonitor--daemon.ipc") | ||
|
||
const char *fsmonitor_ipc__get_path(struct repository *r) | ||
{ | ||
static const char *ipc_path = NULL; | ||
git_SHA_CTX sha1ctx; | ||
char *sock_dir = NULL; | ||
struct strbuf ipc_file = STRBUF_INIT; | ||
unsigned char hash[GIT_MAX_RAWSZ]; | ||
|
||
if (!r) | ||
BUG("No repository passed into fsmonitor_ipc__get_path"); | ||
|
||
if (ipc_path) | ||
return ipc_path; | ||
|
||
|
||
/* By default the socket file is created in the .git directory */ | ||
if (fsmonitor__is_fs_remote(r->gitdir) < 1) { | ||
ipc_path = fsmonitor_ipc__get_default_path(); | ||
return ipc_path; | ||
} | ||
|
||
git_SHA1_Init(&sha1ctx); | ||
git_SHA1_Update(&sha1ctx, r->worktree, strlen(r->worktree)); | ||
git_SHA1_Final(hash, &sha1ctx); | ||
|
||
repo_config_get_string(r, "fsmonitor.socketdir", &sock_dir); | ||
|
||
/* Create the socket file in either socketDir or $HOME */ | ||
if (sock_dir && *sock_dir) { | ||
strbuf_addf(&ipc_file, "%s/.git-fsmonitor-%s", | ||
sock_dir, hash_to_hex(hash)); | ||
} else { | ||
strbuf_addf(&ipc_file, "~/.git-fsmonitor-%s", hash_to_hex(hash)); | ||
} | ||
free(sock_dir); | ||
|
||
ipc_path = interpolate_path(ipc_file.buf, 1); | ||
if (!ipc_path) | ||
die(_("Invalid path: %s"), ipc_file.buf); | ||
|
||
strbuf_release(&ipc_file); | ||
return ipc_path; | ||
} | ||
#include "fsm-ipc-unix.c" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
#include "fsm-ipc-unix.c" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
#include "cache.h" | ||
#include "config.h" | ||
#include "hex.h" | ||
#include "strbuf.h" | ||
#include "fsmonitor.h" | ||
#include "fsmonitor-ipc.h" | ||
#include "fsmonitor-path-utils.h" | ||
|
||
static GIT_PATH_FUNC(fsmonitor_ipc__get_default_path, "fsmonitor--daemon.ipc") | ||
|
||
const char *fsmonitor_ipc__get_path(struct repository *r) | ||
{ | ||
static const char *ipc_path = NULL; | ||
git_SHA_CTX sha1ctx; | ||
char *sock_dir = NULL; | ||
struct strbuf ipc_file = STRBUF_INIT; | ||
unsigned char hash[GIT_MAX_RAWSZ]; | ||
|
||
if (!r) | ||
BUG("No repository passed into fsmonitor_ipc__get_path"); | ||
|
||
if (ipc_path) | ||
return ipc_path; | ||
|
||
|
||
/* By default the socket file is created in the .git directory */ | ||
if (fsmonitor__is_fs_remote(r->gitdir) < 1) { | ||
ipc_path = fsmonitor_ipc__get_default_path(); | ||
return ipc_path; | ||
} | ||
|
||
git_SHA1_Init(&sha1ctx); | ||
git_SHA1_Update(&sha1ctx, r->worktree, strlen(r->worktree)); | ||
git_SHA1_Final(hash, &sha1ctx); | ||
|
||
repo_config_get_string(r, "fsmonitor.socketdir", &sock_dir); | ||
|
||
/* Create the socket file in either socketDir or $HOME */ | ||
if (sock_dir && *sock_dir) { | ||
strbuf_addf(&ipc_file, "%s/.git-fsmonitor-%s", | ||
sock_dir, hash_to_hex(hash)); | ||
} else { | ||
strbuf_addf(&ipc_file, "~/.git-fsmonitor-%s", hash_to_hex(hash)); | ||
} | ||
free(sock_dir); | ||
|
||
ipc_path = interpolate_path(ipc_file.buf, 1); | ||
if (!ipc_path) | ||
die(_("Invalid path: %s"), ipc_file.buf); | ||
|
||
strbuf_release(&ipc_file); | ||
return ipc_path; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,63 +1 @@ | ||
#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; | ||
} | ||
#include "fsm-settings-unix.c" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
#include "fsm-settings-unix.c" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
#include "fsmonitor.h" | ||
#include "fsmonitor-ipc.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_addstr(&path, ipc_path); | ||
|
||
if (fsmonitor__get_fs_info(dirname(path.buf), &fs) == -1) { | ||
free(fs.typename); | ||
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; | ||
} |