| /* |
| * echo.c - echo arguments to stdout or into a file |
| * |
| * Copyright (c) 2007 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix |
| * |
| * See file CREDITS for list of people who contributed to this |
| * project. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 |
| * as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| |
| #include <common.h> |
| #include <command.h> |
| #include <fs.h> |
| #include <fcntl.h> |
| #include <errno.h> |
| #include <libbb.h> |
| |
| static int do_echo(struct command *cmdtp, int argc, char *argv[]) |
| { |
| int i, optind = 1; |
| int fd = stdout, opt, newline = 1; |
| char *file = NULL; |
| int oflags = O_WRONLY | O_CREAT; |
| #ifdef CONFIG_CMD_ECHO_E |
| char str[CONFIG_CBSIZE]; |
| int process_escape = 0; |
| #endif |
| /* We can't use getopt() here because we want to |
| * echo all things we don't understand. |
| */ |
| while (optind < argc && *argv[optind] == '-') { |
| if (!*(argv[optind] + 1) || *(argv[optind] + 2)) |
| break; |
| |
| opt = *(argv[optind] + 1); |
| switch (opt) { |
| case 'n': |
| newline = 0; |
| break; |
| case 'a': |
| oflags |= O_APPEND; |
| if (optind + 1 < argc) |
| file = argv[optind + 1]; |
| else |
| goto no_optarg_out; |
| optind++; |
| break; |
| case 'o': |
| oflags |= O_TRUNC; |
| file = argv[optind + 1]; |
| if (optind + 1 < argc) |
| file = argv[optind + 1]; |
| else |
| goto no_optarg_out; |
| optind++; |
| break; |
| #ifdef CONFIG_CMD_ECHO_E |
| case 'e': |
| process_escape = 1; |
| break; |
| #endif |
| default: |
| goto exit_parse; |
| } |
| optind++; |
| } |
| |
| exit_parse: |
| if (file) { |
| fd = open(file, oflags); |
| if (fd < 0) { |
| perror("open"); |
| return 1; |
| } |
| } |
| |
| for (i = optind; i < argc; i++) { |
| if (i > optind) |
| fputc(fd, ' '); |
| #ifdef CONFIG_CMD_ECHO_E |
| if (process_escape) { |
| process_escape_sequence(argv[i], str, CONFIG_CBSIZE); |
| fputs(fd, str); |
| } else |
| #endif |
| fputs(fd, argv[i]); |
| } |
| |
| if (newline) |
| fputc(fd, '\n'); |
| |
| if (file) |
| close(fd); |
| |
| return 0; |
| |
| no_optarg_out: |
| printf("option requires an argument -- %c\n", opt); |
| return 1; |
| } |
| |
| BAREBOX_CMD_HELP_START(echo) |
| BAREBOX_CMD_HELP_USAGE("echo [OPTIONS] [STRING]\n") |
| BAREBOX_CMD_HELP_SHORT("Display a line of text.\n") |
| BAREBOX_CMD_HELP_OPT ("-n", "do not output the trailing newline\n") |
| BAREBOX_CMD_HELP_OPT ("-a", "FIXME\n") |
| BAREBOX_CMD_HELP_OPT ("-o", "FIXME\n") |
| BAREBOX_CMD_HELP_OPT ("-e", "FIXME\n") |
| BAREBOX_CMD_HELP_END |
| |
| /** |
| * @page echo_command |
| |
| \todo Add documentation for -a, -o and -e. |
| |
| */ |
| |
| BAREBOX_CMD_START(echo) |
| .cmd = do_echo, |
| .usage = "echo args to console", |
| BAREBOX_CMD_HELP(cmd_echo_help) |
| BAREBOX_CMD_END |
| |