-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuiltin.c
More file actions
127 lines (108 loc) · 2.13 KB
/
builtin.c
File metadata and controls
127 lines (108 loc) · 2.13 KB
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
#include "builtin.h"
#include "parse.h"
#include "externs.h"
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
typedef void (*CMD_HANDLER)();
typedef struct builtin_cmd
{
char *name;
CMD_HANDLER handler;
} BUILTIN_CMD;
char tcmd[MAXLINE];
void do_exit(char *tcmd,char *name);
void do_cd(char *tcmd,char *name);
void do_type(char *tcmd,char *name);
void do_echo(char *tcmd,char *name);
void parse_singalcmd(void);
//内置命令列表
char *builtinList[] = {"echo","pwd","jobs","kill","fg","bg","cd","exit","ulimit","umask","history",NULL};
BUILTIN_CMD builtins[] =
{
{"exit",do_exit},
{"cd",do_cd},
{"type",do_type},
{"echo",do_echo},
{NULL,NULL}
};
//内部命令解析函数
//返回1表示为内部命令,返回0表示不是内部命令
int builtin(void)
{
/*
if (check("exit"))
do_exit();
else if (check("cd"))
do_cd();
else
return 0;
*/
memset(tcmd,0,sizeof(tcmd));
int i = 0;
int found = 0;
while(builtins[i].name != NULL)
{
if (check(builtins[i].name))
{
parse_singalcmd();
builtins[i].handler(tcmd,builtins[i].name);
found = 1;
break;
}
++i;
}
return found;
}
void do_exit(char *tcmd,char *name)
{
printf("%s\n",name);
exit(EXIT_SUCCESS);
}
void do_cd(char *tcmd,char *name)
{
char cwd[100];
if (getcwd(cwd,99) == NULL)
ERR_EXIT("getcwd");
printf("当前路径为:%s\n",cwd);
chdir(tcmd);
if (getcwd(cwd,99) == NULL)
ERR_EXIT("getcwd");
printf("更改后路径为:%s\n",cwd);
printf("%s\n",name);
}
void do_type(char *tcmd,char *name)
{
int i;
int isBuiltinCmd = 0;
for(i = 0; builtinList[i] != NULL; ++i){
if (!strcmp(tcmd,builtinList[i]))
{
isBuiltinCmd = 1;
break;
}
}
if (isBuiltinCmd)
printf("%s is a builtin cmd\n",tcmd);
else
printf("%s is a external cmd\n",tcmd);
}
void do_echo(char *tcmd,char *name)
{
printf("%s\n",tcmd);
}
void parse_singalcmd(void)
{
char *pcmd = cmdline + strlen(cmdline) - 1;
char *ptcmd = tcmd;
while(*pcmd == '\0' || *pcmd == '\t' || *pcmd == '\n')
--pcmd;
while(*pcmd != ' ')
pcmd--;
pcmd++;
while(*pcmd != '\n')
*ptcmd++ = *pcmd++;
//*ptcmd = '\0';
}