Module Name: src Committed By: christos Date: Thu Jan 12 01:58:03 UTC 2017
Modified Files: src/distrib/utils/zcat: Makefile zcat.c Added Files: src/distrib/utils/zcat: misc.c Log Message: This is an example how to make a small program using libc. Original size 300K; final size 75K. To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/distrib/utils/zcat/Makefile cvs rdiff -u -r0 -r1.1 src/distrib/utils/zcat/misc.c cvs rdiff -u -r1.4 -r1.5 src/distrib/utils/zcat/zcat.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/utils/zcat/Makefile diff -u src/distrib/utils/zcat/Makefile:1.16 src/distrib/utils/zcat/Makefile:1.17 --- src/distrib/utils/zcat/Makefile:1.16 Tue Jan 10 23:04:12 2017 +++ src/distrib/utils/zcat/Makefile Wed Jan 11 20:58:03 2017 @@ -1,26 +1,32 @@ -# $NetBSD: Makefile,v 1.16 2017/01/11 04:04:12 christos Exp $ +# $NetBSD: Makefile,v 1.17 2017/01/12 01:58:03 christos Exp $ # Small zcat (i.e. for install media) # -# Note: gzio.c is compiled here so that crunchgen will assume -# the same symbol space for zcat.c and gzio.c which is required -# so that the fake deflate functions in zcat.c will satisfy the -# references to those functions in gzio.c (yes, it's a hack). + +NOSSP=yes +NOMAN= +.include <bsd.own.mk> SRCDIR= ${.CURDIR}/../../../common/dist/zlib +LIBC= ${NETBSDSRCDIR}/lib/libc + +.PATH: ${SRCDIR} ${LIBC}/stdlib WARNS?= 4 PROG= zcat -NOMAN= # defined - -SRCS= zcat.c gzread.c gzclose.c gzlib.c +# Just what we need from libz +SRCS= zcat.c gzread.c gzclose.c gzlib.c inflate.c +SRCS+= adler32.c crc32.c zutil.c inffast.c inftrees.c CPPFLAGS+= -I${SRCDIR} -DNO_GZCOMPRESS -DPADD+= ${LIBZ} -LDADD+= -lz -.include <bsd.prog.mk> +# This avoids including stdio, threads, locale, etc. +SRCS+= misc.c +SRCS+= malloc.c # small +CPPFLAGS+= -I${LIBC}/include +CPPFLAGS+= -Dsnprintf=snprintf_ss -Dsprintf=sprintf_ss +CPPFLAGS+= -Dstrerror=strerror_ss -.PATH: ${SRCDIR} +.include <bsd.prog.mk> test: zcat echo 'hello, hello!' | gzip | ./zcat Index: src/distrib/utils/zcat/zcat.c diff -u src/distrib/utils/zcat/zcat.c:1.4 src/distrib/utils/zcat/zcat.c:1.5 --- src/distrib/utils/zcat/zcat.c:1.4 Thu May 19 18:23:12 2011 +++ src/distrib/utils/zcat/zcat.c Wed Jan 11 20:58:03 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: zcat.c,v 1.4 2011/05/19 22:23:12 tsutsui Exp $ */ +/* $NetBSD: zcat.c,v 1.5 2017/01/12 01:58:03 christos Exp $ */ /* mini zcat.c -- a minimal zcat using the zlib compression library * Copyright (C) 1995-1996 Jean-loup Gailly. @@ -13,8 +13,11 @@ */ #include <stdio.h> +#include <stdarg.h> +#include <stdlib.h> #include <string.h> #include <stdlib.h> +#include <unistd.h> #include "zlib.h" @@ -22,24 +25,33 @@ char *prog; -void error(const char *msg); -void gz_uncompress(gzFile in, FILE *out); -int main(int argc, char *argv[]); +static void error(const char *, ...) __printflike(1, 2); +static void gz_uncompress(gzFile, int); /* =========================================================================== * Display error message and exit */ -void error(const char *msg) +static void +error(const char *fmt, ...) { - - fprintf(stderr, "%s: %s\n", prog, msg); - exit(EXIT_SUCCESS); + char buf[1024]; + va_list ap; + int l; + + l = snprintf_ss(buf, sizeof(buf), "%s: ", prog); + write(STDERR_FILENO, buf, l); + va_start(ap, fmt); + l = vsnprintf_ss(buf, sizeof(buf), fmt, ap); + va_end(ap); + write(STDERR_FILENO, buf, l); + _exit(EXIT_SUCCESS); } /* =========================================================================== * Uncompress input to output then close both files. */ -void gz_uncompress(gzFile in, FILE *out) +static void +gz_uncompress(gzFile in, int out) { char buf[BUFLEN]; int len; @@ -48,15 +60,15 @@ void gz_uncompress(gzFile in, FILE *out) for (;;) { len = gzread(in, buf, sizeof(buf)); if (len < 0) - error (gzerror(in, &err)); + error ("%s", gzerror(in, &err)); if (len == 0) break; - if ((int)fwrite(buf, 1, (unsigned)len, out) != len) { + if ((int)write(out, buf, (size_t)len) != len) { error("failed fwrite"); } } - if (fclose(out)) + if (close(out)) error("failed fclose"); if (gzclose(in) != Z_OK) @@ -68,7 +80,8 @@ void gz_uncompress(gzFile in, FILE *out) * Usage: zcat [files...] */ -int main(int argc, char *argv[]) +int +main(int argc, char *argv[]) { gzFile zfp; @@ -82,10 +95,10 @@ int main(int argc, char *argv[]) } if (argc == 0) { - zfp = gzdopen(fileno(stdin), "rb"); + zfp = gzdopen(STDIN_FILENO, "rb"); if (zfp == NULL) error("can't gzdopen stdin"); - gz_uncompress(zfp, stdout); + gz_uncompress(zfp, STDOUT_FILENO); return 0; } @@ -93,10 +106,10 @@ int main(int argc, char *argv[]) /* file_uncompress(*argv); */ zfp = gzopen(*argv, "rb"); if (zfp == NULL) { - fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv); - exit(EXIT_FAILURE); + error("can't gzopen `%s'", *argv); + _exit(EXIT_FAILURE); } - gz_uncompress(zfp, stdout); + gz_uncompress(zfp, STDOUT_FILENO); } while (argv++, --argc); return 0; /* to avoid warning */ } Added files: Index: src/distrib/utils/zcat/misc.c diff -u /dev/null src/distrib/utils/zcat/misc.c:1.1 --- /dev/null Wed Jan 11 20:58:03 2017 +++ src/distrib/utils/zcat/misc.c Wed Jan 11 20:58:03 2017 @@ -0,0 +1,38 @@ +#include <assert.h> +#include <signal.h> + +/* Avoid stdio */ +__dead void __assert(const char *a, int b, const char *c) { + kill(0, SIGQUIT); +} +__dead void __assert13(const char *a, int b, const char *c, const char *d) { + kill(0, SIGQUIT); +} +void __diagassert(const char *a, int b, const char *x) { + kill(0, SIGQUIT); +} +void __diagassert13(const char * a, int b, const char *c, const char *d) { + kill(0, SIGQUIT); +} + +/* Avoid mutexes environment rbree, thread stuff */ +void _libc_init(void); +void _libc_init(void) { +} + +/* Avoid finalizers, etc. */ +int atexit(void (*)(void)); + +int atexit(void (*p)(void)) { + return 0; +} + +void __cxa_finalize(void *); +void __cxa_finalize(void *dso) { } + +int __cxa_atexit(void (*func)(void *), void *arg, void *dso); +int +__cxa_atexit(void (*func)(void *), void *arg, void *dso) +{ + return 0; +}