1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
/**
* @file rtems/shell.h
*
* Instantatiate a new terminal shell.
*/
/*
* Author:
*
* WORK: fernando.ruiz@ctv.es
* HOME: correo@fernando-ruiz.com
*
* Thanks at:
* Chris John
*
* $Id$
*/
#ifndef __SHELL_H__
#define __SHELL_H__
#include <rtems.h>
#include <stdio.h>
#include <termios.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef int (*shell_command_t)(int argc,char * argv[]);
struct shell_cmd_tt;
typedef struct shell_cmd_tt shell_cmd_t;
struct shell_cmd_tt {
char *name;
char *usage;
char *topic;
shell_command_t command;
shell_cmd_t *alias;
shell_cmd_t *next;
};
typedef struct {
char *name;
char *alias;
} shell_alias_t;
shell_cmd_t * shell_lookup_cmd(char * cmd);
shell_cmd_t *shell_add_cmd_struct(
shell_cmd_t *shell_cmd
);
shell_cmd_t * shell_add_cmd(
char *cmd,
char *topic,
char *usage,
shell_command_t command
);
shell_cmd_t * shell_alias_cmd(
char *cmd,
char *alias
);
int shell_make_args(
char * cmd,
int * pargc,
char * argv[]
);
int shell_scanline(char * line,int size,FILE * in,FILE * out) ;
void cat_file(FILE * out,char *name);
void write_file(char *name,char * content);
/**
* 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 tcflag The termios c_cflag value. If 0 the default is used, if
* not 0 the value is ORed with CLOCAL and CREAD.
* @param forever Repeat logins.
*
* @todo CCJ I am not sure this termios flag setting is a good idea. The shell
* needs to adjust the termios for its use but it should assume the
* settings are set by the user for things like baudrate etc.
*/
rtems_status_code shell_init(
char *task_name,
uint32_t task_stacksize, /*0 default*/
rtems_task_priority task_priority,
char *devname,
tcflag_t tcflag,
int forever
);
/*
* Things that are useful to external entities developing commands and plugging
* them in.
*/
int str2int(char * s);
typedef struct {
rtems_name magic; /* 'S','E','N','V': Shell Environment */
char *devname;
char *taskname;
tcflag_t tcflag;
/* user extensions */
int exit_shell; /* logout */
int forever ; /* repeat login */
int errorlevel;
uintptr_t mdump_addr;
} shell_env_t;
rtems_boolean shell_shell_loop(
shell_env_t *shell_env
);
extern shell_env_t global_shell_env;
extern shell_env_t *current_shell_env;
#ifdef __cplusplus
}
#endif
#endif
|