git
/
common-main.c
92 строки · 2.3 Кб
1#define USE_THE_REPOSITORY_VARIABLE2
3#include "git-compat-util.h"4#include "exec-cmd.h"5#include "gettext.h"6#include "attr.h"7#include "repository.h"8#include "setup.h"9#include "strbuf.h"10#include "trace2.h"11
12/*
13* Many parts of Git have subprograms communicate via pipe, expect the
14* upstream of a pipe to die with SIGPIPE when the downstream of a
15* pipe does not need to read all that is written. Some third-party
16* programs that ignore or block SIGPIPE for their own reason forget
17* to restore SIGPIPE handling to the default before spawning Git and
18* break this carefully orchestrated machinery.
19*
20* Restore the way SIGPIPE is handled to default, which is what we
21* expect.
22*/
23static void restore_sigpipe_to_default(void)24{
25sigset_t unblock;26
27sigemptyset(&unblock);28sigaddset(&unblock, SIGPIPE);29sigprocmask(SIG_UNBLOCK, &unblock, NULL);30signal(SIGPIPE, SIG_DFL);31}
32
33int main(int argc, const char **argv)34{
35int result;36struct strbuf tmp = STRBUF_INIT;37
38trace2_initialize_clock();39
40/*41* Always open file descriptors 0/1/2 to avoid clobbering files
42* in die(). It also avoids messing up when the pipes are dup'ed
43* onto stdin/stdout/stderr in the child processes we spawn.
44*/
45sanitize_stdfds();46restore_sigpipe_to_default();47
48git_resolve_executable_dir(argv[0]);49
50setlocale(LC_CTYPE, "");51git_setup_gettext();52
53initialize_repository(the_repository);54
55attr_start();56
57trace2_initialize();58trace2_cmd_start(argv);59trace2_collect_process_info(TRACE2_PROCESS_INFO_STARTUP);60
61if (!strbuf_getcwd(&tmp))62tmp_original_cwd = strbuf_detach(&tmp, NULL);63
64result = cmd_main(argc, argv);65
66/* Not exit(3), but a wrapper calling our common_exit() */67exit(result);68}
69
70static void check_bug_if_BUG(void)71{
72if (!bug_called_must_BUG)73return;74BUG("on exit(): had bug() call(s) in this process without explicit BUG_if_bug()");75}
76
77/* We wrap exit() to call common_exit() in git-compat-util.h */
78int common_exit(const char *file, int line, int code)79{
80/*81* For non-POSIX systems: Take the lowest 8 bits of the "code"
82* to e.g. turn -1 into 255. On a POSIX system this is
83* redundant, see exit(3) and wait(2), but as it doesn't harm
84* anything there we don't need to guard this with an "ifdef".
85*/
86code &= 0xff;87
88check_bug_if_BUG();89trace2_cmd_exit_fl(file, line, code);90
91return code;92}
93