Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 12 Mar 2017 20:19:37 +0000 (UTC)
From:      Baptiste Daroussin <bapt@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r315180 - head/usr.bin/diff
Message-ID:  <201703122019.v2CKJb04036745@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bapt
Date: Sun Mar 12 20:19:37 2017
New Revision: 315180
URL: https://svnweb.freebsd.org/changeset/base/315180

Log:
  Readd codes that creates a tmp file for diffing stdout or devices

Modified:
  head/usr.bin/diff/diffreg.c

Modified: head/usr.bin/diff/diffreg.c
==============================================================================
--- head/usr.bin/diff/diffreg.c	Sun Mar 12 19:49:08 2017	(r315179)
+++ head/usr.bin/diff/diffreg.c	Sun Mar 12 20:19:37 2017	(r315180)
@@ -194,6 +194,7 @@ struct context_vec {
 };
 
 #define	diff_output	printf
+static FILE	*opentemp(const char *);
 static void	 output(char *, FILE *, char *, FILE *, int);
 static void	 check(FILE *, FILE *, int);
 static void	 range(int, int, const char *);
@@ -335,7 +336,14 @@ diffreg(char *file1, char *file2, int fl
 	if (flags & D_EMPTY1)
 		f1 = fopen(_PATH_DEVNULL, "r");
 	else {
-		if (strcmp(file1, "-") == 0)
+		if (!S_ISREG(stb1.st_mode)) {
+			if ((f1 = opentemp(file1)) == NULL ||
+			    fstat(fileno(f1), &stb1) < 0) {
+				warn("%s", file1);
+				status |= 2;
+				goto closem;
+			}
+		} else if (strcmp(file1, "-") == 0)
 			f1 = stdin;
 		else
 			f1 = fopen(file1, "r");
@@ -349,7 +357,14 @@ diffreg(char *file1, char *file2, int fl
 	if (flags & D_EMPTY2)
 		f2 = fopen(_PATH_DEVNULL, "r");
 	else {
-		if (strcmp(file2, "-") == 0)
+		if (!S_ISREG(stb2.st_mode)) {
+			if ((f2 = opentemp(file2)) == NULL ||
+			    fstat(fileno(f2), &stb2) < 0) {
+				warn("%s", file2);
+				status |= 2;
+				goto closem;
+			}
+		} else if (strcmp(file2, "-") == 0)
 			f2 = stdin;
 		else
 			f2 = fopen(file2, "r");
@@ -539,6 +554,37 @@ files_differ(FILE *f1, FILE *f2, int fla
 	}
 }
 
+static FILE *
+opentemp(const char *f)
+{
+	char buf[BUFSIZ], tempfile[PATH_MAX];
+	ssize_t nread;
+	int ifd, ofd;
+
+	if (strcmp(f, "-") == 0)
+		ifd = STDIN_FILENO;
+	else if ((ifd = open(f, O_RDONLY, 0644)) < 0)
+		return (NULL);
+
+	(void)strlcpy(tempfile, _PATH_TMP "/diff.XXXXXXXX", sizeof(tempfile));
+
+	if ((ofd = mkstemp(tempfile)) < 0) {
+		close(ifd);
+		return (NULL);
+	}
+	unlink(tempfile);
+	while ((nread = read(ifd, buf, BUFSIZ)) > 0) {
+		if (write(ofd, buf, nread) != nread) {
+			close(ifd);
+			close(ofd);
+			return (NULL);
+		}
+	}
+	close(ifd);
+	lseek(ofd, (off_t)0, SEEK_SET);
+	return (fdopen(ofd, "r"));
+}
+
 char *
 splice(char *dir, char *path)
 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201703122019.v2CKJb04036745>