Module Name:    src
Committed By:   sjg
Date:           Thu May 12 20:28:34 UTC 2016

Modified Files:
        src/usr.bin/make: compat.c job.c meta.c meta.h

Log Message:
Propagate errors from filemon.

If we encounter errors producing a .meta file,
we should not consider the target completed successfully.


To generate a diff of this commit:
cvs rdiff -u -r1.104 -r1.105 src/usr.bin/make/compat.c
cvs rdiff -u -r1.186 -r1.187 src/usr.bin/make/job.c
cvs rdiff -u -r1.56 -r1.57 src/usr.bin/make/meta.c
cvs rdiff -u -r1.4 -r1.5 src/usr.bin/make/meta.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/make/compat.c
diff -u src/usr.bin/make/compat.c:1.104 src/usr.bin/make/compat.c:1.105
--- src/usr.bin/make/compat.c:1.104	Thu Feb 18 18:29:14 2016
+++ src/usr.bin/make/compat.c	Thu May 12 20:28:34 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: compat.c,v 1.104 2016/02/18 18:29:14 christos Exp $	*/
+/*	$NetBSD: compat.c,v 1.105 2016/05/12 20:28:34 sjg Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -70,14 +70,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: compat.c,v 1.104 2016/02/18 18:29:14 christos Exp $";
+static char rcsid[] = "$NetBSD: compat.c,v 1.105 2016/05/12 20:28:34 sjg Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)compat.c	8.2 (Berkeley) 3/19/94";
 #else
-__RCSID("$NetBSD: compat.c,v 1.104 2016/02/18 18:29:14 christos Exp $");
+__RCSID("$NetBSD: compat.c,v 1.105 2016/05/12 20:28:34 sjg Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -583,7 +583,8 @@ Compat_Make(void *gnp, void *pgnp)
 	}
 #ifdef USE_META
 	if (useMeta && !NoExecute(gn)) {
-	    meta_job_finish(NULL);
+	    if (meta_job_finish(NULL) != 0)
+		gn->made = ERROR;
 	}
 #endif
 

Index: src/usr.bin/make/job.c
diff -u src/usr.bin/make/job.c:1.186 src/usr.bin/make/job.c:1.187
--- src/usr.bin/make/job.c:1.186	Thu Feb 18 18:29:14 2016
+++ src/usr.bin/make/job.c	Thu May 12 20:28:34 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: job.c,v 1.186 2016/02/18 18:29:14 christos Exp $	*/
+/*	$NetBSD: job.c,v 1.187 2016/05/12 20:28:34 sjg Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -70,14 +70,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: job.c,v 1.186 2016/02/18 18:29:14 christos Exp $";
+static char rcsid[] = "$NetBSD: job.c,v 1.187 2016/05/12 20:28:34 sjg Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)job.c	8.2 (Berkeley) 3/19/94";
 #else
-__RCSID("$NetBSD: job.c,v 1.186 2016/02/18 18:29:14 christos Exp $");
+__RCSID("$NetBSD: job.c,v 1.187 2016/05/12 20:28:34 sjg Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -1043,7 +1043,11 @@ JobFinish(Job *job, int status)
 
 #ifdef USE_META
     if (useMeta) {
-	meta_job_finish(job);
+	int x;
+
+	if ((x = meta_job_finish(job)) != 0 && status == 0) {
+	    status = x;
+	}
     }
 #endif
     

Index: src/usr.bin/make/meta.c
diff -u src/usr.bin/make/meta.c:1.56 src/usr.bin/make/meta.c:1.57
--- src/usr.bin/make/meta.c:1.56	Tue May 10 23:45:45 2016
+++ src/usr.bin/make/meta.c	Thu May 12 20:28:34 2016
@@ -1,4 +1,4 @@
-/*      $NetBSD: meta.c,v 1.56 2016/05/10 23:45:45 sjg Exp $ */
+/*      $NetBSD: meta.c,v 1.57 2016/05/12 20:28:34 sjg Exp $ */
 
 /*
  * Implement 'meta' mode.
@@ -157,28 +157,33 @@ filemon_open(BuildMon *pbm)
  * Read the build monitor output file and write records to the target's
  * metadata file.
  */
