svn commit: r356791 - head/bin/cat

Alex Richardson arichardson at FreeBSD.org
Thu Jan 16 14:15:01 UTC 2020


Author: arichardson
Date: Thu Jan 16 14:15:00 2020
New Revision: 356791
URL: https://svnweb.freebsd.org/changeset/base/356791

Log:
  Allow building bin/cat on non-FreeBSD systems
  
  `cat -l` is needed during the installworld phase and other system's cat
  don't support that flag. To avoid portability issues when compiling on
  Linux/macOS (such as the the direct access to &fp->_mbstate), we
  disable the entire multibyte support when building as a boostrap tool.
  
  Reviewed By:	brooks, emaste
  Differential Revision: https://reviews.freebsd.org/D13939

Modified:
  head/bin/cat/Makefile
  head/bin/cat/cat.c

Modified: head/bin/cat/Makefile
==============================================================================
--- head/bin/cat/Makefile	Thu Jan 16 14:14:55 2020	(r356790)
+++ head/bin/cat/Makefile	Thu Jan 16 14:15:00 2020	(r356791)
@@ -6,6 +6,12 @@
 PACKAGE=runtime
 PROG=	cat
 
+.ifdef BOOTSTRAPPING
+# For the bootstrap cat we disable all wide char support to allow building
+# on Linux/macOS
+CFLAGS+=-DBOOTSTRAP_CAT
+.endif
+
 HAS_TESTS=
 SUBDIR.${MK_TESTS}+= tests
 

Modified: head/bin/cat/cat.c
==============================================================================
--- head/bin/cat/cat.c	Thu Jan 16 14:14:55 2020	(r356790)
+++ head/bin/cat/cat.c	Thu Jan 16 14:15:00 2020	(r356791)
@@ -96,6 +96,20 @@ static int udom_open(const char *path, int flags);
  */
 #define	BUFSIZE_SMALL (MAXPHYS)
 
+
+/*
+ * For the bootstrapped cat binary (needed for locked appending to METALOG), we
+ * disable all flags except -l and -u to avoid non-portable function calls.
+ * In the future we may instead want to write a small portable bootstrap tool
+ * that locks the output file before writing to it. However, for now
+ * bootstrapping cat without multibyte support is the simpler solution.
+ */
+#ifdef BOOTSTRAP_CAT
+#define SUPPORTED_FLAGS "lu"
+#else
+#define SUPPORTED_FLAGS "belnstuv"
+#endif
+
 int
 main(int argc, char *argv[])
 {
@@ -104,7 +118,7 @@ main(int argc, char *argv[])
 
 	setlocale(LC_CTYPE, "");
 
-	while ((ch = getopt(argc, argv, "belnstuv")) != -1)
+	while ((ch = getopt(argc, argv, SUPPORTED_FLAGS)) != -1)
 		switch (ch) {
 		case 'b':
 			bflag = nflag = 1;	/* -b implies -n */
@@ -158,7 +172,7 @@ static void
 usage(void)
 {
 
-	fprintf(stderr, "usage: cat [-belnstuv] [file ...]\n");
+	fprintf(stderr, "usage: cat [-" SUPPORTED_FLAGS "] [file ...]\n");
 	exit(1);
 	/* NOTREACHED */
 }
@@ -187,6 +201,7 @@ scanfiles(char *argv[], int cooked)
 		if (fd < 0) {
 			warn("%s", path);
 			rval = 1;
+#ifndef BOOTSTRAP_CAT
 		} else if (cooked) {
 			if (fd == STDIN_FILENO)
 				cook_cat(stdin);
@@ -195,6 +210,7 @@ scanfiles(char *argv[], int cooked)
 				cook_cat(fp);
 				fclose(fp);
 			}
+#endif
 		} else {
 			raw_cat(fd);
 			if (fd != STDIN_FILENO)
@@ -206,6 +222,7 @@ scanfiles(char *argv[], int cooked)
 	}
 }
 
+#ifndef BOOTSTRAP_CAT
 static void
 cook_cat(FILE *fp)
 {
@@ -295,6 +312,7 @@ ilseq:
 	if (ferror(stdout))
 		err(1, "stdout");
 }
+#endif /* BOOTSTRAP_CAT */
 
 static void
 raw_cat(int rfd)


More information about the svn-src-head mailing list