{"thread":{"id":"36808","subject":"[PATCH v3 0/9] replace signal() with sigaction()","startedAt":"2014-06-01T18:10:09Z","lastAt":"2014-06-02T20:25:18Z","messageCount":15,"participants":["Jeremiah Mahler","Johannes Sixt","Junio C Hamano"],"isPatch":true,"patchVersion":3,"patchTotal":9},"messages":[{"id":"243099","messageId":"cover.1401645403.git.jmmahler@gmail.com","threadId":"36808","inReplyTo":null,"subject":"[PATCH v3 0/9] replace signal() with sigaction()","fromName":"Jeremiah Mahler","fromEmail":"jmmahler@gmail.com","sentAt":"2014-06-01T18:10:09Z","receivedAt":"2014-06-01T18:10:09Z","isPatch":true,"sender":{"key":"jmmahler@gmail.com","avatar":"https://avatars.githubusercontent.com/u/154028?v=4"},"body":"This is version 3 of the patch set to convert signal(2) to sigaction(2)\n(previous discussion [1]).\n\n[1]: http://marc.info/?l=git&m=140148352416926&w=2\n\nChanges in this revision include:\n\n  - Using NULL pointers instead of 0 as per the\n    Documentation/CodingGuidlines pointed out by Chris Packham.\n\n    sigaction(SIGCHLD, &sa, NULL);\n\n  - Conversion of all remaining files which used signal().\n\n  - sigchain.c required the most changes.  Both the old signal handler\n    was used and the return value from signal() was being checked.\n    signal() would return the previous error handler which would be\n    SIG_ERR if an error occurred.  sigaction() just returns -1 in this\n    case.\n\nJeremiah Mahler (9):\n  compat/mingw.c: expand MinGW support for sigaction\n  connect.c: replace signal() with sigaction()\n  progress.c: replace signal() with sigaction()\n  write_or_die.c: replace signal() with sigaction()\n  daemon.c: replace signal() with sigaction()\n  builtin/log.c: replace signal() with sigaction()\n  builtin/merge-index.c: replace signal() with sigaction()\n  builtin/verify-tag.c: replace signal() with sigaction()\n  sigchain.c: replace signal() with sigaction()\n\n builtin/log.c         |  6 +++++-\n builtin/merge-index.c |  5 ++++-\n builtin/verify-tag.c  |  5 ++++-\n compat/mingw.c        |  9 +++++----\n connect.c             |  5 ++++-\n daemon.c              | 16 +++++++++++++---\n progress.c            |  6 +++++-\n sigchain.c            | 14 +++++++++++---\n write_or_die.c        |  6 +++++-\n 9 files changed, 56 insertions(+), 16 deletions(-)\n\n-- \n2.0.0.8.g7bf6e1f.dirty\n"},{"id":"243100","messageId":"d5fc7d72b2d51d1b90fb7f238eff120cb4c6d0e7.1401645403.git.jmmahler@gmail.com","threadId":"36808","inReplyTo":"cover.1401645403.git.jmmahler@gmail.com","subject":"[PATCH v3 1/9] compat/mingw.c: expand MinGW support for sigaction","fromName":"Jeremiah Mahler","fromEmail":"jmmahler@gmail.com","sentAt":"2014-06-01T18:10:10Z","receivedAt":"2014-06-01T18:10:10Z","isPatch":true,"sender":{"key":"jmmahler@gmail.com","avatar":"https://avatars.githubusercontent.com/u/154028?v=4"},"body":"Due to portability issues across UNIX versions sigaction(2) should be used\ninstead of signal(2).\n\nFrom the signal(2) man page:\n\n  The behavior of signal() varies across UNIX versions, and has also var‐\n  ied historically across different versions of Linux.   Avoid  its  use:\n  use sigaction(2) instead.\n\nUnfortunately MinGW under Windows has limited support for signal and no\nsupport for sigaction.  And this prevents sigaction from being used across\nthe entire Git project.\n\nIn compat/mingw.c there is a faux sigaction function but it only supports\nSIGALARM.  Hence the need for continuing to use signal() in other cases.\n\nThis patch expands the faux sigaction function so that it calls signal in\ncases other than SIGALRM.  Now sigaction can be used across the entire Git\nproject and MinGW will still work with signal as it did before.\n\nSigned-off-by: Jeremiah Mahler <jmmahler@gmail.com>\n---\n compat/mingw.c | 9 +++++----\n 1 file changed, 5 insertions(+), 4 deletions(-)\n\ndiff --git a/compat/mingw.c b/compat/mingw.c\nindex e9892f8..e504cef 100644\n--- a/compat/mingw.c\n+++ b/compat/mingw.c\n@@ -1651,14 +1651,15 @@ int setitimer(int type, struct itimerval *in, struct itimerval *out)\n \n int sigaction(int sig, struct sigaction *in, struct sigaction *out)\n {\n-\tif (sig != SIGALRM)\n-\t\treturn errno = EINVAL,\n-\t\t\terror(\"sigaction only implemented for SIGALRM\");\n \tif (out != NULL)\n \t\treturn errno = EINVAL,\n \t\t\terror(\"sigaction: param 3 != NULL not implemented\");\n \n-\ttimer_fn = in->sa_handler;\n+\tif (sig == SIGALRM)\n+\t\ttimer_fn = in->sa_handler;\n+\telse\n+\t\tsignal(sig, in->sa_handler);\n+\n \treturn 0;\n }\n \n-- \n2.0.0.8.g7bf6e1f.dirty\n"},{"id":"243101","messageId":"01f78358696a7d9a6a45176018d1c5c72ba99a46.1401645403.git.jmmahler@gmail.com","threadId":"36808","inReplyTo":"cover.1401645403.git.jmmahler@gmail.com","subject":"[PATCH v3 2/9] connect.c: replace signal() with sigaction()","fromName":"Jeremiah Mahler","fromEmail":"jmmahler@gmail.com","sentAt":"2014-06-01T18:10:11Z","receivedAt":"2014-06-01T18:10:11Z","isPatch":true,"sender":{"key":"jmmahler@gmail.com","avatar":"https://avatars.githubusercontent.com/u/154028?v=4"},"body":"From the signal(2) man page:\n\n  The behavior of signal() varies across UNIX versions, and has also var‐\n  ied historically across different versions of Linux.   Avoid  its  use:\n  use sigaction(2) instead.\n\nReplaced signal() with sigaction() in connect.c\n\nSigned-off-by: Jeremiah Mahler <jmmahler@gmail.com>\n---\n connect.c | 5 ++++-\n 1 file changed, 4 insertions(+), 1 deletion(-)\n\ndiff --git a/connect.c b/connect.c\nindex a983d06..1dc51b2 100644\n--- a/connect.c\n+++ b/connect.c\n@@ -665,11 +665,14 @@ struct child_process *git_connect(int fd[2], const char *url,\n \tenum protocol protocol;\n \tconst char **arg;\n \tstruct strbuf cmd = STRBUF_INIT;\n+\tstruct sigaction sa;\n \n \t/* Without this we cannot rely on waitpid() to tell\n \t * what happened to our children.\n \t */\n-\tsignal(SIGCHLD, SIG_DFL);\n+\tmemset(&sa, 0, sizeof(sa));\n+\tsa.sa_handler = SIG_DFL;\n+\tsigaction(SIGCHLD, &sa, NULL);\n \n \tprotocol = parse_connect_url(url, &hostandport, &path);\n \tif (flags & CONNECT_DIAG_URL) {\n-- \n2.0.0.8.g7bf6e1f.dirty\n"},{"id":"243103","messageId":"87574ab0b6951616ab8ce78c8d9da1b5f0a3fddc.1401645403.git.jmmahler@gmail.com","threadId":"36808","inReplyTo":"cover.1401645403.git.jmmahler@gmail.com","subject":"[PATCH v3 3/9] progress.c: replace signal() with sigaction()","fromName":"Jeremiah Mahler","fromEmail":"jmmahler@gmail.com","sentAt":"2014-06-01T18:10:12Z","receivedAt":"2014-06-01T18:10:12Z","isPatch":true,"sender":{"key":"jmmahler@gmail.com","avatar":"https://avatars.githubusercontent.com/u/154028?v=4"},"body":"From the signal(2) man page:\n\n  The behavior of signal() varies across UNIX versions, and has also var‐\n  ied historically across different versions of Linux.   Avoid  its  use:\n  use sigaction(2) instead.\n\nReplaced signal() with sigaction() in progress.c\n\nSigned-off-by: Jeremiah Mahler <jmmahler@gmail.com>\n---\n progress.c | 6 +++++-\n 1 file changed, 5 insertions(+), 1 deletion(-)\n\ndiff --git a/progress.c b/progress.c\nindex 261314e..ff676bc 100644\n--- a/progress.c\n+++ b/progress.c\n@@ -66,8 +66,12 @@ static void set_progress_signal(void)\n static void clear_progress_signal(void)\n {\n \tstruct itimerval v = {{0,},};\n+\tstruct sigaction sa;\n+\n \tsetitimer(ITIMER_REAL, &v, NULL);\n-\tsignal(SIGALRM, SIG_IGN);\n+\tmemset(&sa, 0, sizeof(sa));\n+\tsa.sa_handler = SIG_IGN;\n+\tsigaction(SIGALRM, &sa, NULL);\n \tprogress_update = 0;\n }\n \n-- \n2.0.0.8.g7bf6e1f.dirty\n"},{"id":"243102","messageId":"b2dc32a2f9f42b9be5cf7aba47170f204ce43d90.1401645403.git.jmmahler@gmail.com","threadId":"36808","inReplyTo":"cover.1401645403.git.jmmahler@gmail.com","subject":"[PATCH v3 4/9] write_or_die.c: replace signal() with sigaction()","fromName":"Jeremiah Mahler","fromEmail":"jmmahler@gmail.com","sentAt":"2014-06-01T18:10:13Z","receivedAt":"2014-06-01T18:10:13Z","isPatch":true,"sender":{"key":"jmmahler@gmail.com","avatar":"https://avatars.githubusercontent.com/u/154028?v=4"},"body":"From the signal(2) man page:\n\n  The behavior of signal() varies across UNIX versions, and has also var‐\n  ied historically across different versions of Linux.   Avoid  its  use:\n  use sigaction(2) instead.\n\nReplaced signal() with sigaction() in write_or_die.c\n\nSigned-off-by: Jeremiah Mahler <jmmahler@gmail.com>\n---\n write_or_die.c | 6 +++++-\n 1 file changed, 5 insertions(+), 1 deletion(-)\n\ndiff --git a/write_or_die.c b/write_or_die.c\nindex b50f99a..f5fdec8 100644\n--- a/write_or_die.c\n+++ b/write_or_die.c\n@@ -2,8 +2,12 @@\n \n static void check_pipe(int err)\n {\n+\tstruct sigaction sa;\n+\n \tif (err == EPIPE) {\n-\t\tsignal(SIGPIPE, SIG_DFL);\n+\t\tmemset(&sa, 0, sizeof(sa));\n+\t\tsa.sa_handler = SIG_DFL;\n+\t\tsigaction(SIGPIPE, &sa, NULL);\n \t\traise(SIGPIPE);\n \t\t/* Should never happen, but just in case... */\n \t\texit(141);\n-- \n2.0.0.8.g7bf6e1f.dirty\n"},{"id":"243104","messageId":"77e2c9ce430a7682371ab76d151aab25201c68dd.1401645403.git.jmmahler@gmail.com","threadId":"36808","inReplyTo":"cover.1401645403.git.jmmahler@gmail.com","subject":"[PATCH v3 5/9] daemon.c: replace signal() with sigaction()","fromName":"Jeremiah Mahler","fromEmail":"jmmahler@gmail.com","sentAt":"2014-06-01T18:10:14Z","receivedAt":"2014-06-01T18:10:14Z","isPatch":true,"sender":{"key":"jmmahler@gmail.com","avatar":"https://avatars.githubusercontent.com/u/154028?v=4"},"body":"From the signal(2) man page:\n\n  The behavior of signal() varies across UNIX versions, and has also var‐\n  ied historically across different versions of Linux.   Avoid  its  use:\n  use sigaction(2) instead.\n\nReplaced signal() with sigaction() in daemon.c\n\nSigned-off-by: Jeremiah Mahler <jmmahler@gmail.com>\n---\n daemon.c | 16 +++++++++++++---\n 1 file changed, 13 insertions(+), 3 deletions(-)\n\ndiff --git a/daemon.c b/daemon.c\nindex eba1255..615426e 100644\n--- a/daemon.c\n+++ b/daemon.c\n@@ -322,6 +322,7 @@ static int run_service(char *dir, struct daemon_service *service)\n {\n \tconst char *path;\n \tint enabled = service->enabled;\n+\tstruct sigaction sa;\n \n \tloginfo(\"Request %s for '%s'\", service->name, dir);\n \n@@ -376,7 +377,9 @@ static int run_service(char *dir, struct daemon_service *service)\n \t * We'll ignore SIGTERM from now on, we have a\n \t * good client.\n \t */\n-\tsignal(SIGTERM, SIG_IGN);\n+\tmemset(&sa, 0, sizeof(sa));\n+\tsa.sa_handler = SIG_IGN;\n+\tsigaction(SIGTERM, &sa, NULL);\n \n \treturn service->fn();\n }\n@@ -788,12 +791,16 @@ static void handle(int incoming, struct sockaddr *addr, socklen_t addrlen)\n \n static void child_handler(int signo)\n {\n+\tstruct sigaction sa;\n+\n \t/*\n \t * Otherwise empty handler because systemcalls will get interrupted\n \t * upon signal receipt\n \t * SysV needs the handler to be rearmed\n \t */\n-\tsignal(SIGCHLD, child_handler);\n+\tmemset(&sa, 0, sizeof(sa));\n+\tsa.sa_handler = child_handler;\n+\tsigaction(SIGCHLD, &sa, NULL);\n }\n \n static int set_reuse_addr(int sockfd)\n@@ -996,6 +1003,7 @@ static int service_loop(struct socketlist *socklist)\n {\n \tstruct pollfd *pfd;\n \tint i;\n+\tstruct sigaction sa;\n \n \tpfd = xcalloc(socklist->nr, sizeof(struct pollfd));\n \n@@ -1004,7 +1012,9 @@ static int service_loop(struct socketlist *socklist)\n \t\tpfd[i].events = POLLIN;\n \t}\n \n-\tsignal(SIGCHLD, child_handler);\n+\tmemset(&sa, 0, sizeof(sa));\n+\tsa.sa_handler = child_handler;\n+\tsigaction(SIGCHLD, &sa, NULL);\n \n \tfor (;;) {\n \t\tint i;\n-- \n2.0.0.8.g7bf6e1f.dirty\n"},{"id":"243105","messageId":"089731f7d0287838646c52e14a8c4a8bc41dea7d.1401645403.git.jmmahler@gmail.com","threadId":"36808","inReplyTo":"cover.1401645403.git.jmmahler@gmail.com","subject":"[PATCH v3 6/9] builtin/log.c: replace signal() with sigaction()","fromName":"Jeremiah Mahler","fromEmail":"jmmahler@gmail.com","sentAt":"2014-06-01T18:10:15Z","receivedAt":"2014-06-01T18:10:15Z","isPatch":true,"sender":{"key":"jmmahler@gmail.com","avatar":"https://avatars.githubusercontent.com/u/154028?v=4"},"body":"From the signal(2) man page:\n\n  The behavior of signal() varies across UNIX versions, and has also var‐\n  ied historically across different versions of Linux.   Avoid  its  use:\n  use sigaction(2) instead.\n\nReplaced signal() with sigaction() in builtin/log.c\n\nSigned-off-by: Jeremiah Mahler <jmmahler@gmail.com>\n---\n builtin/log.c | 6 +++++-\n 1 file changed, 5 insertions(+), 1 deletion(-)\n\ndiff --git a/builtin/log.c b/builtin/log.c\nindex 39e8836..f1deea1 100644\n--- a/builtin/log.c\n+++ b/builtin/log.c\n@@ -315,7 +315,11 @@ static void setup_early_output(struct rev_info *rev)\n static void finish_early_output(struct rev_info *rev)\n {\n \tint n = estimate_commit_count(rev, rev->commits);\n-\tsignal(SIGALRM, SIG_IGN);\n+\tstruct sigaction sa;\n+\n+\tmemset(&sa, 0, sizeof(sa));\n+\tsa.sa_handler = SIG_IGN;\n+\tsigaction(SIGALRM, &sa, NULL);\n \tshow_early_header(rev, \"done\", n);\n }\n \n-- \n2.0.0.8.g7bf6e1f.dirty\n"},{"id":"243106","messageId":"e74a8efbb3a967c785fc282e5c4033dade15ebfd.1401645403.git.jmmahler@gmail.com","threadId":"36808","inReplyTo":"cover.1401645403.git.jmmahler@gmail.com","subject":"[PATCH v3 7/9] builtin/merge-index.c: replace signal() with sigaction()","fromName":"Jeremiah Mahler","fromEmail":"jmmahler@gmail.com","sentAt":"2014-06-01T18:10:16Z","receivedAt":"2014-06-01T18:10:16Z","isPatch":true,"sender":{"key":"jmmahler@gmail.com","avatar":"https://avatars.githubusercontent.com/u/154028?v=4"},"body":"From the signal(2) man page:\n\n  The behavior of signal() varies across UNIX versions, and has also var‐\n  ied historically across different versions of Linux.   Avoid  its  use:\n  use sigaction(2) instead.\n\nReplaced signal() with sigaction() in builtin/merge-index.c\n\nSigned-off-by: Jeremiah Mahler <jmmahler@gmail.com>\n---\n builtin/merge-index.c | 5 ++++-\n 1 file changed, 4 insertions(+), 1 deletion(-)\n\ndiff --git a/builtin/merge-index.c b/builtin/merge-index.c\nindex b416d92..25db374 100644\n--- a/builtin/merge-index.c\n+++ b/builtin/merge-index.c\n@@ -68,11 +68,14 @@ static void merge_all(void)\n int cmd_merge_index(int argc, const char **argv, const char *prefix)\n {\n \tint i, force_file = 0;\n+\tstruct sigaction sa;\n \n \t/* Without this we cannot rely on waitpid() to tell\n \t * what happened to our children.\n \t */\n-\tsignal(SIGCHLD, SIG_DFL);\n+\tmemset(&sa, 0, sizeof(sa));\n+\tsa.sa_handler = SIG_DFL;\n+\tsigaction(SIGCHLD, &sa, NULL);\n \n \tif (argc < 3)\n \t\tusage(\"git merge-index [-o] [-q] <merge-program> (-a | [--] <filename>*)\");\n-- \n2.0.0.8.g7bf6e1f.dirty\n"},{"id":"243107","messageId":"7bf6e1f7575e810bf0358346c7fa7b1eb846895a.1401645403.git.jmmahler@gmail.com","threadId":"36808","inReplyTo":"cover.1401645403.git.jmmahler@gmail.com","subject":"[PATCH v3 8/9] builtin/verify-tag.c: replace signal() with sigaction()","fromName":"Jeremiah Mahler","fromEmail":"jmmahler@gmail.com","sentAt":"2014-06-01T18:10:17Z","receivedAt":"2014-06-01T18:10:17Z","isPatch":true,"sender":{"key":"jmmahler@gmail.com","avatar":"https://avatars.githubusercontent.com/u/154028?v=4"},"body":"From the signal(2) man page:\n\n  The behavior of signal() varies across UNIX versions, and has also var‐\n  ied historically across different versions of Linux.   Avoid  its  use:\n  use sigaction(2) instead.\n\nReplaced signal() with sigaction() in builtin/verify-tag.c\n\nSigned-off-by: Jeremiah Mahler <jmmahler@gmail.com>\n---\n builtin/verify-tag.c | 5 ++++-\n 1 file changed, 4 insertions(+), 1 deletion(-)\n\ndiff --git a/builtin/verify-tag.c b/builtin/verify-tag.c\nindex 9cdf332..d5ccbad 100644\n--- a/builtin/verify-tag.c\n+++ b/builtin/verify-tag.c\n@@ -73,6 +73,7 @@ int cmd_verify_tag(int argc, const char **argv, const char *prefix)\n \t\tOPT__VERBOSE(&verbose, N_(\"print tag contents\")),\n \t\tOPT_END()\n \t};\n+\tstruct sigaction sa;\n \n \tgit_config(git_verify_tag_config, NULL);\n \n@@ -83,7 +84,9 @@ int cmd_verify_tag(int argc, const char **argv, const char *prefix)\n \n \t/* sometimes the program was terminated because this signal\n \t * was received in the process of writing the gpg input: */\n-\tsignal(SIGPIPE, SIG_IGN);\n+\tmemset(&sa, 0, sizeof(sa));\n+\tsa.sa_handler = SIG_IGN;\n+\tsigaction(SIGPIPE, &sa, NULL);\n \twhile (i < argc)\n \t\tif (verify_tag(argv[i++], verbose))\n \t\t\thad_error = 1;\n-- \n2.0.0.8.g7bf6e1f.dirty\n"},{"id":"243108","messageId":"06d9d4d29fc7ada8d6f4f3f1f1e3e2a764ba7c67.1401645403.git.jmmahler@gmail.com","threadId":"36808","inReplyTo":"cover.1401645403.git.jmmahler@gmail.com","subject":"[PATCH v3 9/9] sigchain.c: replace signal() with sigaction()","fromName":"Jeremiah Mahler","fromEmail":"jmmahler@gmail.com","sentAt":"2014-06-01T18:10:18Z","receivedAt":"2014-06-01T18:10:18Z","isPatch":true,"sender":{"key":"jmmahler@gmail.com","avatar":"https://avatars.githubusercontent.com/u/154028?v=4"},"body":"From the signal(2) man page:\n\n  The behavior of signal() varies across UNIX versions, and has also var‐\n  ied historically across different versions of Linux.   Avoid  its  use:\n  use sigaction(2) instead.\n\nReplaced signal() with sigaction() in sigchain.c\n\nSigned-off-by: Jeremiah Mahler <jmmahler@gmail.com>\n---\n sigchain.c | 14 +++++++++++---\n 1 file changed, 11 insertions(+), 3 deletions(-)\n\ndiff --git a/sigchain.c b/sigchain.c\nindex 1118b99..deab262 100644\n--- a/sigchain.c\n+++ b/sigchain.c\n@@ -19,11 +19,16 @@ static void check_signum(int sig)\n int sigchain_push(int sig, sigchain_fun f)\n {\n \tstruct sigchain_signal *s = signals + sig;\n+\tstruct sigaction sa, sa_old;\n+\tint result;\n \tcheck_signum(sig);\n \n \tALLOC_GROW(s->old, s->n + 1, s->alloc);\n-\ts->old[s->n] = signal(sig, f);\n-\tif (s->old[s->n] == SIG_ERR)\n+\tmemset(&sa, 0, sizeof(sa));\n+\tsa.sa_handler = f;\n+\tresult = sigaction(sig, &sa, &sa_old);\n+\ts->old[s->n] = sa_old.sa_handler;\n+\tif (result == -1)\n \t\treturn -1;\n \ts->n++;\n \treturn 0;\n@@ -32,11 +37,14 @@ int sigchain_push(int sig, sigchain_fun f)\n int sigchain_pop(int sig)\n {\n \tstruct sigchain_signal *s = signals + sig;\n+\tstruct sigaction sa, sa_old;\n \tcheck_signum(sig);\n \tif (s->n < 1)\n \t\treturn 0;\n \n-\tif (signal(sig, s->old[s->n - 1]) == SIG_ERR)\n+\tmemset(&sa, 0, sizeof(sa));\n+\tsa.sa_handler = s->old[s->n - 1];\n+\tif (sigaction(sig, &sa, &sa_old) == -1)\n \t\treturn -1;\n \ts->n--;\n \treturn 0;\n-- \n2.0.0.8.g7bf6e1f.dirty\n"},{"id":"243115","messageId":"538C124F.2010103@viscovery.net","threadId":"36808","inReplyTo":"d5fc7d72b2d51d1b90fb7f238eff120cb4c6d0e7.1401645403.git.jmmahler@gmail.com","subject":"Re: [PATCH v3 1/9] compat/mingw.c: expand MinGW support for sigaction","fromName":"Johannes Sixt","fromEmail":"j.sixt@viscovery.net","sentAt":"2014-06-02T05:57:35Z","receivedAt":"2014-06-02T05:57:35Z","isPatch":true,"sender":{"key":"j6t@kdbg.org","avatar":"https://avatars.githubusercontent.com/u/14810926?v=4"},"body":"Am 6/1/2014 20:10, schrieb Jeremiah Mahler:\n> Due to portability issues across UNIX versions sigaction(2) should be used\n> instead of signal(2).\n> \n>>From the signal(2) man page:\n> \n>   The behavior of signal() varies across UNIX versions, and has also var‐\n>   ied historically across different versions of Linux.   Avoid  its  use:\n>   use sigaction(2) instead.\n> \n> Unfortunately MinGW under Windows has limited support for signal and no\n> support for sigaction.  And this prevents sigaction from being used across\n> the entire Git project.\n> \n> In compat/mingw.c there is a faux sigaction function but it only supports\n> SIGALARM.  Hence the need for continuing to use signal() in other cases.\n> \n> This patch expands the faux sigaction function so that it calls signal in\n> cases other than SIGALRM.  Now sigaction can be used across the entire Git\n> project and MinGW will still work with signal as it did before.\n> \n> Signed-off-by: Jeremiah Mahler <jmmahler@gmail.com>\n> ---\n>  compat/mingw.c | 9 +++++----\n>  1 file changed, 5 insertions(+), 4 deletions(-)\n> \n> diff --git a/compat/mingw.c b/compat/mingw.c\n> index e9892f8..e504cef 100644\n> --- a/compat/mingw.c\n> +++ b/compat/mingw.c\n> @@ -1651,14 +1651,15 @@ int setitimer(int type, struct itimerval *in, struct itimerval *out)\n>  \n>  int sigaction(int sig, struct sigaction *in, struct sigaction *out)\n>  {\n> -\tif (sig != SIGALRM)\n> -\t\treturn errno = EINVAL,\n> -\t\t\terror(\"sigaction only implemented for SIGALRM\");\n>  \tif (out != NULL)\n>  \t\treturn errno = EINVAL,\n>  \t\t\terror(\"sigaction: param 3 != NULL not implemented\");\n\nA fix for this missing implementation is needed before patch 9/9 can be\napplied.\n\n>  \n> -\ttimer_fn = in->sa_handler;\n> +\tif (sig == SIGALRM)\n> +\t\ttimer_fn = in->sa_handler;\n> +\telse\n> +\t\tsignal(sig, in->sa_handler);\n> +\n>  \treturn 0;\n>  }\n>  \n> \n\n-- Hannes\n"},{"id":"243127","messageId":"538C5FD9.1010706@viscovery.net","threadId":"36808","inReplyTo":"cover.1401645403.git.jmmahler@gmail.com","subject":"Re: [PATCH v3 0/9] replace signal() with sigaction()","fromName":"Johannes Sixt","fromEmail":"j.sixt@viscovery.net","sentAt":"2014-06-02T11:28:25Z","receivedAt":"2014-06-02T11:28:25Z","isPatch":true,"sender":{"key":"j6t@kdbg.org","avatar":"https://avatars.githubusercontent.com/u/14810926?v=4"},"body":"Am 6/1/2014 20:10, schrieb Jeremiah Mahler:\n> This is version 3 of the patch set to convert signal(2) to sigaction(2)\n> (previous discussion [1]).\n> \n> [1]: http://marc.info/?l=git&m=140148352416926&w=2\n> \n> Changes in this revision include:\n> \n>   - Using NULL pointers instead of 0 as per the\n>     Documentation/CodingGuidlines pointed out by Chris Packham.\n> \n>     sigaction(SIGCHLD, &sa, NULL);\n> \n>   - Conversion of all remaining files which used signal().\n> \n>   - sigchain.c required the most changes.  Both the old signal handler\n>     was used and the return value from signal() was being checked.\n>     signal() would return the previous error handler which would be\n>     SIG_ERR if an error occurred.  sigaction() just returns -1 in this\n>     case.\n> \n> Jeremiah Mahler (9):\n>   compat/mingw.c: expand MinGW support for sigaction\n>   connect.c: replace signal() with sigaction()\n>   progress.c: replace signal() with sigaction()\n>   write_or_die.c: replace signal() with sigaction()\n>   daemon.c: replace signal() with sigaction()\n>   builtin/log.c: replace signal() with sigaction()\n>   builtin/merge-index.c: replace signal() with sigaction()\n>   builtin/verify-tag.c: replace signal() with sigaction()\n>   sigchain.c: replace signal() with sigaction()\n\nThe series without patch 9/9 works on Windows so far.\n\nWithout patch patch 9/9 and a more complete implementation of sigaction in\ncompat/mingw.c the series misses its goal. But even if you complete it, it\nis IMHO only code churn without practical merits.\n\n-- Hannes\n\n> \n>  builtin/log.c         |  6 +++++-\n>  builtin/merge-index.c |  5 ++++-\n>  builtin/verify-tag.c  |  5 ++++-\n>  compat/mingw.c        |  9 +++++----\n>  connect.c             |  5 ++++-\n>  daemon.c              | 16 +++++++++++++---\n>  progress.c            |  6 +++++-\n>  sigchain.c            | 14 +++++++++++---\n>  write_or_die.c        |  6 +++++-\n>  9 files changed, 56 insertions(+), 16 deletions(-)\n"},{"id":"243129","messageId":"20140602143905.GA2048@hudson.localdomain","threadId":"36808","inReplyTo":"538C5FD9.1010706@viscovery.net","subject":"Re: [PATCH v3 0/9] replace signal() with sigaction()","fromName":"Jeremiah Mahler","fromEmail":"jmmahler@gmail.com","sentAt":"2014-06-02T14:39:05Z","receivedAt":"2014-06-02T14:39:05Z","isPatch":true,"sender":{"key":"jmmahler@gmail.com","avatar":"https://avatars.githubusercontent.com/u/154028?v=4"},"body":"Hannes,\n\nOn Mon, Jun 02, 2014 at 01:28:25PM +0200, Johannes Sixt wrote:\n> Am 6/1/2014 20:10, schrieb Jeremiah Mahler:\n> > This is version 3 of the patch set to convert signal(2) to sigaction(2)\n> > (previous discussion [1]).\n> > \n...\n> >   sigchain.c: replace signal() with sigaction()\n> \n> The series without patch 9/9 works on Windows so far.\n> \n> Without patch patch 9/9 and a more complete implementation of sigaction in\n> compat/mingw.c the series misses its goal. But even if you complete it, it\n> is IMHO only code churn without practical merits.\n> \n> -- Hannes\n> \n\nYou are right, I missed the case where the old signal was used, as is\ndone in sigchain.c.  Sorry about that.\n\nThanks again for looking at my patch.\n\n-- \nJeremiah Mahler\njmmahler@gmail.com\nhttp://github.com/jmahler\n"},{"id":"243145","messageId":"xmqqzjhv3zeu.fsf@gitster.dls.corp.google.com","threadId":"36808","inReplyTo":"538C5FD9.1010706@viscovery.net","subject":"Re: [PATCH v3 0/9] replace signal() with sigaction()","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2014-06-02T19:05:29Z","receivedAt":"2014-06-02T19:05:29Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Johannes Sixt <j.sixt@viscovery.net> writes:\n\n>> Jeremiah Mahler (9):\n>>   compat/mingw.c: expand MinGW support for sigaction\n>>   connect.c: replace signal() with sigaction()\n>>   progress.c: replace signal() with sigaction()\n>>   write_or_die.c: replace signal() with sigaction()\n>>   daemon.c: replace signal() with sigaction()\n>>   builtin/log.c: replace signal() with sigaction()\n>>   builtin/merge-index.c: replace signal() with sigaction()\n>>   builtin/verify-tag.c: replace signal() with sigaction()\n>>   sigchain.c: replace signal() with sigaction()\n>\n> The series without patch 9/9 works on Windows so far.\n>\n> Without patch patch 9/9 and a more complete implementation of sigaction in\n> compat/mingw.c the series misses its goal. But even if you complete it, it\n> is IMHO only code churn without practical merits.\n\nHmm, you sound a bit harsher than you usually do---although I\nsort of share with you the doubt on the practical merits.\n"},{"id":"243156","messageId":"20140602202518.GA2012@hudson.localdomain","threadId":"36808","inReplyTo":"xmqqzjhv3zeu.fsf@gitster.dls.corp.google.com","subject":"Re: [PATCH v3 0/9] replace signal() with sigaction()","fromName":"Jeremiah Mahler","fromEmail":"jmmahler@gmail.com","sentAt":"2014-06-02T20:25:18Z","receivedAt":"2014-06-02T20:25:18Z","isPatch":true,"sender":{"key":"jmmahler@gmail.com","avatar":"https://avatars.githubusercontent.com/u/154028?v=4"},"body":"On Mon, Jun 02, 2014 at 12:05:29PM -0700, Junio C Hamano wrote:\n> Johannes Sixt <j.sixt@viscovery.net> writes:\n> \n> >> Jeremiah Mahler (9):\n> >>   compat/mingw.c: expand MinGW support for sigaction\n> >>   connect.c: replace signal() with sigaction()\n> >>   progress.c: replace signal() with sigaction()\n> >>   write_or_die.c: replace signal() with sigaction()\n> >>   daemon.c: replace signal() with sigaction()\n> >>   builtin/log.c: replace signal() with sigaction()\n> >>   builtin/merge-index.c: replace signal() with sigaction()\n> >>   builtin/verify-tag.c: replace signal() with sigaction()\n> >>   sigchain.c: replace signal() with sigaction()\n> >\n> > The series without patch 9/9 works on Windows so far.\n> >\n> > Without patch patch 9/9 and a more complete implementation of sigaction in\n> > compat/mingw.c the series misses its goal. But even if you complete it, it\n> > is IMHO only code churn without practical merits.\n> \n> Hmm, you sound a bit harsher than you usually do---although I\n> sort of share with you the doubt on the practical merits.\n> \n\nAlright, I'm dropping it.  Too much work for no real gain other than\nsome piece of mind.\n\nThanks Johannes and Junio for your feedback.\n\n-- \nJeremiah Mahler\njmmahler@gmail.com\nhttp://github.com/jmahler\n"}]}