Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
okll00
rt-thread
提交
f4248a95
R
rt-thread
项目概览
okll00
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
5
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
f4248a95
编写于
10月 11, 2015
作者:
B
Bernard Xiong
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[Finsh] Add script feature for msh.
上级
147901c2
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
340 addition
and
163 deletion
+340
-163
components/finsh/SConscript
components/finsh/SConscript
+2
-1
components/finsh/cmd.c
components/finsh/cmd.c
+52
-52
components/finsh/msh.c
components/finsh/msh.c
+40
-26
components/finsh/msh.h
components/finsh/msh.h
+4
-1
components/finsh/msh_cmd.c
components/finsh/msh_cmd.c
+83
-83
components/finsh/msh_file.c
components/finsh/msh_file.c
+159
-0
未找到文件。
components/finsh/SConscript
浏览文件 @
f4248a95
...
...
@@ -22,8 +22,9 @@ finsh_token.c
'''
)
msh_src
=
Split
(
'''
msh_cmd.c
msh.c
msh_cmd.c
msh_file.c
'''
)
CPPPATH
=
[
cwd
]
...
...
components/finsh/cmd.c
浏览文件 @
f4248a95
...
...
@@ -99,17 +99,17 @@ static long _list_thread(struct rt_list_node *list)
else
if
(
thread
->
stat
==
RT_THREAD_INIT
)
rt_kprintf
(
" init "
);
else
if
(
thread
->
stat
==
RT_THREAD_CLOSE
)
rt_kprintf
(
" close "
);
ptr
=
(
rt_uint8_t
*
)
thread
->
stack_addr
;
ptr
=
(
rt_uint8_t
*
)
thread
->
stack_addr
;
while
(
*
ptr
==
'#'
)
ptr
++
;
rt_kprintf
(
" 0x%08x 0x%08x 0x%08x 0x%08x %03d
\n
"
,
thread
->
stack_size
+
((
rt_uint32_t
)
thread
->
stack_addr
-
(
rt_uint32_t
)
thread
->
sp
),
thread
->
stack_size
,
thread
->
stack_size
-
((
rt_uint32_t
)
ptr
-
(
rt_uint32_t
)
thread
->
stack_addr
),
thread
->
remaining_tick
,
thread
->
error
);
thread
->
stack_size
+
((
rt_uint32_t
)
thread
->
stack_addr
-
(
rt_uint32_t
)
thread
->
sp
),
thread
->
stack_size
,
thread
->
stack_size
-
((
rt_uint32_t
)
ptr
-
(
rt_uint32_t
)
thread
->
stack_addr
),
thread
->
remaining_tick
,
thread
->
error
);
}
return
0
;
}
...
...
@@ -148,7 +148,7 @@ static long _list_sem(struct rt_list_node *list)
sem
=
(
struct
rt_semaphore
*
)(
rt_list_entry
(
node
,
struct
rt_object
,
list
));
if
(
!
rt_list_isempty
(
&
sem
->
parent
.
suspend_thread
))
{
rt_kprintf
(
"%-8.*s %03d %d:"
,
rt_kprintf
(
"%-8.*s %03d %d:"
,
RT_NAME_MAX
,
sem
->
parent
.
parent
.
name
,
sem
->
value
,
...
...
@@ -448,7 +448,7 @@ static long _list_device(struct rt_list_node *list)
{
struct
rt_device
*
device
;
struct
rt_list_node
*
node
;
char
*
const
device_type_str
[]
=
char
*
const
device_type_str
[]
=
{
"Character Device"
,
"Block Device"
,
...
...
@@ -464,11 +464,11 @@ static long _list_device(struct rt_list_node *list)
"SPI Bus"
,
"SPI Device"
,
"SDIO Bus"
,
"PM Pseudo Device"
,
"PM Pseudo Device"
,
"Pipe"
,
"Portal Device"
,
"Timer Device"
,
"Miscellaneous Device"
,
"Timer Device"
,
"Miscellaneous Device"
,
"Unknown"
};
...
...
@@ -507,13 +507,13 @@ int list_module(void)
list
=
&
rt_object_container
[
RT_Object_Class_Module
].
object_list
;
rt_kprintf
(
"module name ref
\n
"
);
rt_kprintf
(
"------------ --------
\n
"
);
rt_kprintf
(
"module name ref
address
\n
"
);
rt_kprintf
(
"------------ --------
------------
\n
"
);
for
(
node
=
list
->
next
;
node
!=
list
;
node
=
node
->
next
)
{
module
=
(
struct
rt_module
*
)(
rt_list_entry
(
node
,
struct
rt_object
,
list
));
rt_kprintf
(
"%-16.*s %-04d
\n
"
,
RT_NAME_MAX
,
module
->
parent
.
name
,
module
->
nref
);
rt_kprintf
(
"%-16.*s %-04d
0x%08x
\n
"
,
RT_NAME_MAX
,
module
->
parent
.
name
,
module
->
nref
,
module
->
module_space
);
}
return
0
;
...
...
@@ -525,13 +525,13 @@ int list_mod_detail(const char *name)
{
int
i
;
struct
rt_module
*
module
;
/* find module */
if
((
module
=
rt_module_find
(
name
))
!=
RT_NULL
)
{
/* module has entry point */
if
(
!
(
module
->
parent
.
flag
&
RT_MODULE_FLAG_WITHOUTENTRY
))
{
{
struct
rt_thread
*
thread
;
struct
rt_list_node
*
tlist
;
rt_uint8_t
*
ptr
;
...
...
@@ -548,15 +548,15 @@ int list_mod_detail(const char *name)
else
if
(
thread
->
stat
==
RT_THREAD_SUSPEND
)
rt_kprintf
(
" suspend"
);
else
if
(
thread
->
stat
==
RT_THREAD_INIT
)
rt_kprintf
(
" init "
);
ptr
=
(
rt_uint8_t
*
)
thread
->
stack_addr
;
ptr
=
(
rt_uint8_t
*
)
thread
->
stack_addr
;
while
(
*
ptr
==
'#'
)
ptr
++
;
rt_kprintf
(
" 0x%08x 0x%08x 0x%08x 0x%08x %03d
\n
"
,
thread
->
stack_size
+
((
rt_uint32_t
)
thread
->
stack_addr
-
(
rt_uint32_t
)
thread
->
sp
),
thread
->
stack_size
,
thread
->
stack_size
-
((
rt_uint32_t
)
ptr
-
(
rt_uint32_t
)
thread
->
stack_addr
),
thread
->
remaining_tick
,
thread
->
error
);
thread
->
stack_size
+
((
rt_uint32_t
)
thread
->
stack_addr
-
(
rt_uint32_t
)
thread
->
sp
),
thread
->
stack_size
,
thread
->
stack_size
-
((
rt_uint32_t
)
ptr
-
(
rt_uint32_t
)
thread
->
stack_addr
),
thread
->
remaining_tick
,
thread
->
error
);
}
/* list sub thread in module */
...
...
@@ -607,18 +607,18 @@ int list_mod_detail(const char *name)
if
(
!
rt_list_isempty
(
tlist
))
_list_timer
(
tlist
);
}
if
(
module
->
nsym
>
0
)
{
rt_kprintf
(
"symbol address
\n
"
);
rt_kprintf
(
"-------- ----------
\n
"
);
/* list module export symbols */
for
(
i
=
0
;
i
<
module
->
nsym
;
i
++
)
{
rt_kprintf
(
"%s 0x%x
\n
"
,
module
->
symtab
[
i
].
name
,
module
->
symtab
[
i
].
addr
);
}
}
if
(
module
->
nsym
>
0
)
{
rt_kprintf
(
"symbol address
\n
"
);
rt_kprintf
(
"-------- ----------
\n
"
);
/* list module export symbols */
for
(
i
=
0
;
i
<
module
->
nsym
;
i
++
)
{
rt_kprintf
(
"%s 0x%x
\n
"
,
module
->
symtab
[
i
].
name
,
module
->
symtab
[
i
].
addr
);
}
}
}
return
0
;
...
...
@@ -632,16 +632,16 @@ long list(void)
struct
finsh_syscall_item
*
syscall_item
;
struct
finsh_sysvar_item
*
sysvar_item
;
#endif
rt_kprintf
(
"--Function List:
\n
"
);
{
struct
finsh_syscall
*
index
;
for
(
index
=
_syscall_table_begin
;
index
<
_syscall_table_end
;
FINSH_NEXT_SYSCALL
(
index
))
index
<
_syscall_table_end
;
FINSH_NEXT_SYSCALL
(
index
))
{
/* skip the internal command */
if
(
strncmp
((
char
*
)
index
->
name
,
"__"
,
2
)
==
0
)
continue
;
/* skip the internal command */
if
(
strncmp
((
char
*
)
index
->
name
,
"__"
,
2
)
==
0
)
continue
;
#ifdef FINSH_USING_DESCRIPTION
rt_kprintf
(
"%-16s -- %s
\n
"
,
index
->
name
,
index
->
desc
);
...
...
@@ -664,8 +664,8 @@ long list(void)
{
struct
finsh_sysvar
*
index
;
for
(
index
=
_sysvar_table_begin
;
index
<
_sysvar_table_end
;
FINSH_NEXT_SYSVAR
(
index
))
index
<
_sysvar_table_end
;
FINSH_NEXT_SYSVAR
(
index
))
{
#ifdef FINSH_USING_DESCRIPTION
rt_kprintf
(
"%-16s -- %s
\n
"
,
index
->
name
,
index
->
desc
);
...
...
@@ -682,7 +682,7 @@ long list(void)
sysvar_item
=
sysvar_item
->
next
;
}
#endif
return
0
;
}
FINSH_FUNCTION_EXPORT
(
list
,
list
all
symbol
in
system
)
...
...
@@ -732,12 +732,12 @@ void list_prefix(char *prefix)
{
struct
finsh_syscall
*
index
;
for
(
index
=
_syscall_table_begin
;
index
<
_syscall_table_end
;
FINSH_NEXT_SYSCALL
(
index
))
index
<
_syscall_table_end
;
FINSH_NEXT_SYSCALL
(
index
))
{
/* skip internal command */
if
(
str_is_prefix
(
"__"
,
index
->
name
)
==
0
)
continue
;
/* skip internal command */
if
(
str_is_prefix
(
"__"
,
index
->
name
)
==
0
)
continue
;
if
(
str_is_prefix
(
prefix
,
index
->
name
)
==
0
)
{
if
(
func_cnt
==
0
)
...
...
@@ -807,10 +807,10 @@ void list_prefix(char *prefix)
/* checks in system variable */
{
struct
finsh_sysvar
*
index
;
struct
finsh_sysvar
*
index
;
for
(
index
=
_sysvar_table_begin
;
index
<
_sysvar_table_end
;
FINSH_NEXT_SYSVAR
(
index
))
index
<
_sysvar_table_end
;
FINSH_NEXT_SYSVAR
(
index
))
{
if
(
str_is_prefix
(
prefix
,
index
->
name
)
==
0
)
{
...
...
components/finsh/msh.c
浏览文件 @
f4248a95
...
...
@@ -37,7 +37,7 @@
#endif
#define RT_FINSH_ARG_MAX 10
typedef
int
(
*
cmd_function_t
)(
int
argc
,
char
**
argv
);
typedef
int
(
*
cmd_function_t
)(
int
argc
,
char
**
argv
);
#ifdef FINSH_USING_MSH
#ifdef FINSH_USING_MSH_ONLY
...
...
@@ -56,7 +56,7 @@ rt_bool_t msh_is_used(void)
return
__msh_state
;
}
static
int
msh_exit
(
int
argc
,
char
**
argv
)
static
int
msh_exit
(
int
argc
,
char
**
argv
)
{
/* return to finsh shell mode */
__msh_state
=
RT_FALSE
;
...
...
@@ -74,15 +74,15 @@ static int msh_enter(void)
FINSH_FUNCTION_EXPORT_ALIAS
(
msh_enter
,
msh
,
use
module
shell
);
#endif
int
msh_help
(
int
argc
,
char
**
argv
)
int
msh_help
(
int
argc
,
char
**
argv
)
{
rt_kprintf
(
"RT-Thread shell commands:
\n
"
);
{
struct
finsh_syscall
*
index
;
for
(
index
=
_syscall_table_begin
;
index
<
_syscall_table_end
;
FINSH_NEXT_SYSCALL
(
index
))
index
<
_syscall_table_end
;
FINSH_NEXT_SYSCALL
(
index
))
{
if
(
strncmp
(
index
->
name
,
"__cmd_"
,
6
)
!=
0
)
continue
;
#if defined(FINSH_USING_DESCRIPTION) && defined(FINSH_USING_SYMTAB)
...
...
@@ -98,7 +98,7 @@ int msh_help(int argc, char** argv)
}
FINSH_FUNCTION_EXPORT_ALIAS
(
msh_help
,
__cmd_help
,
RT
-
Thread
shell
help
.);
static
int
msh_split
(
char
*
cmd
,
rt_size_t
length
,
char
*
argv
[
RT_FINSH_ARG_MAX
])
static
int
msh_split
(
char
*
cmd
,
rt_size_t
length
,
char
*
argv
[
RT_FINSH_ARG_MAX
])
{
char
*
ptr
;
rt_size_t
position
;
...
...
@@ -161,13 +161,13 @@ static cmd_function_t msh_get_cmd(char *cmd, int size)
cmd_function_t
cmd_func
=
RT_NULL
;
for
(
index
=
_syscall_table_begin
;
index
<
_syscall_table_end
;
FINSH_NEXT_SYSCALL
(
index
))
index
<
_syscall_table_end
;
FINSH_NEXT_SYSCALL
(
index
))
{
if
(
strncmp
(
index
->
name
,
"__cmd_"
,
6
)
!=
0
)
continue
;
if
(
strncmp
(
&
index
->
name
[
6
],
cmd
,
size
)
==
0
&&
index
->
name
[
6
+
size
]
==
'\0'
)
index
->
name
[
6
+
size
]
==
'\0'
)
{
cmd_func
=
(
cmd_function_t
)
index
->
func
;
break
;
...
...
@@ -180,7 +180,7 @@ static cmd_function_t msh_get_cmd(char *cmd, int size)
#if defined(RT_USING_MODULE) && defined(RT_USING_DFS)
/* Return 0 on module executed. Other value indicate error.
*/
int
msh_exec_module
(
const
char
*
cmd_line
,
int
size
)
int
msh_exec_module
(
const
char
*
cmd_line
,
int
size
)
{
int
ret
;
int
fd
=
-
1
;
...
...
@@ -197,7 +197,7 @@ int msh_exec_module(const char* cmd_line, int size)
length
=
cmd_length
+
32
;
/* allocate program name memory */
pg_name
=
(
char
*
)
rt_malloc
(
length
);
pg_name
=
(
char
*
)
rt_malloc
(
length
);
if
(
pg_name
==
RT_NULL
)
return
-
RT_ENOMEM
;
...
...
@@ -251,12 +251,21 @@ int msh_exec_module(const char* cmd_line, int size)
int
system
(
const
char
*
command
)
{
return
msh_exec_module
(
command
,
rt_strlen
(
command
));
int
ret
=
-
RT_ENOMEM
;
char
*
cmd
=
rt_strdup
(
command
);
if
(
cmd
)
{
ret
=
msh_exec
(
cmd
,
rt_strlen
(
cmd
));
rt_free
(
cmd
);
}
return
ret
;
}
RTM_EXPORT
(
system
);
#endif
static
int
_msh_exec_cmd
(
char
*
cmd
,
rt_size_t
length
,
int
*
retp
)
static
int
_msh_exec_cmd
(
char
*
cmd
,
rt_size_t
length
,
int
*
retp
)
{
int
argc
;
int
cmd0_size
=
0
;
...
...
@@ -287,12 +296,12 @@ static int _msh_exec_cmd(char* cmd, rt_size_t length, int *retp)
return
0
;
}
int
msh_exec
(
char
*
cmd
,
rt_size_t
length
)
int
msh_exec
(
char
*
cmd
,
rt_size_t
length
)
{
int
cmd_ret
;
/* strim the beginning of command */
while
(
*
cmd
==
' '
||
*
cmd
==
'\t'
)
/* strim the beginning of command */
while
(
*
cmd
==
' '
||
*
cmd
==
'\t'
)
{
cmd
++
;
length
--
;
...
...
@@ -318,7 +327,12 @@ int msh_exec(char* cmd, rt_size_t length)
#endif
#if defined(RT_USING_DFS) && defined(DFS_USING_WORKDIR)
/* change to this directory */
if
(
msh_exec_script
(
cmd
,
length
)
==
0
)
{
return
0
;
}
/* change to this directory */
if
(
chdir
(
cmd
)
==
0
)
{
return
0
;
...
...
@@ -329,7 +343,7 @@ int msh_exec(char* cmd, rt_size_t length)
{
char
*
tcmd
;
tcmd
=
cmd
;
while
(
*
tcmd
!=
' '
&&
*
tcmd
!=
'\0'
)
while
(
*
tcmd
!=
' '
&&
*
tcmd
!=
'\0'
)
{
tcmd
++
;
}
...
...
@@ -355,14 +369,14 @@ static int str_common(const char *str1, const char *str2)
#ifdef RT_USING_DFS
void
msh_auto_complete_path
(
char
*
path
)
{
DIR
*
dir
=
RT_NULL
;
DIR
*
dir
=
RT_NULL
;
struct
dirent
*
dirent
=
RT_NULL
;
char
*
full_path
,
*
ptr
,
*
index
;
if
(
!
path
)
return
;
full_path
=
(
char
*
)
rt_malloc
(
256
);
full_path
=
(
char
*
)
rt_malloc
(
256
);
if
(
full_path
==
RT_NULL
)
return
;
/* out of memory */
if
(
*
path
!=
'/'
)
...
...
@@ -434,9 +448,9 @@ void msh_auto_complete_path(char *path)
/* save dirent name */
strcpy
(
full_path
,
dirent
->
d_name
);
}
length
=
str_common
(
dirent
->
d_name
,
full_path
);
if
(
length
<
min_length
)
{
min_length
=
length
;
...
...
@@ -460,7 +474,7 @@ void msh_auto_complete_path(char *path)
rt_kprintf
(
"%s
\n
"
,
dirent
->
d_name
);
}
}
length
=
index
-
path
;
memcpy
(
index
,
full_path
,
min_length
);
path
[
length
+
min_length
]
=
'\0'
;
...
...
@@ -481,7 +495,7 @@ void msh_auto_complete(char *prefix)
min_length
=
0
;
name_ptr
=
RT_NULL
;
if
(
*
prefix
==
'\0'
)
if
(
*
prefix
==
'\0'
)
{
msh_help
(
0
,
RT_NULL
);
return
;
...
...
@@ -522,7 +536,7 @@ void msh_auto_complete(char *prefix)
/* skip finsh shell function */
if
(
strncmp
(
index
->
name
,
"__cmd_"
,
6
)
!=
0
)
continue
;
cmd_name
=
(
const
char
*
)
&
index
->
name
[
6
];
cmd_name
=
(
const
char
*
)
&
index
->
name
[
6
];
if
(
strncmp
(
prefix
,
cmd_name
,
strlen
(
prefix
))
==
0
)
{
if
(
min_length
==
0
)
...
...
components/finsh/msh.h
浏览文件 @
f4248a95
...
...
@@ -33,7 +33,10 @@
#include <rtthread.h>
rt_bool_t
msh_is_used
(
void
);
int
msh_exec
(
char
*
cmd
,
rt_size_t
length
);
int
msh_exec
(
char
*
cmd
,
rt_size_t
length
);
void
msh_auto_complete
(
char
*
prefix
);
int
msh_exec_module
(
const
char
*
cmd_line
,
int
size
);
int
msh_exec_script
(
const
char
*
cmd_line
,
int
size
);
#endif
components/finsh/msh_cmd.c
浏览文件 @
f4248a95
...
...
@@ -41,7 +41,7 @@
extern
char
working_directory
[];
#endif
int
cmd_ls
(
int
argc
,
char
**
argv
)
int
cmd_ls
(
int
argc
,
char
**
argv
)
{
extern
void
ls
(
const
char
*
pathname
);
...
...
@@ -53,7 +53,7 @@ int cmd_ls(int argc, char** argv)
ls
(
"/"
);
#endif
}
else
else
{
ls
(
argv
[
1
]);
}
...
...
@@ -62,7 +62,7 @@ int cmd_ls(int argc, char** argv)
}
FINSH_FUNCTION_EXPORT_ALIAS
(
cmd_ls
,
__cmd_ls
,
List
information
about
the
FILEs
.);
int
cmd_cp
(
int
argc
,
char
**
argv
)
int
cmd_cp
(
int
argc
,
char
**
argv
)
{
void
copy
(
const
char
*
src
,
const
char
*
dst
);
...
...
@@ -80,7 +80,7 @@ int cmd_cp(int argc, char** argv)
}
FINSH_FUNCTION_EXPORT_ALIAS
(
cmd_cp
,
__cmd_cp
,
Copy
SOURCE
to
DEST
.);
int
cmd_mv
(
int
argc
,
char
**
argv
)
int
cmd_mv
(
int
argc
,
char
**
argv
)
{
if
(
argc
!=
3
)
{
...
...
@@ -89,66 +89,66 @@ int cmd_mv(int argc, char** argv)
}
else
{
int
fd
;
char
*
dest
=
RT_NULL
;
int
fd
;
char
*
dest
=
RT_NULL
;
rt_kprintf
(
"%s => %s
\n
"
,
argv
[
1
],
argv
[
2
]);
fd
=
open
(
argv
[
2
],
O_DIRECTORY
,
0
);
if
(
fd
>=
0
)
{
char
*
src
;
close
(
fd
);
/* it's a directory */
dest
=
(
char
*
)
rt_malloc
(
DFS_PATH_MAX
);
if
(
dest
==
RT_NULL
)
{
rt_kprintf
(
"out of memory
\n
"
);
return
-
RT_ENOMEM
;
}
src
=
argv
[
1
]
+
rt_strlen
(
argv
[
1
]);
while
(
src
!=
argv
[
1
])
{
if
(
*
src
==
'/'
)
break
;
src
--
;
}
rt_snprintf
(
dest
,
DFS_PATH_MAX
-
1
,
"%s/%s"
,
argv
[
2
],
src
);
}
else
{
fd
=
open
(
argv
[
2
],
O_RDONLY
,
0
);
if
(
fd
>=
0
)
{
close
(
fd
);
unlink
(
argv
[
2
]);
}
dest
=
argv
[
2
];
}
rename
(
argv
[
1
],
dest
);
if
(
dest
!=
RT_NULL
&&
dest
!=
argv
[
2
])
rt_free
(
dest
);
fd
=
open
(
argv
[
2
],
O_DIRECTORY
,
0
);
if
(
fd
>=
0
)
{
char
*
src
;
close
(
fd
);
/* it's a directory */
dest
=
(
char
*
)
rt_malloc
(
DFS_PATH_MAX
);
if
(
dest
==
RT_NULL
)
{
rt_kprintf
(
"out of memory
\n
"
);
return
-
RT_ENOMEM
;
}
src
=
argv
[
1
]
+
rt_strlen
(
argv
[
1
]);
while
(
src
!=
argv
[
1
])
{
if
(
*
src
==
'/'
)
break
;
src
--
;
}
rt_snprintf
(
dest
,
DFS_PATH_MAX
-
1
,
"%s/%s"
,
argv
[
2
],
src
);
}
else
{
fd
=
open
(
argv
[
2
],
O_RDONLY
,
0
);
if
(
fd
>=
0
)
{
close
(
fd
);
unlink
(
argv
[
2
]);
}
dest
=
argv
[
2
];
}
rename
(
argv
[
1
],
dest
);
if
(
dest
!=
RT_NULL
&&
dest
!=
argv
[
2
])
rt_free
(
dest
);
}
return
0
;
}
FINSH_FUNCTION_EXPORT_ALIAS
(
cmd_mv
,
__cmd_mv
,
Rename
SOURCE
to
DEST
.);
int
cmd_cat
(
int
argc
,
char
**
argv
)
int
cmd_cat
(
int
argc
,
char
**
argv
)
{
int
index
;
extern
void
cat
(
const
char
*
filename
);
extern
void
cat
(
const
char
*
filename
);
if
(
argc
==
1
)
{
rt_kprintf
(
"Usage: cat [FILE]...
\n
"
);
rt_kprintf
(
"Concatenate FILE(s)
\n
"
);
return
0
;
return
0
;
}
for
(
index
=
1
;
index
<
argc
;
index
++
)
...
...
@@ -160,7 +160,7 @@ int cmd_cat(int argc, char** argv)
}
FINSH_FUNCTION_EXPORT_ALIAS
(
cmd_cat
,
__cmd_cat
,
Concatenate
FILE
(
s
));
int
cmd_rm
(
int
argc
,
char
**
argv
)
int
cmd_rm
(
int
argc
,
char
**
argv
)
{
int
index
;
...
...
@@ -168,7 +168,7 @@ int cmd_rm(int argc, char** argv)
{
rt_kprintf
(
"Usage: rm FILE...
\n
"
);
rt_kprintf
(
"Remove (unlink) the FILE(s).
\n
"
);
return
0
;
return
0
;
}
for
(
index
=
1
;
index
<
argc
;
index
++
)
...
...
@@ -178,10 +178,10 @@ int cmd_rm(int argc, char** argv)
return
0
;
}
FINSH_FUNCTION_EXPORT_ALIAS
(
cmd_rm
,
__cmd_rm
,
Remove
(
unlink
)
the
FILE
(
s
).);
FINSH_FUNCTION_EXPORT_ALIAS
(
cmd_rm
,
__cmd_rm
,
Remove
(
unlink
)
the
FILE
(
s
).);
#ifdef DFS_USING_WORKDIR
int
cmd_cd
(
int
argc
,
char
**
argv
)
int
cmd_cd
(
int
argc
,
char
**
argv
)
{
if
(
argc
==
1
)
{
...
...
@@ -196,34 +196,34 @@ int cmd_cd(int argc, char** argv)
}
FINSH_FUNCTION_EXPORT_ALIAS
(
cmd_cd
,
__cmd_cd
,
Change
the
shell
working
directory
.);
int
cmd_pwd
(
int
argc
,
char
**
argv
)
int
cmd_pwd
(
int
argc
,
char
**
argv
)
{
rt_kprintf
(
"%s
\n
"
,
working_directory
);
return
0
;
rt_kprintf
(
"%s
\n
"
,
working_directory
);
return
0
;
}
FINSH_FUNCTION_EXPORT_ALIAS
(
cmd_pwd
,
__cmd_pwd
,
Print
the
name
of
the
current
working
directory
.);
#endif
int
cmd_mkdir
(
int
argc
,
char
**
argv
)
int
cmd_mkdir
(
int
argc
,
char
**
argv
)
{
if
(
argc
==
1
)
{
rt_kprintf
(
"Usage: mkdir [OPTION] DIRECTORY
\n
"
);
rt_kprintf
(
"Create the DIRECTORY, if they do not already exist.
\n
"
);
}
else
{
mkdir
(
argv
[
1
],
0
);
}
return
0
;
if
(
argc
==
1
)
{
rt_kprintf
(
"Usage: mkdir [OPTION] DIRECTORY
\n
"
);
rt_kprintf
(
"Create the DIRECTORY, if they do not already exist.
\n
"
);
}
else
{
mkdir
(
argv
[
1
],
0
);
}
return
0
;
}
FINSH_FUNCTION_EXPORT_ALIAS
(
cmd_mkdir
,
__cmd_mkdir
,
Create
the
DIRECTORY
.);
int
cmd_mkfs
(
int
argc
,
char
**
argv
)
int
cmd_mkfs
(
int
argc
,
char
**
argv
)
{
int
result
=
0
;
char
*
type
=
"elm"
;
/* use the default file system type as 'fatfs' */
char
*
type
=
"elm"
;
/* use the default file system type as 'fatfs' */
if
(
argc
==
2
)
{
...
...
@@ -242,7 +242,7 @@ int cmd_mkfs(int argc, char** argv)
rt_kprintf
(
"Usage: mkfs [-t type] device
\n
"
);
return
0
;
}
if
(
result
!=
RT_EOK
)
{
rt_kprintf
(
"mkfs failed, result=%d
\n
"
,
result
);
...
...
@@ -255,17 +255,17 @@ FINSH_FUNCTION_EXPORT_ALIAS(cmd_mkfs, __cmd_mkfs, format disk with file system);
#endif
#ifdef RT_USING_LWIP
int
cmd_ifconfig
(
int
argc
,
char
**
argv
)
int
cmd_ifconfig
(
int
argc
,
char
**
argv
)
{
extern
void
list_if
(
void
);
extern
void
set_if
(
char
*
netif_name
,
char
*
ip_addr
,
char
*
gw_addr
,
char
*
nm_addr
);
extern
void
set_if
(
char
*
netif_name
,
char
*
ip_addr
,
char
*
gw_addr
,
char
*
nm_addr
);
if
(
argc
==
1
)
if
(
argc
==
1
)
{
list_if
();
}
else
if
(
argc
==
5
)
else
if
(
argc
==
5
)
{
rt_kprintf
(
"config : %s
\n
"
,
argv
[
1
]);
rt_kprintf
(
"IP addr: %s
\n
"
,
argv
[
2
]);
...
...
@@ -283,22 +283,22 @@ int cmd_ifconfig(int argc, char** argv)
FINSH_FUNCTION_EXPORT_ALIAS
(
cmd_ifconfig
,
__cmd_ifconfig
,
list
the
information
of
network
interfaces
);
#ifdef RT_LWIP_TCP
int
cmd_netstat
(
int
argc
,
char
**
argv
)
int
cmd_netstat
(
int
argc
,
char
**
argv
)
{
extern
void
list_tcps
(
void
);
extern
void
list_tcps
(
void
);
list_tcps
();
return
0
;
list_tcps
();
return
0
;
}
FINSH_FUNCTION_EXPORT_ALIAS
(
cmd_netstat
,
__cmd_netstat
,
list
the
information
of
TCP
/
IP
);
FINSH_FUNCTION_EXPORT_ALIAS
(
cmd_netstat
,
__cmd_netstat
,
list
the
information
of
TCP
/
IP
);
#endif
#endif
/* RT_USING_LWIP */
int
cmd_ps
(
int
argc
,
char
**
argv
)
int
cmd_ps
(
int
argc
,
char
**
argv
)
{
extern
long
list_thread
(
void
);
extern
int
list_module
(
void
);
#ifdef RT_USING_MODULE
if
((
argc
==
2
)
&&
(
strcmp
(
argv
[
1
],
"-m"
)
==
0
))
list_module
();
...
...
@@ -309,14 +309,14 @@ int cmd_ps(int argc, char** argv)
}
FINSH_FUNCTION_EXPORT_ALIAS
(
cmd_ps
,
__cmd_ps
,
List
threads
in
the
system
.);
int
cmd_time
(
int
argc
,
char
**
argv
)
int
cmd_time
(
int
argc
,
char
**
argv
)
{
return
0
;
}
FINSH_FUNCTION_EXPORT_ALIAS
(
cmd_time
,
__cmd_time
,
Execute
command
with
time
.);
#ifdef RT_USING_HEAP
int
cmd_free
(
int
argc
,
char
**
argv
)
int
cmd_free
(
int
argc
,
char
**
argv
)
{
extern
void
list_mem
(
void
);
extern
void
list_memheap
(
void
);
...
...
components/finsh/msh_file.c
0 → 100644
浏览文件 @
f4248a95
/*
* script for RT-Thread module shell
*
* COPYRIGHT (C) 2013-2015, Shanghai Real-Thread Technology Co., Ltd
*
* This file is part of RT-Thread (http://www.rt-thread.org)
* Maintainer: bernard.xiong <bernard.xiong at gmail.com>
*
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Change Logs:
* Date Author Notes
* 2015-09-25 Bernard the first verion for FinSH
*/
#include <rtthread.h>
#include <finsh.h>
#include "msh.h"
#if defined(FINSH_USING_MSH) && defined(RT_USING_DFS)
#include <dfs_posix.h>
static
int
msh_readline
(
int
fd
,
char
*
line_buf
,
int
size
)
{
char
ch
;
int
index
=
0
;
do
{
if
(
read
(
fd
,
&
ch
,
1
)
!=
1
)
{
/* nothing in this file */
return
0
;
}
}
while
(
ch
==
'\n'
||
ch
==
'\r'
);
/* set the first character */
line_buf
[
index
++
]
=
ch
;
while
(
index
<
size
)
{
if
(
read
(
fd
,
&
ch
,
1
)
==
1
)
{
if
(
ch
==
'\n'
||
ch
==
'\r'
)
{
line_buf
[
index
]
=
'\0'
;
break
;
}
line_buf
[
index
++
]
=
ch
;
}
else
{
line_buf
[
index
]
=
'\0'
;
break
;
}
}
return
index
;
}
int
msh_exec_script
(
const
char
*
cmd_line
,
int
size
)
{
int
ret
;
int
fd
=
-
1
;
char
*
pg_name
;
int
length
,
cmd_length
=
0
;
if
(
size
==
0
)
return
-
RT_ERROR
;
/* get the length of command0 */
while
((
cmd_line
[
cmd_length
]
!=
' '
&&
cmd_line
[
cmd_length
]
!=
'\t'
)
&&
cmd_length
<
size
)
cmd_length
++
;
/* get name length */
length
=
cmd_length
+
32
;
/* allocate program name memory */
pg_name
=
(
char
*
)
rt_malloc
(
length
);
if
(
pg_name
==
RT_NULL
)
return
-
RT_ENOMEM
;
/* copy command0 */
memcpy
(
pg_name
,
cmd_line
,
cmd_length
);
pg_name
[
cmd_length
]
=
'\0'
;
if
(
strstr
(
pg_name
,
".sh"
)
!=
RT_NULL
||
strstr
(
pg_name
,
".SH"
)
!=
RT_NULL
)
{
/* try to open program */
fd
=
open
(
pg_name
,
O_RDONLY
,
0
);
/* search in /bin path */
if
(
fd
<
0
)
{
rt_snprintf
(
pg_name
,
length
-
1
,
"/bin/%.*s"
,
cmd_length
,
cmd_line
);
fd
=
open
(
pg_name
,
O_RDONLY
,
0
);
}
}
rt_free
(
pg_name
);
if
(
fd
>=
0
)
{
/* found script */
char
*
line_buf
;
int
length
;
line_buf
=
(
char
*
)
rt_malloc
(
RT_CONSOLEBUF_SIZE
);
/* read line by line and then exec it */
do
{
length
=
msh_readline
(
fd
,
line_buf
,
RT_CONSOLEBUF_SIZE
);
if
(
length
>
0
)
{
char
ch
=
'\0'
;
int
index
;
for
(
index
=
0
;
index
<
length
;
index
++
)
{
ch
=
line_buf
[
index
];
if
(
ch
==
' '
||
ch
==
'\t'
)
continue
;
else
break
;
}
if
(
ch
!=
'#'
)
/* not a comment */
msh_exec
(
line_buf
,
length
);
}
}
while
(
length
>
0
);
close
(
fd
);
rt_free
(
line_buf
);
ret
=
0
;
}
else
{
ret
=
-
1
;
}
return
ret
;
}
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录