Readd codes that creates a tmp file for diffing stdout or devices
This commit is contained in:
parent
5bc8258168
commit
ff80781570
@ -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 flags, int capsicum)
|
||||
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 flags, int capsicum)
|
||||
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 flags)
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user