ref: 4db748a4730a223226e582c9d343cf9a6326b87f
parent: 40486d3641407466dfc08c7cddbee4a2f230758a
author: Ori Bernstein <[email protected]>
date: Sat Mar 4 17:06:52 EST 2023
diff: add missing file
--- /dev/null
+++ b/sys/src/cmd/diff/util.c
@@ -1,0 +1,103 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "diff.h"
+
+Biobuf stdout;
+char mode; /* '\0', 'e', 'f', 'h' */
+char bflag; /* ignore multiple and trailing blanks */
+char rflag; /* recurse down directory trees */
+char mflag; /* pseudo flag: doing multiple files, one dir */
+int anychange;
+
+static char *tmp[] = {"/tmp/diff1XXXXXXXXXXX", "/tmp/diff2XXXXXXXXXXX"};
+static int whichtmp;
+
+void *
+emalloc(unsigned n)
+{
+ register void *p;
+
+ if ((p = malloc(n)) == 0)
+ sysfatal("malloc: %r");
+ return p;
+}
+
+void *
+erealloc(void *p, unsigned n)
+{
+ void *rp;
+
+ if ((rp = realloc(p, n)) == 0)
+ sysfatal("realloc: %r");
+ return rp;
+}
+
+int
+mkpathname(char *pathname, char *path, char *name)
+{
+ if (strlen(path) + strlen(name) > MAXPATHLEN) {
+ sysfatal("pathname %s/%s too long", path, name);
+ return 1;
+ }
+ sprint(pathname, "%s/%s", path, name);
+ return 0;
+}
+
+char *
+mktmpfile(int input, Dir **sb)
+{
+ int fd, i;
+ char *p;
+ char buf[8192];
+
+ p = mktemp(tmp[whichtmp++]);
+ /*
+ * Because we want this file to stick around
+ * for the entire run of the program, we leak
+ * the fd intentionally here; when we exit,
+ * the system will remove the file for us.
+ */
+ fd = create(p, OWRITE|ORCLOSE, 0600);
+ if (fd < 0) {
+ sysfatal("cannot create %s: %r", p);
+ return 0;
+ }
+ while ((i = read(input, buf, sizeof(buf))) > 0) {
+ if ((i = write(fd, buf, i)) < 0)
+ break;
+ }
+ *sb = dirfstat(fd);
+ if (i < 0) {
+ sysfatal("cannot read/write %s: %r", p);
+ return 0;
+ }
+ return p;
+}
+
+char *
+statfile(char *file, Dir **sb)
+{
+ Dir *dir;
+ int input;
+
+ dir = dirstat(file);
+ if(dir == nil) {
+ if (strcmp(file, "-") || (dir = dirfstat(0)) == nil) {
+ sysfatal("cannot stat %s: %r", file);
+ return 0;
+ }
+ free(dir);
+ return mktmpfile(0, sb);
+ } else if (!REGULAR_FILE(dir) && !DIRECTORY(dir)) {
+ free(dir);
+ if ((input = open(file, OREAD)) == -1) {
+ sysfatal("cannot open %s: %r", file);
+ return 0;
+ }
+ file = mktmpfile(input, sb);
+ close(input);
+ } else
+ *sb = dir;
+ return file;
+}