/* -*-c-*-
*
- * $Id: sw_info.c,v 1.1 1999/06/02 16:53:35 mdw Exp $
+ * $Id: sw_info.c,v 1.6 2004/04/08 01:52:19 mdw Exp $
*
* Maintenance of `.sw-info' files
*
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-/*----- Revision history --------------------------------------------------*
- *
- * $Log: sw_info.c,v $
- * Revision 1.1 1999/06/02 16:53:35 mdw
- * Initial revision
- *
- */
-
/*----- Header files ------------------------------------------------------*/
#include "config.h"
#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>
#include <mLib/report.h>
#include "sw_arch.h"
+#include "sw_env.h"
#include "sw_info.h"
/*----- Static variables --------------------------------------------------*/
aa = arch_filter(all, sw.only_arch, archFlag_built, 0);
if (aa) {
- char *sep = " ";
- fprintf(stderr, "%s: not built for", QUIS);
+ const char *sep = "";
+ fprintf(stderr, "%s: not built for ", QUIS);
for (a = aa; a; a = a->cdr) {
fprintf(stderr, "%s%s", sep, a->car->arch);
sep = ", ";
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", PREFIX);
+ environ = env_export(&t);
+
+ /* --- Run the commit check script --- */
+
+ execl(PREFIX "/share/sw-precommit", "sw-precommit",
+ sw.package, (char *)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 --- */
{
FILE *fp = fopen(PREFIX "/sw-index", "a");
swfield *f;
- char *sep = "";
+ const char *sep = "";
if (!fp)
die(1, "couldn't open index file: %s", strerror(errno));