forked from Imagelibrary/rtems
2008-03-04 Joel Sherrill <joel.sherrill@oarcorp.com>
* libmisc/Makefile.am, libmisc/shell/main_cp.c, libmisc/shell/main_cpuuse.c, libmisc/shell/main_date.c, libmisc/shell/main_mallocinfo.c, libmisc/shell/main_netstats.c, libmisc/shell/main_perioduse.c, libmisc/shell/main_stackuse.c, libmisc/shell/main_wkspaceinfo.c, libmisc/shell/print_heapinfo.c, libmisc/shell/shell.c, libmisc/shell/shell.h, libmisc/shell/shell_makeargs.c, libmisc/shell/shellconfig.c, libmisc/shell/shellconfig.h, libmisc/shell/write_file.c: Add initial capability to automatically execute a script from the filesystem. Add echo command from NetBSD and sleep command. * libmisc/shell/main_echo.c, libmisc/shell/main_sleep.c, libmisc/shell/shell_script.c: New files.
This commit is contained in:
@@ -1,3 +1,18 @@
|
||||
2008-03-04 Joel Sherrill <joel.sherrill@oarcorp.com>
|
||||
|
||||
* libmisc/Makefile.am, libmisc/shell/main_cp.c,
|
||||
libmisc/shell/main_cpuuse.c, libmisc/shell/main_date.c,
|
||||
libmisc/shell/main_mallocinfo.c, libmisc/shell/main_netstats.c,
|
||||
libmisc/shell/main_perioduse.c, libmisc/shell/main_stackuse.c,
|
||||
libmisc/shell/main_wkspaceinfo.c, libmisc/shell/print_heapinfo.c,
|
||||
libmisc/shell/shell.c, libmisc/shell/shell.h,
|
||||
libmisc/shell/shell_makeargs.c, libmisc/shell/shellconfig.c,
|
||||
libmisc/shell/shellconfig.h, libmisc/shell/write_file.c: Add initial
|
||||
capability to automatically execute a script from the filesystem. Add
|
||||
echo command from NetBSD and sleep command.
|
||||
* libmisc/shell/main_echo.c, libmisc/shell/main_sleep.c,
|
||||
libmisc/shell/shell_script.c: New files.
|
||||
|
||||
2008-02-28 Joel Sherrill <joel.sherrill@oarcorp.com>
|
||||
|
||||
* itron/include/rtems/itron/task.h, itron/src/cre_tsk.c,
|
||||
|
||||
@@ -68,20 +68,21 @@ libshell_a_SOURCES = shell/cat_file.c shell/cmds.c shell/internal.h \
|
||||
shell/main_alias.c shell/main_cat.c shell/main_cd.c \
|
||||
shell/main_chdir.c shell/main_chmod.c shell/main_chroot.c \
|
||||
shell/main_cp.c shell/main_cpuuse.c shell/main_date.c shell/main_dir.c \
|
||||
shell/main_exit.c shell/main_help.c shell/main_id.c \
|
||||
shell/main_echo.c shell/main_exit.c shell/main_help.c shell/main_id.c \
|
||||
shell/main_logoff.c shell/main_ls.c shell/main_mallocinfo.c \
|
||||
shell/main_mdump.c shell/main_medit.c shell/main_mfill.c \
|
||||
shell/main_mkdir.c shell/main_mount.c $(shell_mount_fs) \
|
||||
shell/main_mount_msdos.c shell/main_mmove.c shell/main_msdosfmt.c \
|
||||
shell/main_mwdump.c shell/main_perioduse.c shell/main_pwd.c \
|
||||
shell/main_rm.c shell/main_rmdir.c shell/main_stackuse.c \
|
||||
shell/main_tty.c shell/main_umask.c shell/main_unmount.c \
|
||||
shell/main_blksync.c shell/main_whoami.c shell/shell.c \
|
||||
shell/shell_cmdset.c shell/shellconfig.c shell/shellconfig.h \
|
||||
shell/main_rm.c shell/main_rmdir.c shell/main_sleep.c \
|
||||
shell/main_stackuse.c shell/main_tty.c shell/main_umask.c \
|
||||
shell/main_unmount.c shell/main_blksync.c shell/main_whoami.c \
|
||||
shell/shell.c shell/shell_cmdset.c shell/shellconfig.c shell/shellconfig.h \
|
||||
shell/shell.h shell/shell_makeargs.c shell/str2int.c shell/write_file.c \
|
||||
shell/utils-cp.c shell/err.c shell/errx.c shell/verr.c shell/verrx.c \
|
||||
shell/vwarn.c shell/vwarnx.c shell/warn.c shell/warnx.c \
|
||||
shell/fts.c shell/print_heapinfo.c shell/main_wkspaceinfo.c
|
||||
shell/fts.c shell/print_heapinfo.c shell/main_wkspaceinfo.c \
|
||||
shell/shell_script.c
|
||||
if LIBNETWORKING
|
||||
libshell_a_SOURCES += shell/main_mount_ftp.c shell/main_mount_tftp.c \
|
||||
shell/main_ifconfig.c shell/main_route.c shell/main_netstats.c \
|
||||
|
||||
@@ -523,7 +523,7 @@ mastercmp(const FTSENT **a, const FTSENT **b)
|
||||
|
||||
rtems_shell_cmd_t rtems_shell_CP_Command = {
|
||||
"cp", /* name */
|
||||
"cp [-R [-H | -L | -P]] [-f | -i] [-pv] src target # copy", /* usage */
|
||||
"cp [-R [-H | -L | -P]] [-f | -i] [-pv] src target", /* usage */
|
||||
"files", /* topic */
|
||||
rtems_shell_main_cp, /* command */
|
||||
NULL, /* alias */
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* CPUUSE Command Implementation
|
||||
*
|
||||
* COPYRIGHT (c) 1989-2007.
|
||||
* COPYRIGHT (c) 1989-2008.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
/*
|
||||
* DATE Shell Command Implmentation
|
||||
*
|
||||
* Author: Fernando RUIZ CASAS
|
||||
* OAuthor: Fernando RUIZ CASAS
|
||||
* Work: fernando.ruiz@ctv.es
|
||||
* Home: correo@fernando-ruiz.com
|
||||
*
|
||||
* Significantly rewritten by Joel Sherrill <joel.sherrill@oarcorp.com>.
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.com/license/LICENSE.
|
||||
|
||||
142
cpukit/libmisc/shell/main_echo.c
Normal file
142
cpukit/libmisc/shell/main_echo.c
Normal file
@@ -0,0 +1,142 @@
|
||||
/* $NetBSD: echo.c,v 1.12 2005/02/06 04:43:43 perry Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1991, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Kenneth Almquist.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)echo.c 8.1 (Berkeley) 5/31/93
|
||||
*/
|
||||
|
||||
/*
|
||||
* Echo command.
|
||||
*
|
||||
* echo is steeped in tradition - several of them!
|
||||
* netbsd has supported 'echo [-n | -e] args' in spite of -e not being
|
||||
* documented anywhere.
|
||||
* Posix requires that -n be supported, output from strings containing
|
||||
* \ is implementation defined
|
||||
* The Single Unix Spec requires that \ escapes be treated as if -e
|
||||
* were set, but that -n not be treated as an option.
|
||||
* (ksh supports 'echo [-eEn] args', but not -- so that it is actually
|
||||
* impossible to actually output '-n')
|
||||
*
|
||||
* It is suggested that 'printf "%b" "string"' be used to get \ sequences
|
||||
* expanded. printf is now a builtin of netbsd's sh and csh.
|
||||
*/
|
||||
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <rtems.h>
|
||||
#include <rtems/shell.h>
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
|
||||
int rtems_shell_main_echo(
|
||||
int argc,
|
||||
char *argv[]
|
||||
)
|
||||
{
|
||||
char **ap;
|
||||
char *p;
|
||||
char c;
|
||||
int count;
|
||||
int nflag = 0;
|
||||
int eflag = 0;
|
||||
|
||||
ap = argv;
|
||||
if (argc)
|
||||
ap++;
|
||||
|
||||
if ((p = *ap) != NULL) {
|
||||
if (!strcmp(p, "-n")) {
|
||||
nflag = 1;
|
||||
ap++;
|
||||
} else if (!strcmp(p, "-e")) {
|
||||
eflag = 1;
|
||||
ap++;
|
||||
}
|
||||
}
|
||||
|
||||
while ((p = *ap++) != NULL) {
|
||||
while ((c = *p++) != '\0') {
|
||||
if (c == '\\' && eflag) {
|
||||
switch (*p++) {
|
||||
case 'a': c = '\a'; break; /* bell */
|
||||
case 'b': c = '\b'; break;
|
||||
case 'c': return 0; /* exit */
|
||||
case 'e': c = 033; break; /* escape */
|
||||
case 'f': c = '\f'; break;
|
||||
case 'n': c = '\n'; break;
|
||||
case 'r': c = '\r'; break;
|
||||
case 't': c = '\t'; break;
|
||||
case 'v': c = '\v'; break;
|
||||
case '\\': break; /* c = '\\' */
|
||||
case '0':
|
||||
c = 0;
|
||||
count = 3;
|
||||
while (--count >= 0 && (unsigned)(*p - '0') < 8)
|
||||
c = (c << 3) + (*p++ - '0');
|
||||
break;
|
||||
default:
|
||||
/* Output the '/' and char following */
|
||||
p--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
putchar(c);
|
||||
}
|
||||
if (*ap)
|
||||
putchar(' ');
|
||||
}
|
||||
if (! nflag)
|
||||
putchar('\n');
|
||||
return 0;
|
||||
}
|
||||
|
||||
rtems_shell_cmd_t rtems_shell_ECHO_Command = {
|
||||
"echo", /* name */
|
||||
"echo [args]", /* usage */
|
||||
"misc", /* topic */
|
||||
rtems_shell_main_echo, /* command */
|
||||
NULL, /* alias */
|
||||
NULL /* next */
|
||||
};
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* MALLOC_INFO Shell Command Implmentation
|
||||
*
|
||||
* COPYRIGHT (c) 1989-2007.
|
||||
* COPYRIGHT (c) 1989-2008.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Network Statistics Shell Command Implmentation
|
||||
*
|
||||
* COPYRIGHT (c) 1989-2007.
|
||||
* COPYRIGHT (c) 1989-2008.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
@@ -52,9 +52,12 @@ int rtems_shell_main_netstats( /* command */
|
||||
int doICMPStats = 0;
|
||||
int doUDPStats = 0;
|
||||
int doTCPStats = 0;
|
||||
int verbose = 0;
|
||||
struct getopt_data getopt_reent;
|
||||
|
||||
while ( (option = getopt( argc, argv, "Aimfpcutv")) != -1 ) {
|
||||
switch (option) {
|
||||
while ( (option = getopt_r( argc, argv, "Aimfpcutv", &getopt_reent)) != -1 ) {
|
||||
|
||||
switch ((char)option) {
|
||||
case 'A': doAll = 1; break;
|
||||
case 'i': doInetRoutes = 1; break;
|
||||
case 'm': doMBUFStats = 1; break;
|
||||
@@ -63,6 +66,7 @@ int rtems_shell_main_netstats( /* command */
|
||||
case 'c': doICMPStats = 1; break;
|
||||
case 'u': doUDPStats = 1; break;
|
||||
case 't': doTCPStats = 1; break;
|
||||
case 'v': verbose = 1; break;
|
||||
case '?':
|
||||
default:
|
||||
netstats_usage();
|
||||
@@ -70,21 +74,57 @@ int rtems_shell_main_netstats( /* command */
|
||||
}
|
||||
}
|
||||
|
||||
if ( doInetRoutes == 1 || doAll == 1 )
|
||||
rtems_bsdnet_show_inet_routes();
|
||||
if ( doMBUFStats == 1 || doAll == 1 )
|
||||
rtems_bsdnet_show_mbuf_stats();
|
||||
if ( doIFStats == 1 || doAll == 1 )
|
||||
rtems_bsdnet_show_if_stats();
|
||||
if ( doIPStats == 1 || doAll == 1 )
|
||||
rtems_bsdnet_show_ip_stats();
|
||||
if ( doICMPStats == 1 || doAll == 1 )
|
||||
rtems_bsdnet_show_icmp_stats();
|
||||
if ( doUDPStats == 1 || doAll == 1 )
|
||||
rtems_bsdnet_show_udp_stats();
|
||||
if ( doTCPStats == 1 || doAll == 1 )
|
||||
rtems_bsdnet_show_tcp_stats();
|
||||
if ( verbose ) {
|
||||
printf(
|
||||
"doAll=%d\n"
|
||||
"doInetRoutes=%d\n"
|
||||
"doMBUFStats=%d\n"
|
||||
"doIFStats=%d\n"
|
||||
"doIPStats=%d\n"
|
||||
"doICMPStats=%d\n"
|
||||
"doUDPStats=%d\n"
|
||||
"doTCPStats=%d\n",
|
||||
doAll,
|
||||
doInetRoutes,
|
||||
doMBUFStats,
|
||||
doIFStats,
|
||||
doIPStats,
|
||||
doICMPStats,
|
||||
doUDPStats,
|
||||
doTCPStats
|
||||
);
|
||||
}
|
||||
|
||||
#if 0
|
||||
if ( doInetRoutes == 1 || doAll == 1 ) {
|
||||
rtems_bsdnet_show_inet_routes();
|
||||
}
|
||||
|
||||
if ( doMBUFStats == 1 || doAll == 1 ) {
|
||||
rtems_bsdnet_show_mbuf_stats();
|
||||
}
|
||||
|
||||
if ( doIFStats == 1 || doAll == 1 ) {
|
||||
rtems_bsdnet_show_if_stats();
|
||||
}
|
||||
|
||||
if ( doIPStats == 1 || doAll == 1 ) {
|
||||
rtems_bsdnet_show_ip_stats();
|
||||
}
|
||||
|
||||
if ( doICMPStats == 1 || doAll == 1 ) {
|
||||
rtems_bsdnet_show_icmp_stats();
|
||||
}
|
||||
|
||||
if ( doUDPStats == 1 || doAll == 1 ) {
|
||||
rtems_bsdnet_show_udp_stats();
|
||||
}
|
||||
|
||||
if ( doTCPStats == 1 || doAll == 1 ) {
|
||||
rtems_bsdnet_show_tcp_stats();
|
||||
}
|
||||
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* perioduse Command Implementation
|
||||
*
|
||||
* COPYRIGHT (c) 1989-2007.
|
||||
* COPYRIGHT (c) 1989-2008.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
|
||||
57
cpukit/libmisc/shell/main_sleep.c
Normal file
57
cpukit/libmisc/shell/main_sleep.c
Normal file
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Sleep Shell Command Implmentation
|
||||
*
|
||||
* COPYRIGHT (c) 1989-2008.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.com/license/LICENSE.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <rtems.h>
|
||||
#include <rtems/shell.h>
|
||||
#include "internal.h"
|
||||
|
||||
int rtems_shell_main_sleep(
|
||||
int argc,
|
||||
char *argv[]
|
||||
)
|
||||
{
|
||||
struct timespec delay;
|
||||
|
||||
if (argc == 2) {
|
||||
delay.tv_sec = rtems_shell_str2int(argv[1]);
|
||||
delay.tv_nsec = 0;
|
||||
nanosleep( &delay, NULL );
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (argc == 3) {
|
||||
delay.tv_sec = rtems_shell_str2int(argv[1]);
|
||||
delay.tv_nsec = rtems_shell_str2int(argv[2]);
|
||||
nanosleep( &delay, NULL );
|
||||
return 0;
|
||||
}
|
||||
|
||||
fprintf( stderr, "%s: Usage seconds [nanoseconds]\n", argv[0] );
|
||||
return -1;
|
||||
}
|
||||
|
||||
rtems_shell_cmd_t rtems_shell_SLEEP_Command = {
|
||||
"sleep", /* name */
|
||||
"sleep seconds [nanoseconds]", /* usage */
|
||||
"misc", /* topic */
|
||||
rtems_shell_main_sleep, /* command */
|
||||
NULL, /* alias */
|
||||
NULL /* next */
|
||||
};
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* stackuse Command Implementation
|
||||
*
|
||||
* COPYRIGHT (c) 1989-2007.
|
||||
* COPYRIGHT (c) 1989-2008.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* MALLOC_INFO Shell Command Implmentation
|
||||
*
|
||||
* COPYRIGHT (c) 1989-2007.
|
||||
* COPYRIGHT (c) 1989-2008.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Print Heap Information Structure
|
||||
*
|
||||
* COPYRIGHT (c) 1989-2007.
|
||||
* COPYRIGHT (c) 1989-2008.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
|
||||
@@ -371,6 +371,8 @@ rtems_boolean rtems_shell_main_loop(
|
||||
rtems_boolean result = TRUE;
|
||||
rtems_boolean input_file = FALSE;
|
||||
int line = 0;
|
||||
FILE *stdinToClose = NULL;
|
||||
FILE *stdoutToClose = NULL;
|
||||
|
||||
rtems_shell_initialize_command_set();
|
||||
|
||||
@@ -397,8 +399,9 @@ rtems_boolean rtems_shell_main_loop(
|
||||
|
||||
fileno(stdout);
|
||||
|
||||
fprintf( stderr,
|
||||
/* fprintf( stderr,
|
||||
"-%s-%s-\n", shell_env->input, shell_env->output );
|
||||
*/
|
||||
|
||||
if (shell_env->output && strcmp(shell_env->output, "stdout") != 0) {
|
||||
if (strcmp(shell_env->output, "stderr") == 0) {
|
||||
@@ -414,6 +417,7 @@ fprintf( stderr,
|
||||
return FALSE;
|
||||
}
|
||||
stdout = output;
|
||||
stdoutToClose = output;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -425,6 +429,7 @@ fprintf( stderr,
|
||||
return FALSE;
|
||||
}
|
||||
stdin = input;
|
||||
stdinToClose = input;
|
||||
shell_env->forever = FALSE;
|
||||
input_file = TRUE;
|
||||
}
|
||||
@@ -534,8 +539,7 @@ fprintf( stderr,
|
||||
if ( argv[0] == NULL ) {
|
||||
shell_env->errorlevel = -1;
|
||||
} else if ( shell_cmd == NULL ) {
|
||||
fprintf(stdout, "shell:%s command not found\n", argv[0]);
|
||||
shell_env->errorlevel = -1;
|
||||
shell_env->errorlevel = rtems_shell_script_file( argc, argv );
|
||||
} else {
|
||||
shell_env->errorlevel = shell_cmd->command(argc, argv);
|
||||
}
|
||||
@@ -551,6 +555,10 @@ fprintf( stderr,
|
||||
fflush( stderr );
|
||||
}
|
||||
} while (result && shell_env->forever);
|
||||
if ( stdinToClose )
|
||||
fclose( stdinToClose );
|
||||
if ( stdoutToClose )
|
||||
fclose( stdoutToClose );
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -73,9 +73,27 @@ int rtems_shell_make_args(
|
||||
int max_args
|
||||
);
|
||||
|
||||
int rtems_shell_scanline(char * line,int size,FILE * in,FILE * out) ;
|
||||
int rtems_shell_cat_file(FILE * out,char *name);
|
||||
void rtems_shell_write_file(char *name,char * content);
|
||||
int rtems_shell_scanline(
|
||||
char *line,
|
||||
int size,
|
||||
FILE *in,
|
||||
FILE *out
|
||||
);
|
||||
|
||||
int rtems_shell_cat_file(
|
||||
FILE *out,
|
||||
char *name
|
||||
);
|
||||
|
||||
void rtems_shell_write_file(
|
||||
const char *name,
|
||||
const char *content
|
||||
);
|
||||
|
||||
int rtems_shell_script_file(
|
||||
int argc,
|
||||
char *argv[]
|
||||
);
|
||||
|
||||
/**
|
||||
* Initialise the shell creating tasks to login and run the shell
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Split string into argc/argv style argument list
|
||||
*
|
||||
* COPYRIGHT (c) 1989-2007.
|
||||
* COPYRIGHT (c) 1989-2008.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
|
||||
327
cpukit/libmisc/shell/shell_script.c
Normal file
327
cpukit/libmisc/shell/shell_script.c
Normal file
@@ -0,0 +1,327 @@
|
||||
/*
|
||||
* Shell Script Invocation
|
||||
*
|
||||
* Pseudo-code from Chris Johns, implemented and debugged
|
||||
* by Joel Sherrill.
|
||||
*
|
||||
* COPYRIGHT (c) 1989-2008.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.com/license/LICENSE.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <inttypes.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <getopt.h>
|
||||
|
||||
#include <rtems.h>
|
||||
#include <rtems/shell.h>
|
||||
#include "internal.h"
|
||||
|
||||
static void rtems_shell_joel_usage()
|
||||
{
|
||||
printf(
|
||||
"joel [args] where args may be:\n"
|
||||
" -o FILE output file (default=stdout)\n"
|
||||
" -p PRIORITY task priority\n"
|
||||
" -s SIZE task stack size\n"
|
||||
" -t NAME task name\n"
|
||||
);
|
||||
}
|
||||
|
||||
int rtems_shell_main_decho(
|
||||
int argc,
|
||||
char **argv
|
||||
)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0 ; i<argc ; i++ )
|
||||
printf( "argv[%d] = -%s-\n", i, argv[i] );
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int findOnPATH(
|
||||
const char *userScriptName,
|
||||
char *scriptFile
|
||||
)
|
||||
{
|
||||
/*
|
||||
* If the user script name starts with a / assume it is a fully
|
||||
* qualified path name and just use it.
|
||||
*/
|
||||
if ( userScriptName[0] == '/' ) {
|
||||
strcpy( scriptFile, userScriptName );
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* For now, the provided name is just turned into a fully
|
||||
* qualified path name and used. There is no attempt to
|
||||
* search along a path for it.
|
||||
*/
|
||||
|
||||
getcwd( scriptFile, PATH_MAX );
|
||||
/* XXX should use strncat but what is the limit? */
|
||||
strcat( scriptFile, "/" );
|
||||
strcat( scriptFile, userScriptName );
|
||||
return 0;
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* Does the command (argv[0]) contain a path ?, i.e. starts with
|
||||
* '.' or contains a '/'?
|
||||
*/
|
||||
/* TODO: Add concept of PATH */
|
||||
if (!contains_path) {
|
||||
/* check PATH environment variable */
|
||||
for (path_part = PATH; path_part; skip to ':')
|
||||
{
|
||||
}
|
||||
if (not found)
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int rtems_shell_main_joel(
|
||||
int argc,
|
||||
char **argv
|
||||
)
|
||||
{
|
||||
int option;
|
||||
int sc;
|
||||
int verbose = 0;
|
||||
char *taskName = "JOEL";
|
||||
uint32_t stackSize = RTEMS_MINIMUM_STACK_SIZE * 10;
|
||||
rtems_task_priority taskPriority = 20;
|
||||
char *outputFile = "stdout";
|
||||
rtems_status_code result;
|
||||
char scriptFile[PATH_MAX];
|
||||
struct getopt_data getopt_reent;
|
||||
|
||||
while ( (option = getopt_r( argc, argv, "o:p:s:t:v", &getopt_reent)) != -1 ) {
|
||||
switch ((char)option) {
|
||||
case 'o':
|
||||
outputFile = getopt_reent.optarg;
|
||||
break;
|
||||
case 'p':
|
||||
taskPriority = rtems_shell_str2int(getopt_reent.optarg);
|
||||
break;
|
||||
case 's':
|
||||
stackSize = rtems_shell_str2int(getopt_reent.optarg);
|
||||
break;
|
||||
case 't':
|
||||
taskName = getopt_reent.optarg;
|
||||
break;
|
||||
case 'v':
|
||||
verbose = 1;
|
||||
break;
|
||||
case '?':
|
||||
default:
|
||||
rtems_shell_joel_usage();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if ( verbose ) {
|
||||
fprintf( stderr,
|
||||
"outputFile: %s\n"
|
||||
"taskPriority: %" PRId32 "\n"
|
||||
"stackSize: %" PRId32 "\n"
|
||||
"taskName: %s\n",
|
||||
outputFile,
|
||||
taskPriority,
|
||||
stackSize,
|
||||
taskName
|
||||
);
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify there is a script name past the end of the arguments.
|
||||
* Preincrement to skip program name.
|
||||
*/
|
||||
if ( getopt_reent.optind >= argc ) {
|
||||
fprintf( stderr, "Shell: No script to execute\n" );
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find script on the path.
|
||||
*
|
||||
* NOTE: It is terrible that this is done twice but it
|
||||
* seems to be the most expedient thing.
|
||||
*/
|
||||
sc = findOnPATH( argv[getopt_reent.optind], scriptFile );
|
||||
if ( sc ) {
|
||||
fprintf( stderr, "%s not found on PATH\n", argv[0] );
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* fprintf( stderr, "SCRIPT: -%s-\n", scriptFile ); */
|
||||
|
||||
/*
|
||||
* I assume that argv[optind...] will have the arguments to
|
||||
* the shell script. But that remains to be implemented.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Run the script
|
||||
*/
|
||||
result = rtems_shell_script(
|
||||
taskName, /* the name of the task */
|
||||
stackSize, /* stack size */
|
||||
taskPriority, /* task priority */
|
||||
scriptFile, /* the script file */
|
||||
outputFile, /* where to redirect the script */
|
||||
0, /* run once and exit */
|
||||
1 /* we will wait */
|
||||
);
|
||||
if (result)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
rtems_shell_cmd_t rtems_shell_JOEL_Command = {
|
||||
"joel", /* name */
|
||||
"joel [args] SCRIPT", /* usage */
|
||||
"misc", /* topic */
|
||||
rtems_shell_main_joel, /* command */
|
||||
NULL, /* alias */
|
||||
NULL /* next */
|
||||
};
|
||||
|
||||
/*
|
||||
* This is a helper function which takes a command as arguments
|
||||
* which has not been located as a built-in command and attempts
|
||||
* to find something in the filesystem with the same name that
|
||||
* appears to be a shell script.
|
||||
*/
|
||||
int rtems_shell_script_file(
|
||||
int argc,
|
||||
char *argv[]
|
||||
)
|
||||
{
|
||||
#define FIRST_LINE_LENGTH 128
|
||||
#define SCRIPT_ARGV_LIMIT 32
|
||||
char scriptFile[PATH_MAX];
|
||||
char *scriptHead;
|
||||
char scriptHeadBuffer[FIRST_LINE_LENGTH];
|
||||
int sc;
|
||||
FILE *script;
|
||||
size_t length;
|
||||
int scriptArgc;
|
||||
char *scriptArgv[SCRIPT_ARGV_LIMIT];
|
||||
|
||||
/*
|
||||
* Clear argv pointer array
|
||||
*/
|
||||
for ( scriptArgc=0 ; scriptArgc<SCRIPT_ARGV_LIMIT ; scriptArgc++ )
|
||||
scriptArgv[scriptArgc] = NULL;
|
||||
|
||||
/*
|
||||
* Find argv[0] on the path
|
||||
*/
|
||||
sc = findOnPATH( argv[0], scriptFile );
|
||||
if ( sc ) {
|
||||
fprintf( stderr, "%s not found on PATH\n", argv[0] );
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Open the file so we can see if it looks like a script.
|
||||
*/
|
||||
script = fopen( scriptFile, "r" );
|
||||
if ( !script ) {
|
||||
fprintf( stderr, "%s: Unable to open %s\n", argv[0], scriptFile );
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Is the script OK to run?
|
||||
* Verify the current user has permission to execute it.
|
||||
*
|
||||
* NOTE: May not work on all file systems
|
||||
*/
|
||||
sc = access( scriptFile, X_OK );
|
||||
if ( sc ) {
|
||||
fprintf( stderr, "Unable to execute %s\n", scriptFile );
|
||||
fclose( script );
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to read the first line from the potential script file
|
||||
*/
|
||||
scriptHead = fgets(scriptHeadBuffer, FIRST_LINE_LENGTH, script);
|
||||
if ( !scriptHead ) {
|
||||
fprintf(
|
||||
stderr, "%s: Unable to read first line of %s\n", argv[0], scriptFile );
|
||||
fclose( script );
|
||||
return -1;
|
||||
}
|
||||
|
||||
fclose(script);
|
||||
|
||||
length = strnlen(scriptHead, FIRST_LINE_LENGTH);
|
||||
scriptHead[length - 1] = '\0';
|
||||
|
||||
/* fprintf( stderr, "FIRST LINE: -%s-\n", scriptHead ); */
|
||||
|
||||
/*
|
||||
* Verify the name of the "shell" is joel. This means
|
||||
* the line starts with "#! joel".
|
||||
*/
|
||||
if (strncmp("#! joel", scriptHead, 7) != 0) {
|
||||
fprintf( stderr, "%s: Not a joel script %s\n", argv[0], scriptFile );
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Do not worry about search path further. We have found the
|
||||
* script, it is executable, and we have successfully read the
|
||||
* first line and found out it is a script.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Check for arguments in fist line of the script. This changes
|
||||
* how the shell task is run.
|
||||
*/
|
||||
|
||||
sc = rtems_shell_make_args(
|
||||
&scriptHead[3],
|
||||
&scriptArgc,
|
||||
scriptArgv,
|
||||
SCRIPT_ARGV_LIMIT - 1
|
||||
);
|
||||
if ( sc ) {
|
||||
fprintf(
|
||||
stderr, "%s: Error parsing joel arguments %s\n", argv[0], scriptFile );
|
||||
return -1;
|
||||
}
|
||||
|
||||
scriptArgv[ scriptArgc++ ] = scriptFile;
|
||||
|
||||
/*
|
||||
* TODO: How do we pass arguments from here to the script?
|
||||
* At this point, it doesn't matter because we don't
|
||||
* have any way for a shell script to access them.
|
||||
*/
|
||||
return rtems_shell_main_joel( scriptArgc, scriptArgv );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
/*
|
||||
* RTEMS Shell Command Set -- DEFAULT Configuration
|
||||
*
|
||||
* COPYRIGHT (c) 1989-2008.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.com/license/LICENSE.
|
||||
|
||||
@@ -29,7 +29,10 @@ extern rtems_shell_cmd_t rtems_shell_MEDIT_Command;
|
||||
extern rtems_shell_cmd_t rtems_shell_MFILL_Command;
|
||||
extern rtems_shell_cmd_t rtems_shell_MMOVE_Command;
|
||||
|
||||
extern rtems_shell_cmd_t rtems_shell_JOEL_Command;
|
||||
extern rtems_shell_cmd_t rtems_shell_DATE_Command;
|
||||
extern rtems_shell_cmd_t rtems_shell_ECHO_Command;
|
||||
extern rtems_shell_cmd_t rtems_shell_SLEEP_Command;
|
||||
extern rtems_shell_cmd_t rtems_shell_ID_Command;
|
||||
extern rtems_shell_cmd_t rtems_shell_TTY_Command;
|
||||
extern rtems_shell_cmd_t rtems_shell_WHOAMI_Command;
|
||||
@@ -143,11 +146,26 @@ extern rtems_shell_filesystems_t *rtems_shell_Mount_filesystems[];
|
||||
/*
|
||||
* Common commands that can be optional
|
||||
*/
|
||||
#if (defined(CONFIGURE_SHELL_COMMANDS_ALL) && \
|
||||
!defined(CONFIGURE_SHELL_NO_COMMAND_JOEL)) || \
|
||||
defined(CONFIGURE_SHELL_COMMAND_JOEL)
|
||||
&rtems_shell_JOEL_Command,
|
||||
#endif
|
||||
#if (defined(CONFIGURE_SHELL_COMMANDS_ALL) && \
|
||||
!defined(CONFIGURE_SHELL_NO_COMMAND_DATE)) || \
|
||||
defined(CONFIGURE_SHELL_COMMAND_DATE)
|
||||
&rtems_shell_DATE_Command,
|
||||
#endif
|
||||
#if (defined(CONFIGURE_SHELL_COMMANDS_ALL) && \
|
||||
!defined(CONFIGURE_SHELL_NO_COMMAND_ECHO)) || \
|
||||
defined(CONFIGURE_SHELL_COMMAND_ECHO)
|
||||
&rtems_shell_ECHO_Command,
|
||||
#endif
|
||||
#if (defined(CONFIGURE_SHELL_COMMANDS_ALL) && \
|
||||
!defined(CONFIGURE_SHELL_NO_COMMAND_SLEEP)) || \
|
||||
defined(CONFIGURE_SHELL_COMMAND_SLEEP)
|
||||
&rtems_shell_SLEEP_Command,
|
||||
#endif
|
||||
#if (defined(CONFIGURE_SHELL_COMMANDS_ALL) && \
|
||||
!defined(CONFIGURE_SHELL_NO_COMMAND_ID)) || \
|
||||
defined(CONFIGURE_SHELL_COMMAND_ID)
|
||||
|
||||
@@ -23,13 +23,17 @@
|
||||
#include <string.h>
|
||||
|
||||
void rtems_shell_write_file(
|
||||
char *name,
|
||||
char * content
|
||||
const char *name,
|
||||
const char *content
|
||||
)
|
||||
{
|
||||
FILE * fd;
|
||||
|
||||
fd = fopen(name,"w");
|
||||
if ( !fd ) {
|
||||
fprintf( stderr, "Unable to write %s\n", name );
|
||||
}
|
||||
|
||||
if (fd) {
|
||||
fwrite(content,1,strlen(content),fd);
|
||||
fclose(fd);
|
||||
|
||||
Reference in New Issue
Block a user