source: mainline/uspace/app/bdsh/cmds/modules/cat/cat.c@ 92fd52d7

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 92fd52d7 was 2953f9a, checked in by Jiri Svoboda <jirik.svoboda@…>, 17 years ago

Fix bdsh/cat crash. Also fix error in zero-trailing the buffer.

  • Property mode set to 100644
File size: 4.6 KB
Line 
1/* Copyright (c) 2008, Tim Post <tinkertim@gmail.com>
2 * All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 *
10 * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * Neither the name of the original program's authors nor the names of its
15 * contributors may be used to endorse or promote products derived from this
16 * software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#include <stdio.h>
32#include <stdlib.h>
33#include <unistd.h>
34#include <getopt.h>
35#include <string.h>
36#include <fcntl.h>
37
38#include "config.h"
39#include "util.h"
40#include "errors.h"
41#include "entry.h"
42#include "cat.h"
43#include "cmds.h"
44
45static char *cmdname = "cat";
46#define CAT_VERSION "0.0.1"
47#define CAT_DEFAULT_BUFLEN 1024
48
49static char *cat_oops = "That option is not yet supported\n";
50
51static struct option const long_options[] = {
52 { "help", no_argument, 0, 'h' },
53 { "version", no_argument, 0, 'v' },
54 { "head", required_argument, 0, 'H' },
55 { "tail", required_argument, 0, 't' },
56 { "buffer", required_argument, 0, 'b' },
57 { "more", no_argument, 0, 'm' },
58 { 0, 0, 0, 0 }
59};
60
61/* Dispays help for cat in various levels */
62void help_cmd_cat(unsigned int level)
63{
64 if (level == HELP_SHORT) {
65 printf("`%s' shows the contents of files\n", cmdname);
66 } else {
67 help_cmd_cat(HELP_SHORT);
68 printf(
69 "Usage: %s [options] <file1> [file2] [...]\n"
70 "Options:\n"
71 " -h, --help A short option summary\n"
72 " -v, --version Print version information and exit\n"
73 " -H, --head ## Print only the first ## bytes\n"
74 " -t, --tail ## Print only the last ## bytes\n"
75 " -b, --buffer ## Set the read buffer size to ##\n"
76 " -m, --more Pause after each screen full\n"
77 "Currently, %s is under development, some options don't work.\n",
78 cmdname, cmdname);
79 }
80
81 return;
82}
83
84static unsigned int cat_file(const char *fname, size_t blen)
85{
86 int fd, bytes = 0, count = 0, reads = 0;
87 off_t total = 0;
88 char *buff = NULL;
89
90 if (-1 == (fd = open(fname, O_RDONLY))) {
91 printf("Unable to open %s\n", fname);
92 return 1;
93 }
94
95 total = lseek(fd, 0, SEEK_END);
96 lseek(fd, 0, SEEK_SET);
97
98 if (NULL == (buff = (char *) malloc(blen + 1))) {
99 close(fd);
100 printf("Unable to allocate enough memory to read %s\n",
101 fname);
102 return 1;
103 }
104
105 do {
106 bytes = read(fd, buff, blen);
107 if (bytes > 0) {
108 count += bytes;
109 buff[bytes] = '\0';
110 printf("%s", buff);
111 reads++;
112 }
113 } while (bytes > 0);
114
115 close(fd);
116 if (bytes == -1) {
117 printf("Error reading %s\n", fname);
118 free(buff);
119 return 1;
120 }
121
122 free(buff);
123
124 return 0;
125}
126
127/* Main entry point for cat, accepts an array of arguments */
128int cmd_cat(char **argv)
129{
130 unsigned int argc, i, ret = 0, buffer = 0;
131 int c, opt_ind;
132
133 argc = cli_count_args(argv);
134
135 for (c = 0, optind = 0, opt_ind = 0; c != -1;) {
136 c = getopt_long(argc, argv, "hvmH:t:b:", long_options, &opt_ind);
137 switch (c) {
138 case 'h':
139 help_cmd_cat(HELP_LONG);
140 return CMD_SUCCESS;
141 case 'v':
142 printf("%s\n", CAT_VERSION);
143 return CMD_SUCCESS;
144 case 'H':
145 printf(cat_oops);
146 return CMD_FAILURE;
147 case 't':
148 printf(cat_oops);
149 return CMD_FAILURE;
150 case 'b':
151 printf(cat_oops);
152 break;
153 case 'm':
154 printf(cat_oops);
155 return CMD_FAILURE;
156 }
157 }
158
159 argc -= optind;
160
161 if (argc < 1) {
162 printf("%s - incorrect number of arguments. Try `%s --help'\n",
163 cmdname, cmdname);
164 return CMD_FAILURE;
165 }
166
167 if (buffer <= 0)
168 buffer = CAT_DEFAULT_BUFLEN;
169
170 for (i = optind; argv[i] != NULL; i++)
171 ret += cat_file(argv[i], buffer);
172
173 if (ret)
174 return CMD_FAILURE;
175 else
176 return CMD_SUCCESS;
177}
178
Note: See TracBrowser for help on using the repository browser.