From 9662b11b3c794d6c71280980112ceb60e13b4c62 Mon Sep 17 00:00:00 2001 From: mdw Date: Thu, 24 Jun 1999 15:51:59 +0000 Subject: [PATCH] Add support for the `sw-precommit' script. --- src/sw_info.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/src/sw_info.c b/src/sw_info.c index 59d9308..82204d3 100644 --- a/src/sw_info.c +++ b/src/sw_info.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: sw_info.c,v 1.2 1999/06/18 18:58:45 mdw Exp $ + * $Id: sw_info.c,v 1.3 1999/06/24 15:51:59 mdw Exp $ * * Maintenance of `.sw-info' files * @@ -29,6 +29,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: sw_info.c,v $ + * Revision 1.3 1999/06/24 15:51:59 mdw + * Add support for the `sw-precommit' script. + * * Revision 1.2 1999/06/18 18:58:45 mdw * Various tidyings. * @@ -43,6 +46,7 @@ #include #include +#include #include #include #include @@ -50,9 +54,14 @@ #include #include +#include #include #include +#ifndef DECL_ENVIRON + extern char **environ; +#endif + #include #include #include @@ -60,6 +69,7 @@ #include #include "sw_arch.h" +#include "sw_env.h" #include "sw_info.h" /*----- Static variables --------------------------------------------------*/ @@ -427,6 +437,67 @@ int sw_commit(int argc, char *argv[]) arch_free(aa); } + /* --- Run the local precommit check script --- */ + + { + pid_t kid; + struct sigaction sa, sa_int, sa_quit; + int status; + + /* --- Make sure I can trap the child's death --- */ + + sa.sa_handler = SIG_IGN; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + if (sigaction(SIGINT, &sa, &sa_int) || sigaction(SIGQUIT, &sa, &sa_quit)) + die(1, "couldn't set signal dispositions: %s", strerror(errno)); + + /* --- Spawn off a child process --- */ + + fflush(0); + kid = fork(); + if (kid < 0) + die(1, "error from fork: %s", strerror(errno)); + if (kid == 0) { + sym_table t; + + /* --- Re-enable signals --- */ + + sigaction(SIGINT, &sa_int, 0); + sigaction(SIGQUIT, &sa_quit, 0); + + /* --- Set up the environment --- */ + + sym_create(&t); + env_import(&t, environ); + env_put(&t, "SW_PACKAGE", sw.package); + env_put(&t, "SW_VERSION", sw.version); + env_put(&t, "SW_MAINTAINER", sw.maintainer); + env_put(&t, "SW_DATE", sw.date); + env_put(&t, "SW_ARCHLIST", sw.arch); + env_put(&t, "SW_PREFIX", sw.prefix); + environ = env_export(&t); + + /* --- Run the commit check script --- */ + + execl(PREFIX "/share/sw-precommit", "sw-precommit", + sw.package, (void *)0); + if (errno == ENOENT) + _exit(0); + die(1, "couldn't run " PREFIX "/share/sw-precommit: %s", + strerror(errno)); + } + + /* --- Wait for the child to finish --- */ + + if (waitpid(kid, &status, 0) < 0) + die(1, "error waiting for child: %s", strerror(errno)); + if (!(WIFEXITED(status) && WEXITSTATUS(status) == 0)) + die(1, "sw-precommit failed"); + sigaction(SIGINT, &sa_int, 0); + sigaction(SIGQUIT, &sa_quit, 0); + } + /* --- Write to the index file --- */ { -- 2.11.0