-static void
+static int
 filemon_read(FILE *mfp, int fd)
 {
     char buf[BUFSIZ];
     int n;
+    int error;
 
     /* Check if we're not writing to a meta data file.*/
     if (mfp == NULL) {
 	if (fd >= 0)
 	    close(fd);			/* not interested */
-	return;
+	return 0;
     }
     /* rewind */
     (void)lseek(fd, (off_t)0, SEEK_SET);
 
+    error = 0;
     fprintf(mfp, "\n-- filemon acquired metadata --\n");
 
     while ((n = read(fd, buf, sizeof(buf))) > 0) {
-	fwrite(buf, 1, n, mfp);
+	if ((int)fwrite(buf, 1, n, mfp) < n)
+	    error = EIO;
     }
     fflush(mfp);
-    close(fd);
+    if (close(fd) < 0)
+	error = errno;
+    return error;
 }
 #endif
 
@@ -753,27 +758,35 @@ meta_job_output(Job *job, char *cp, cons
     }
 }
 
-void
+int
 meta_cmd_finish(void *pbmp)
 {
+    int error = 0;
 #ifdef USE_FILEMON
     BuildMon *pbm = pbmp;
+    int x;
 
     if (!pbm)
 	pbm = &Mybm;
 
     if (pbm->filemon_fd >= 0) {
-	close(pbm->filemon_fd);
-	filemon_read(pbm->mfp, pbm->mon_fd);
+	if (close(pbm->filemon_fd) < 0)
+	    error = errno;
+	x = filemon_read(pbm->mfp, pbm->mon_fd);
+	if (error == 0 && x != 0)
+	    error = x;
 	pbm->filemon_fd = pbm->mon_fd = -1;
     }
 #endif
+    return error;
 }
 
-void
+int
 meta_job_finish(Job *job)
 {
     BuildMon *pbm;
+    int error = 0;
+    int x;
 
     if (job != NULL) {
 	pbm = &job->bm;
@@ -781,11 +794,14 @@ meta_job_finish(Job *job)
 	pbm = &Mybm;
     }
     if (pbm->mfp != NULL) {
-	meta_cmd_finish(pbm);
-	fclose(pbm->mfp);
+	error = meta_cmd_finish(pbm);
+	x = fclose(pbm->mfp);
+	if (error == 0 && x != 0)
+	    error = errno;
 	pbm->mfp = NULL;
 	pbm->meta_fname[0] = '\0';
     }
+    return error;
 }
 
 void

Index: src/usr.bin/make/meta.h
diff -u src/usr.bin/make/meta.h:1.4 src/usr.bin/make/meta.h:1.5
--- src/usr.bin/make/meta.h:1.4	Mon Mar  7 21:45:43 2016
+++ src/usr.bin/make/meta.h	Thu May 12 20:28:34 2016
@@ -1,4 +1,4 @@
-/*      $NetBSD: meta.h,v 1.4 2016/03/07 21:45:43 christos Exp $ */
+/*      $NetBSD: meta.h,v 1.5 2016/05/12 20:28:34 sjg Exp $ */
 
 /*
  * Things needed for 'meta' mode.
@@ -48,8 +48,8 @@ void meta_job_start(struct Job *, GNode 
 void meta_job_child(struct Job *);
 void meta_job_error(struct Job *, GNode *, int, int);
 void meta_job_output(struct Job *, char *, const char *);
-void meta_cmd_finish(void *);
-void meta_job_finish(struct Job *);
+int  meta_cmd_finish(void *);
+int  meta_job_finish(struct Job *);
 Boolean meta_oodate(GNode *, Boolean);
 void meta_compat_start(void);
 void meta_compat_child(void);

Reply via email to