Files
rtems/cpukit/libmisc/shell/shell.h
Chris Johns 7baa484300 2009-06-12 Chris Johns <chrisj@rtems.org>
* libblock/src/bdbuf.c: Update comments.
        * libblock/src/bdpart.c, libblock/src/ide_part_table.c: Get the
        device from the rdev field of the stat buf.
        * libcsupport/include/rtems/libio.h: Add a path length to evalpath
        handler. Add parent locations to rmmod and unlink handlers.
        * libcsupport/include/rtems/libio_.h: Add a path length to
        rtems_filesystem_evaluate_path. Add
        rtems_filesystem_evaluate_relative_path, rtems_filesystem_dirname,
        and rtems_filesystem_prefix_separators. Remove
        rtems_filesystem_evaluate_parent.
        * libcsupport/src/base_fs.c, libcsupport/src/chdir.c,
        libcsupport/src/chmod.c, libcsupport/src/chown.c,
        libcsupport/src/chroot.c, libcsupport/src/fchdir.c,
        libcsupport/src/link.c, libcsupport/src/mount.c,
        libcsupport/src/open.c, libcsupport/src/privateenv.c,
        libcsupport/src/readlink.c, libcsupport/src/unmount.c,
        libcsupport/src/utime.c, libcsupport/src/unmount.c,
        libcsupport/src/utime.c, libfs/src/devfs/devfs.h,
        libfs/src/devfs/devfs_eval.c, libfs/src/devfs/devstat.c,
        libfs/src/dosfs/msdos_create.c, libfs/src/dosfs/msdos_misc.c,
        libfs/src/imfs/imfs.h, libfs/src/imfs/imfs_eval.c,
        libfs/src/imfs/imfs_load_tar.c, libfs/src/imfs/ioman.c,
        libfs/src/pipe/pipe.c, libmisc/fsmount/fsmount.c,
        libnetworking/lib/ftpfs.c: Add the length parameter to the eval
        call.
        * libcsupport/src/eval.c: Add rtems_filesystem_prefix_separators,
        rtems_filesystem_dirname,
        rtems_filesystem_evaluate_relative_path. Add the length parameter
        to the eval call.
        * libcsupport/src/rmdir.c: Find the parent pathloc then the node
        pathloc from that node. Remove the call to find the parent given
        the node pathloc.
        * libcsupport/src/stat.c: Add the length parameter to the eval
        call. Set the device into the rdev field.
        * libcsupport/src/unlink.c: Find the parent pathloc then the node
        pathloc from that node. Remove the call to find the parent given
        the node pathloc.
        * libfs/src/dosfs/fat.c, libfs/src/dosfs/msdos_format.c: Get the
        disk device number from the stat rdev field.
        * libfs/src/dosfs/msdos.h: Add the length parameter to the eval
        call. Add the parent pathloc to the rmnod handler.
        * libfs/src/dosfs/msdos_dir.c: Add the parent pathloc to the rmnod
        handler.
        * libfs/src/dosfs/msdos_eval.c: Add the length parameter to the
        eval and token call.
        * libfs/src/imfs/imfs_directory.c: Add the parent pathloc to the
        rmnod handler.
        * libfs/src/imfs/imfs_fchmod.c: Do not test the mode flags for
        only the allowed flags. Add the missing flags spec'ed in the POSIX
        standard.
        * libfs/src/imfs/imfs_fsunmount.c, libfs/src/imfs/imfs_rmnod.c,
        libfs/src/imfs/imfs_unlink.c, libfs/src/imfs/memfile.c: Add the
        parent node. Currently ignored in the IMFS.
        * libfs/src/imfs/imfs_stat.c: Return the device number in the rdev
        field.
        * libfs/src/imfs/imfs_mknod.c, libfs/src/imfs/imfs_symlink.c : Add
        the length parameter to the token call.
        * libfs/src/nfsclient/src/nfs.c: Add the length parameter to the
        eval call and parent node to the rmnod and unlink command.
        * libmisc/shell/internal.h: Remove the libc mounter decl to make
        public.
        * libmisc/shell/main_mount.c: Add support for hooking external
        mount support for new file systems.
        * libmisc/shell/shell.h: Add helper functions for the mount
        command.
