Add support for the `sw-precommit' script.
authormdw <mdw>
Thu, 24 Jun 1999 15:51:59 +0000 (15:51 +0000)
committermdw <mdw>
Thu, 24 Jun 1999 15:51:59 +0000 (15:51 +0000)
src/sw_info.c

index 59d9308..82204d3 100644 (file)
@@ -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 <ctype.h>
 #include <errno.h>
+#include <signal.h>
 #include <stddef.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
 
 #include <sys/types.h>
+#include <sys/wait.h>
 #include <pwd.h>
 #include <unistd.h>
 
+#ifndef DECL_ENVIRON
+  extern char **environ;
+#endif
+
 #include <mLib/alloc.h>
 #include <mLib/dstr.h>
 #include <mLib/lock.h>
@@ -60,6 +69,7 @@
 #include <mLib/report.h>
 
 #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 --- */
 
   {