|
@@ -303,6 +303,23 @@ char * concat_args ( char **args ) {
|
303
|
303
|
return string;
|
304
|
304
|
}
|
305
|
305
|
|
|
306
|
+/** "echo" options */
|
|
307
|
+struct echo_options {
|
|
308
|
+ /** Do not print trailing newline */
|
|
309
|
+ int no_newline;
|
|
310
|
+};
|
|
311
|
+
|
|
312
|
+/** "echo" option list */
|
|
313
|
+static struct option_descriptor echo_opts[] = {
|
|
314
|
+ OPTION_DESC ( "n", 'n', no_argument,
|
|
315
|
+ struct echo_options, no_newline, parse_flag ),
|
|
316
|
+};
|
|
317
|
+
|
|
318
|
+/** "echo" command descriptor */
|
|
319
|
+static struct command_descriptor echo_cmd =
|
|
320
|
+ COMMAND_DESC ( struct echo_options, echo_opts, 0, MAX_ARGUMENTS,
|
|
321
|
+ "[-n] [...]" );
|
|
322
|
+
|
306
|
323
|
/**
|
307
|
324
|
* "echo" command
|
308
|
325
|
*
|
|
@@ -310,13 +327,23 @@ char * concat_args ( char **args ) {
|
310
|
327
|
* @v argv Argument list
|
311
|
328
|
* @ret rc Return status code
|
312
|
329
|
*/
|
313
|
|
-static int echo_exec ( int argc __unused, char **argv ) {
|
|
330
|
+static int echo_exec ( int argc, char **argv ) {
|
|
331
|
+ struct echo_options opts;
|
314
|
332
|
char *text;
|
|
333
|
+ int rc;
|
315
|
334
|
|
316
|
|
- text = concat_args ( &argv[1] );
|
|
335
|
+ /* Parse options */
|
|
336
|
+ if ( ( rc = parse_options ( argc, argv, &echo_cmd, &opts ) ) != 0 )
|
|
337
|
+ return rc;
|
|
338
|
+
|
|
339
|
+ /* Parse text */
|
|
340
|
+ text = concat_args ( &argv[optind] );
|
317
|
341
|
if ( ! text )
|
318
|
342
|
return -ENOMEM;
|
319
|
|
- printf ( "%s\n", text );
|
|
343
|
+
|
|
344
|
+ /* Print text */
|
|
345
|
+ printf ( "%s%s", text, ( opts.no_newline ? "" : "\n" ) );
|
|
346
|
+
|
320
|
347
|
free ( text );
|
321
|
348
|
return 0;
|
322
|
349
|
}
|