2009-06-12 01:53:33 +00:00

296 lines
7.5 KiB
C

/**
* @file rtems/shell.h
*
* Instantatiate a new terminal shell.
*/
/*
* Author:
*
* WORK: fernando.ruiz@ctv.es
* HOME: correo@fernando-ruiz.com
*
* Thanks at:
* Chris Johns
*
* $Id$
*/
#ifndef __RTEMS_SHELL_H__
#define __RTEMS_SHELL_H__
#include <rtems.h>
#include <stdio.h>
#include <termios.h>
#include <rtems/fs.h>
#include <rtems/libio.h>
#include <rtems/chain.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* Some key labels to define special keys.
*/
#define RTEMS_SHELL_KEYS_EXTENDED (0x8000)
#define RTEMS_SHELL_KEYS_NORMAL_MASK (0x00ff)
#define RTEMS_SHELL_KEYS_INS (0)
#define RTEMS_SHELL_KEYS_DEL (1)
#define RTEMS_SHELL_KEYS_UARROW (2)
#define RTEMS_SHELL_KEYS_DARROW (3)
#define RTEMS_SHELL_KEYS_LARROW (4)
#define RTEMS_SHELL_KEYS_RARROW (5)
#define RTEMS_SHELL_KEYS_HOME (6)
#define RTEMS_SHELL_KEYS_END (7)
#define RTEMS_SHELL_KEYS_F1 (8)
#define RTEMS_SHELL_KEYS_F2 (9)
#define RTEMS_SHELL_KEYS_F3 (10)
#define RTEMS_SHELL_KEYS_F4 (11)
#define RTEMS_SHELL_KEYS_F5 (12)
#define RTEMS_SHELL_KEYS_F6 (13)
#define RTEMS_SHELL_KEYS_F7 (14)
#define RTEMS_SHELL_KEYS_F8 (15)
#define RTEMS_SHELL_KEYS_F9 (16)
#define RTEMS_SHELL_KEYS_F10 (17)
typedef bool (*rtems_shell_login_check_t)(
const char * /* user */,
const char * /* passphrase */
);
bool rtems_shell_login_prompt(
FILE *in,
FILE *out,
const char *device,
rtems_shell_login_check_t check
);
bool rtems_shell_login_check(
const char *user,
const char *passphrase
);
typedef int (*rtems_shell_command_t)(int argc, char **argv);
struct rtems_shell_cmd_tt;
typedef struct rtems_shell_cmd_tt rtems_shell_cmd_t;
struct rtems_shell_cmd_tt {
const char *name;
const char *usage;
const char *topic;
rtems_shell_command_t command;
rtems_shell_cmd_t *alias;
rtems_shell_cmd_t *next;
};
typedef struct {
const char *name;
const char *alias;
} rtems_shell_alias_t;
/*
* The return value has RTEMS_SHELL_KEYS_EXTENDED set if the key
* is extended, ie a special key.
*/
unsigned int rtems_shell_getchar(FILE *in);
rtems_shell_cmd_t * rtems_shell_lookup_cmd(const char *cmd);
rtems_shell_cmd_t *rtems_shell_add_cmd_struct(
rtems_shell_cmd_t *shell_cmd
);
rtems_shell_cmd_t * rtems_shell_add_cmd(
const char *cmd,
const char *topic,
const char *usage,
rtems_shell_command_t command
);
rtems_shell_cmd_t * rtems_shell_alias_cmd(
const char *cmd,
const char *alias
);
int rtems_shell_make_args(
char *commandLine,
int *argc_p,
char **argv_p,
int max_args
);
int rtems_shell_cat_file(
FILE *out,
const 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
* sessions.
*
* @param task_name Name of the shell task.
* @param task_stacksize The size of the stack. If 0 the default size is used.
* @param task_priority The priority the shell runs at.
* @param forever Repeat logins.
* @param wait Caller should block until shell exits.
* @param login_check User login check function, NULL disables login checks.
*
*/
rtems_status_code rtems_shell_init(
const char *task_name,
size_t task_stacksize,
rtems_task_priority task_priority,
const char *devname,
bool forever,
bool wait,
rtems_shell_login_check_t login_check
);
/**
* Run a shell script creating a shell tasks to execute the command under.
*
* @param task_name Name of the shell task.
* @param task_stacksize The size of the stack. If 0 the default size is used.
* @param task_priority The priority the shell runs at.
* @param input The file of commands. Can be 'stdin' to use stdin.
* @param output The output file to write commands to. Can be 'stdout',
* 'stderr' or '/dev/null'.
* @param output_append Append the output to the file or truncate the file.
* Create if it does not exist.
* @param wait Wait for the script to finish.
*/
rtems_status_code rtems_shell_script(
const char *task_name,
size_t task_stacksize, /* 0 default*/
rtems_task_priority task_priority,
const char *input,
const char *output,
bool output_append,
bool wait,
bool echo
);
/*
* Things that are useful to external entities developing commands and plugging
* them in.
*/
int rtems_shell_str2int(const char * s);
typedef struct {
rtems_name magic; /* 'S','E','N','V': Shell Environment */
const char *devname;
const char *taskname;
/* user extensions */
bool exit_shell; /* logout */
bool forever; /* repeat login */
int errorlevel;
bool echo;
char cwd [256];
const char *input;
const char *output;
bool output_append;
rtems_id wake_on_end;
rtems_shell_login_check_t login_check;
} rtems_shell_env_t;
bool rtems_shell_main_loop(
rtems_shell_env_t *rtems_shell_env
);
extern rtems_shell_env_t rtems_global_shell_env;
extern rtems_shell_env_t *rtems_current_shell_env;
/*
* The types of file systems we can mount. We have them broken out
* out like this so they can be configured by shellconfig.h. The
* mount command needs special treatment due to some file systems
* being dependent on the network stack and some not. If we had
* all possible file systems being included it would force the
* networking stack into the applcation and this may not be
* required.
*/
struct rtems_shell_filesystems_tt;
typedef struct rtems_shell_filesystems_tt rtems_shell_filesystems_t;
typedef int (*rtems_shell_filesystems_mounter_t)(
const char* driver,
const char* path,
rtems_shell_filesystems_t* fs,
rtems_filesystem_options_t options
);
struct rtems_shell_filesystems_tt {
rtems_chain_node link;
const char *name;
int driver_needed;
const rtems_filesystem_operations_table *fs_ops;
rtems_shell_filesystems_mounter_t mounter;
};
/**
* This method dynamically builds the command line prompt string
* and places it in @a prompt.
*
* @param[in] shell_env is the shell execution environment
* @param[in] prompt is a pointer to a string buffer area
* @param[in] size is length of the prompt buffer area
*
* @return This method fills in the memory pointed to by @a prompt.
*
* @note An application specific implementation can be provided
* by the user.
*/
void rtems_shell_get_prompt(
rtems_shell_env_t *shell_env,
char *prompt,
size_t size
);
/**
* Helper for the mount command.
*
* @param[in] driver The path to the driver.
* @param[in] path The path to mount on.
* @param[in] fs The file system definition.
* @param[in] options Special file system options.
*/
int rtems_shell_libc_mounter(
const char* driver,
const char* path,
rtems_shell_filesystems_t* fs,
rtems_filesystem_options_t options
);
/**
* Add a new file system mount configuration to the mount command.
*
* @param[in] fs The file system mount data.
*/
void rtems_shell_mount_add_fsys(rtems_shell_filesystems_t* fs);
/**
* Delete file system mount configuration from the mount command.
*
* @param[in] fs The file system mount data to remove.
*/
void rtems_shell_mount_del_fsys(rtems_shell_filesystems_t* fs);
#ifdef __cplusplus
}
#endif
#endif