diff options
Diffstat (limited to 'packages/klibc')
-rw-r--r-- | packages/klibc/files/wc.patch | 236 | ||||
-rw-r--r-- | packages/klibc/klibc-common.inc | 1 | ||||
-rw-r--r-- | packages/klibc/klibc-utils-static_1.5.bb | 6 | ||||
-rw-r--r-- | packages/klibc/klibc.inc | 7 | ||||
-rw-r--r-- | packages/klibc/klibc_1.5.bb | 2 |
5 files changed, 247 insertions, 5 deletions
diff --git a/packages/klibc/files/wc.patch b/packages/klibc/files/wc.patch new file mode 100644 index 0000000000..296a4f9d92 --- /dev/null +++ b/packages/klibc/files/wc.patch @@ -0,0 +1,236 @@ +Index: klibc-1.5/usr/utils/Kbuild +=================================================================== +--- klibc-1.5.orig/usr/utils/Kbuild 2008-04-14 23:21:57.702294843 +0200 ++++ klibc-1.5/usr/utils/Kbuild 2008-04-14 23:24:38.817291977 +0200 +@@ -3,7 +3,7 @@ + # + + progs := chroot dd mkdir mkfifo mknod mount pivot_root umount +-progs += true false sleep ln nuke minips cat losetup ++progs += true false sleep ln nuke minips cat losetup wc + progs += insmod uname halt kill readlink cpio modprobe + + static-y := $(addprefix static/, $(progs)) +@@ -56,6 +56,9 @@ + shared/modprobe-y := modprobe.o + static/losetup-y := losetup.o + shared/losetup-y := losetup.o ++static/wc-y := wc.o ++shared/wc-y := wc.o ++ + # Additionally linked targets + always := static/reboot static/poweroff shared/reboot shared/poweroff + +Index: klibc-1.5/usr/utils/wc.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ klibc-1.5/usr/utils/wc.c 2008-04-14 23:25:15.449292711 +0200 +@@ -0,0 +1,208 @@ ++/* vi: set sw=4 ts=4: */ ++/* ++ * wc implementation for busybox ++ * ++ * Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org> ++ * ++ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. ++ */ ++ ++/* BB_AUDIT SUSv3 _NOT_ compliant -- option -m is not currently supported. */ ++/* http://www.opengroup.org/onlinepubs/007904975/utilities/wc.html */ ++ ++/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org) ++ * ++ * Rewritten to fix a number of problems and do some size optimizations. ++ * Problems in the previous busybox implementation (besides bloat) included: ++ * 1) broken 'wc -c' optimization (read note below) ++ * 2) broken handling of '-' args ++ * 3) no checking of ferror on EOF returns ++ * 4) isprint() wasn't considered when word counting. ++ * ++ * TODO: ++ * ++ * When locale support is enabled, count multibyte chars in the '-m' case. ++ * ++ * NOTES: ++ * ++ * The previous busybox wc attempted an optimization using stat for the ++ * case of counting chars only. I omitted that because it was broken. ++ * It didn't take into account the possibility of input coming from a ++ * pipe, or input from a file with file pointer not at the beginning. ++ * ++ * To implement such a speed optimization correctly, not only do you ++ * need the size, but also the file position. Note also that the ++ * file position may be past the end of file. Consider the example ++ * (adapted from example in gnu wc.c) ++ * ++ * echo hello > /tmp/testfile && ++ * (dd ibs=1k skip=1 count=0 &> /dev/null; wc -c) < /tmp/testfile ++ * ++ * for which 'wc -c' should output '0'. ++ */ ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <unistd.h> ++#undef isspace ++#undef isprint ++#define isspace(c) ((((c) == ' ') || (((unsigned int)((c) - 9)) <= (13 - 9)))) ++#define isprint(c) (((unsigned int)((c) - 0x20)) <= (0x7e - 0x20)) ++#define isspace_given_isprint(c) ((c) == ' ') ++ ++#define COUNT_T unsigned long ++#define COUNT_FMT "u" ++#define optind 1 ++FILE *fopen_or_warn_stdin(const char *filename) ++{ ++ FILE *fp = stdin; ++ ++ if (filename[0]) { ++ fp = fopen(filename, "r"); ++ } ++ ++ return fp; ++} ++ ++enum { ++ WC_LINES = 0, ++ WC_WORDS = 1, ++ WC_CHARS = 2, ++ WC_LENGTH = 3 ++}; ++ ++int main(int argc, char **argv) ++{ ++ FILE *fp; ++ const char *s, *arg; ++ const char *start_fmt = "%9"COUNT_FMT; ++ const char *fname_fmt = " %s\n"; ++ COUNT_T *pcounts; ++ COUNT_T counts[4]; ++ COUNT_T totals[4]; ++ unsigned linepos; ++ unsigned u; ++ int num_files = 0; ++ int c; ++ signed char status = EXIT_SUCCESS; ++ signed char in_word; ++ unsigned print_type; ++ ++ print_type = getopt(argc, argv, "lwcL"); ++ ++ if (print_type == 0) { ++ print_type = (1 << WC_LINES) | (1 << WC_WORDS) | (1 << WC_CHARS); ++ } ++ ++ argv += optind; ++ if (!argv[0]) { ++ *--argv = (char *) "wc"; ++ fname_fmt = "\n"; ++ if (!((print_type-1) & print_type)) /* exactly one option? */ ++ start_fmt = "%"COUNT_FMT; ++ } ++ ++ memset(totals, 0, sizeof(totals)); ++ ++ pcounts = counts; ++ ++ while ((arg = *argv++) != 0) { ++ ++num_files; ++ fp = fopen_or_warn_stdin(arg); ++ if (!fp) { ++ status = EXIT_FAILURE; ++ continue; ++ } ++ ++ memset(counts, 0, sizeof(counts)); ++ linepos = 0; ++ in_word = 0; ++ ++ do { ++ /* Our -w doesn't match GNU wc exactly... oh well */ ++ ++ ++counts[WC_CHARS]; ++ c = getc(fp); ++ if (isprint(c)) { ++ ++linepos; ++ if (!isspace_given_isprint(c)) { ++ in_word = 1; ++ continue; ++ } ++ } else if (((unsigned int)(c - 9)) <= 4) { ++ /* \t 9 ++ * \n 10 ++ * \v 11 ++ * \f 12 ++ * \r 13 ++ */ ++ if (c == '\t') { ++ linepos = (linepos | 7) + 1; ++ } else { /* '\n', '\r', '\f', or '\v' */ ++ DO_EOF: ++ if (linepos > counts[WC_LENGTH]) { ++ counts[WC_LENGTH] = linepos; ++ } ++ if (c == '\n') { ++ ++counts[WC_LINES]; ++ } ++ if (c != '\v') { ++ linepos = 0; ++ } ++ } ++ } else if (c == EOF) { ++/* if (ferror(fp)) { ++ status = EXIT_FAILURE; ++ } ++*/ --counts[WC_CHARS]; ++ goto DO_EOF; /* Treat an EOF as '\r'. */ ++ } else { ++ continue; ++ } ++ ++ counts[WC_WORDS] += in_word; ++ in_word = 0; ++ if (c == EOF) { ++ break; ++ } ++ } while (1); ++ ++ if (totals[WC_LENGTH] < counts[WC_LENGTH]) { ++ totals[WC_LENGTH] = counts[WC_LENGTH]; ++ } ++ totals[WC_LENGTH] -= counts[WC_LENGTH]; ++ ++ if(fp != stdin) ++ fclose(fp); ++ ++ OUTPUT: ++ /* coreutils wc tries hard to print pretty columns ++ * (saves results for all files, find max col len etc...) ++ * we won't try that hard, it will bloat us too much */ ++ s = start_fmt; ++ u = 0; ++ do { ++ if (print_type & (1 << u)) { ++ printf(s, pcounts[u]); ++ s = " %9"COUNT_FMT; /* Ok... restore the leading space. */ ++ } ++ totals[u] += pcounts[u]; ++ } while (++u < 4); ++ printf(fname_fmt, arg); ++ } ++ ++ /* If more than one file was processed, we want the totals. To save some ++ * space, we set the pcounts ptr to the totals array. This has the side ++ * effect of trashing the totals array after outputting it, but that's ++ * irrelavent since we no longer need it. */ ++ if (num_files > 1) { ++ num_files = 0; /* Make sure we don't get here again. */ ++ arg = "total"; ++ pcounts = totals; ++ --argv; ++ goto OUTPUT; ++ } ++ ++ fflush(stdout); ++ exit(status); ++} diff --git a/packages/klibc/klibc-common.inc b/packages/klibc/klibc-common.inc index 5e890b3bc8..87fb6498f4 100644 --- a/packages/klibc/klibc-common.inc +++ b/packages/klibc/klibc-common.inc @@ -9,6 +9,7 @@ SRC_URI = "${KERNELORG_MIRROR}/pub/linux/libs/klibc/Stable/klibc-${PV}.tar.bz2 \ file://modprobe.patch;patch=1 \ file://losetup.patch;patch=1 \ file://dash_readopt.patch;patch=1 \ + file://wc.patch;patch=1 \ " S = "${WORKDIR}/klibc-${PV}" PACKAGE_ARCH = "${MACHINE_ARCH}" diff --git a/packages/klibc/klibc-utils-static_1.5.bb b/packages/klibc/klibc-utils-static_1.5.bb index f0429e34a2..f7015ffaf7 100644 --- a/packages/klibc/klibc-utils-static_1.5.bb +++ b/packages/klibc/klibc-utils-static_1.5.bb @@ -1,6 +1,6 @@ require klibc-common.inc -PR = "r9" +PR = "r10" # We only want the static utils. klibc build both. So we install only what we want. do_install() { @@ -38,6 +38,7 @@ do_install() { install -m 755 usr/utils/static/uname ${D}${base_bindir} install -m 755 usr/utils/static/modprobe ${D}${base_bindir} install -m 755 usr/utils/static/losetup ${D}${base_bindir} + install -m 755 usr/utils/static/wc ${D}${base_bindir} cd ${D}${base_bindir} ln -s gzip gunzip ln -s gzip zcat @@ -60,7 +61,7 @@ PACKAGES = "klibc-utils-static-sh klibc-utils-static-gzip \ klibc-utils-static-reboot klibc-utils-static-sleep \ klibc-utils-static-true klibc-utils-static-umount \ klibc-utils-static-uname klibc-utils-static-modprobe \ - klibc-utils-static-losetup" + klibc-utils-static-losetup klibc-utils-static-wc" FILES_klibc-utils-static-sh = "${base_bindir}/sh" FILES_klibc-utils-static-gzip = "${base_bindir}/gzip ${base_bindir}/gunzip ${base_bindir}/zcat" @@ -95,3 +96,4 @@ FILES_klibc-utils-static-umount = "${base_bindir}/umount" FILES_klibc-utils-static-uname = "${base_bindir}/uname" FILES_klibc-utils-static-modprobe = "${base_bindir}/modprobe" FILES_klibc-utils-static-losetup = "${base_bindir}/losetup" +FILES_klibc-utils-static-wc = "${base_bindir}/wc" diff --git a/packages/klibc/klibc.inc b/packages/klibc/klibc.inc index c32111af37..15205c754b 100644 --- a/packages/klibc/klibc.inc +++ b/packages/klibc/klibc.inc @@ -40,7 +40,8 @@ do_install() { install -m 755 usr/utils/shared/uname ${D}${base_bindir} install -m 755 usr/utils/shared/modprobe ${D}${base_bindir} install -m 755 usr/utils/shared/losetup ${D}${base_bindir} - + install -m 755 usr/utils/shared/wc ${D}${base_bindir} + install -d ${D}${base_libdir} install -m 755 usr/klibc/klibc-*.so ${D}${base_libdir} cd ${D}${base_libdir} @@ -74,7 +75,7 @@ PACKAGES = "${PN} klibc-utils-sh klibc-utils-kinit \ klibc-utils-sleep klibc-utils-true \ klibc-utils-umount klibc-utils-uname \ klibc-utils-gzip klibc-utils-modprobe \ - klibc-utils-losetup" + klibc-utils-losetup klibc-utils-wc" FILES_${PN} = "${base_libdir}/klibc*.so" FILES_klibc-utils-sh = "${base_bindir}/sh" @@ -110,6 +111,7 @@ FILES_klibc-utils-umount = "${base_bindir}/umount" FILES_klibc-utils-uname = "${base_bindir}/uname" FILES_klibc-utils-modprobe = "${base_bindir}/modprobe" FILES_klibc-utils-losetup = "${base_bindir}/losetup" +FILES_klibc-utils-wc = "${base_bindir}/wc" # Yes we want exactly the klibc that was compiled with the utils RDEPENDS_klibc-utils-sh = "${PN} (=${PV}-${PR})" @@ -144,3 +146,4 @@ RDEPENDS_klibc-utils-umount = "${PN} (=${PV}-${PR})" RDEPENDS_klibc-utils-uname = "${PN} (=${PV}-${PR})" RDEPENDS_klibc-utils-modprobe = "${PN} (=${PV}-${PR})" RDEPENDS_klibc-utils-losetup = "${PN} (=${PV}-${PR})" +RDEPENDS_klibc-utils-wc = "${PN} (=${PV}-${PR})" diff --git a/packages/klibc/klibc_1.5.bb b/packages/klibc/klibc_1.5.bb index 967f88f948..70d2819394 100644 --- a/packages/klibc/klibc_1.5.bb +++ b/packages/klibc/klibc_1.5.bb @@ -1,2 +1,2 @@ require klibc.inc -PR = "r7" +PR = "r8" |