summaryrefslogtreecommitdiffstats
path: root/usr.bin/cpio
diff options
context:
space:
mode:
authorkientzle <kientzle@FreeBSD.org>2009-04-19 06:59:12 +0000
committerkientzle <kientzle@FreeBSD.org>2009-04-19 06:59:12 +0000
commit8556eaa4e133a6e72bfd78c0e41951f25f5ef26b (patch)
tree51ea96a5a2dadb84a13c34c8ec4b6017cbc09f3e /usr.bin/cpio
parent5db25627cf7785d7c87f82547521401e37b96f11 (diff)
downloadFreeBSD-src-8556eaa4e133a6e72bfd78c0e41951f25f5ef26b.zip
FreeBSD-src-8556eaa4e133a6e72bfd78c0e41951f25f5ef26b.tar.gz
When compiled for the release crunches, be a bit
more selective about what libarchive features we pull in: * No compression support * Only cpio and ustar writing * Only cpio and tar/pax readers This reduces a statically linked, stripped binary from 900k to 680k and completely eliminates the dependency on libcrypto.
Diffstat (limited to 'usr.bin/cpio')
-rw-r--r--usr.bin/cpio/Makefile5
-rw-r--r--usr.bin/cpio/cpio.c41
2 files changed, 37 insertions, 9 deletions
diff --git a/usr.bin/cpio/Makefile b/usr.bin/cpio/Makefile
index fce50b2..c64ab6c 100644
--- a/usr.bin/cpio/Makefile
+++ b/usr.bin/cpio/Makefile
@@ -9,6 +9,11 @@ WARNS?= 6
DPADD= ${LIBARCHIVE} ${LIBZ} ${LIBBZ2}
CFLAGS+= -DBSDCPIO_VERSION_STRING=\"${BSDCPIO_VERSION_STRING}\"
CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\"
+.ifdef RELEASE_CRUNCH
+# FreeBSD's installer uses cpio in crunched binaries that are
+# statically linked, cannot use -lcrypto, and are size sensitive.
+CFLAGS+= -DSMALLER
+.endif
LDADD+= -larchive -lz -lbz2 -lmd
.if ${MK_OPENSSL} != "no"
LDADD+= -lcrypto
diff --git a/usr.bin/cpio/cpio.c b/usr.bin/cpio/cpio.c
index be68616..73c6656 100644
--- a/usr.bin/cpio/cpio.c
+++ b/usr.bin/cpio/cpio.c
@@ -461,24 +461,37 @@ mode_out(struct cpio *cpio)
if (cpio->archive == NULL)
cpio_errc(1, 0, "Failed to allocate archive object");
switch (cpio->compress) {
-#ifdef HAVE_BZLIB_H
+#ifndef SMALLER
case 'j': case 'y':
- archive_write_set_compression_bzip2(cpio->archive);
+ r = archive_write_set_compression_bzip2(cpio->archive);
break;
-#endif
-#ifdef HAVE_ZLIB_H
case 'z':
- archive_write_set_compression_gzip(cpio->archive);
+ r = archive_write_set_compression_gzip(cpio->archive);
break;
-#endif
case 'Z':
- archive_write_set_compression_compress(cpio->archive);
+ r = archive_write_set_compression_compress(cpio->archive);
break;
- default:
- archive_write_set_compression_none(cpio->archive);
+#endif
+ case '\0':
+ r = archive_write_set_compression_none(cpio->archive);
break;
+ default:
+ cpio_errc(1, 0, "Unrecognized compression option");
}
+ if (r != ARCHIVE_OK)
+ cpio_errc(1, 0, "Unsupported compression format");
+#ifdef SMALLER
+ if (strcmp(cpio->format, "cpio"))
+ r = archive_write_set_format_cpio(cpio->archive);
+ else if (strcmp(cpio->format, "odc"))
+ r = archive_write_set_format_cpio(cpio->archive);
+ else if (strcmp(cpio->format, "newc"))
+ r = archive_write_set_format_cpio(cpio->archive);
+ else if (strcmp(cpio->format, "ustar"))
+ r = archive_write_set_format_cpio(cpio->archive);
+#else
r = archive_write_set_format_by_name(cpio->archive, cpio->format);
+#endif
if (r != ARCHIVE_OK)
cpio_errc(1, 0, archive_error_string(cpio->archive));
archive_write_set_bytes_per_block(cpio->archive, cpio->bytes_per_block);
@@ -815,8 +828,13 @@ mode_in(struct cpio *cpio)
a = archive_read_new();
if (a == NULL)
cpio_errc(1, 0, "Couldn't allocate archive object");
+#ifdef SMALLER
+ archive_read_support_format_cpio(a);
+ archive_read_support_format_tar(a);
+#else
archive_read_support_compression_all(a);
archive_read_support_format_all(a);
+#endif
if (archive_read_open_file(a, cpio->filename, cpio->bytes_per_block))
cpio_errc(1, archive_errno(a),
@@ -907,8 +925,13 @@ mode_list(struct cpio *cpio)
a = archive_read_new();
if (a == NULL)
cpio_errc(1, 0, "Couldn't allocate archive object");
+#ifdef SMALLER
+ archive_read_support_format_cpio(a);
+ archive_read_support_format_tar(a);
+#else
archive_read_support_compression_all(a);
archive_read_support_format_all(a);
+#endif
if (archive_read_open_file(a, cpio->filename, cpio->bytes_per_block))
cpio_errc(1, archive_errno(a),
OpenPOWER on IntegriCloud