Magellan Linux

Annotation of /trunk/mkinitrd-magellan/busybox/coreutils/head.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (hide annotations) (download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 8 months ago) by niro
File MIME type: text/plain
File size: 2789 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd

1 niro 532 /* vi: set sw=4 ts=4: */
2     /*
3     * head implementation for busybox
4     *
5     * Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org>
6     *
7     * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8     */
9    
10     /* BB_AUDIT SUSv3 compliant */
11     /* BB_AUDIT GNU compatible -c, -q, and -v options in 'fancy' configuration. */
12     /* http://www.opengroup.org/onlinepubs/007904975/utilities/head.html */
13    
14     #include "busybox.h"
15    
16     static const char head_opts[] =
17     "n:"
18     #if ENABLE_FEATURE_FANCY_HEAD
19     "c:qv"
20     #endif
21     ;
22    
23     #if ENABLE_FEATURE_FANCY_HEAD
24     static const struct suffix_mult head_suffixes[] = {
25     { "b", 512 },
26     { "k", 1024 },
27     { "m", 1024*1024 },
28     { NULL, 0 }
29     };
30     #endif
31    
32     static const char header_fmt_str[] = "\n==> %s <==\n";
33    
34     int head_main(int argc, char **argv)
35     {
36     unsigned long count = 10;
37     unsigned long i;
38     #if ENABLE_FEATURE_FANCY_HEAD
39     int count_bytes = 0;
40     int header_threshhold = 1;
41     #endif
42    
43     FILE *fp;
44     const char *fmt;
45     char *p;
46     int opt;
47     int c;
48     int retval = EXIT_SUCCESS;
49    
50     #if ENABLE_INCLUDE_SUSv2 || ENABLE_FEATURE_FANCY_HEAD
51     /* Allow legacy syntax of an initial numeric option without -n. */
52     if (argc > 1 && argv[1][0] == '-'
53     && isdigit(argv[1][1])
54     ) {
55     --argc;
56     ++argv;
57     p = (*argv) + 1;
58     goto GET_COUNT;
59     }
60     #endif
61    
62     /* No size benefit in converting this to getopt32 */
63     while ((opt = getopt(argc, argv, head_opts)) > 0) {
64     switch (opt) {
65     #if ENABLE_FEATURE_FANCY_HEAD
66     case 'q':
67     header_threshhold = INT_MAX;
68     break;
69     case 'v':
70     header_threshhold = -1;
71     break;
72     case 'c':
73     count_bytes = 1;
74     /* fall through */
75     #endif
76     case 'n':
77     p = optarg;
78     #if ENABLE_INCLUDE_SUSv2 || ENABLE_FEATURE_FANCY_HEAD
79     GET_COUNT:
80     #endif
81    
82     #if !ENABLE_FEATURE_FANCY_HEAD
83     count = xatoul(p);
84     #else
85     count = xatoul_sfx(p, head_suffixes);
86     #endif
87     break;
88     default:
89     bb_show_usage();
90     }
91     }
92    
93     argv += optind;
94     if (!*argv) {
95     *--argv = "-";
96     }
97    
98     fmt = header_fmt_str + 1;
99     #if ENABLE_FEATURE_FANCY_HEAD
100     if (argc - optind <= header_threshhold) {
101     header_threshhold = 0;
102     }
103     #else
104     if (argc <= optind + 1) {
105     fmt += 11;
106     }
107     /* Now define some things here to avoid #ifdefs in the code below.
108     * These should optimize out of the if conditions below. */
109     #define header_threshhold 1
110     #define count_bytes 0
111     #endif
112    
113     do {
114     fp = fopen_or_warn_stdin(*argv);
115     if (fp) {
116     if (fp == stdin) {
117     *argv = (char *) bb_msg_standard_input;
118     }
119     if (header_threshhold) {
120     printf(fmt, *argv);
121     }
122     i = count;
123     while (i && ((c = getc(fp)) != EOF)) {
124     if (count_bytes || (c == '\n')) {
125     --i;
126     }
127     putchar(c);
128     }
129     if (fclose_if_not_stdin(fp)) {
130     bb_perror_msg("%s", *argv); /* Avoid multibyte problems. */
131     retval = EXIT_FAILURE;
132     }
133     die_if_ferror_stdout();
134     }
135     fmt = header_fmt_str;
136     } while (*++argv);
137    
138     fflush_stdout_and_exit(retval);
139     }