1
1
// Shell.
2
2
3
- #include "types.h"
4
- #include "user.h"
5
- #include "fcntl.h"
3
+ #include <stdio.h>
4
+ #include <string.h>
5
+ #include <stdlib.h>
6
+ #include <unistd.h>
7
+ #include <fcntl.h>
8
+ #include <sys/wait.h>
6
9
7
10
// Parsed command representation
8
11
#define EXEC 1
@@ -65,7 +68,7 @@ runcmd(struct cmd *cmd)
65
68
struct redircmd * rcmd ;
66
69
67
70
if (cmd == 0 )
68
- exit ();
71
+ exit (1 );
69
72
70
73
switch (cmd -> type ){
71
74
default :
@@ -74,17 +77,17 @@ runcmd(struct cmd *cmd)
74
77
case EXEC :
75
78
ecmd = (struct execcmd * )cmd ;
76
79
if (ecmd -> argv [0 ] == 0 )
77
- exit ();
78
- exec (ecmd -> argv [0 ], ecmd -> argv );
79
- printf (2 , "exec %s failed\n" , ecmd -> argv [0 ]);
80
+ exit (1 );
81
+ execv (ecmd -> argv [0 ], ecmd -> argv );
82
+ dprintf (2 , "exec %s failed\n" , ecmd -> argv [0 ]);
80
83
break ;
81
84
82
85
case REDIR :
83
86
rcmd = (struct redircmd * )cmd ;
84
87
close (rcmd -> fd );
85
88
if (open (rcmd -> file , rcmd -> mode ) < 0 ){
86
- printf (2 , "open %s failed\n" , rcmd -> file );
87
- exit ();
89
+ dprintf (2 , "open %s failed\n" , rcmd -> file );
90
+ exit (1 );
88
91
}
89
92
runcmd (rcmd -> cmd );
90
93
break ;
@@ -93,7 +96,7 @@ runcmd(struct cmd *cmd)
93
96
lcmd = (struct listcmd * )cmd ;
94
97
if (fork1 () == 0 )
95
98
runcmd (lcmd -> left );
96
- wait ();
99
+ wait (NULL );
97
100
runcmd (lcmd -> right );
98
101
break ;
99
102
@@ -117,8 +120,8 @@ runcmd(struct cmd *cmd)
117
120
}
118
121
close (p [0 ]);
119
122
close (p [1 ]);
120
- wait ();
121
- wait ();
123
+ wait (NULL );
124
+ wait (NULL );
122
125
break ;
123
126
124
127
case BACK :
@@ -127,15 +130,15 @@ runcmd(struct cmd *cmd)
127
130
runcmd (bcmd -> cmd );
128
131
break ;
129
132
}
130
- exit ();
133
+ exit (1 );
131
134
}
132
135
133
136
int
134
137
getcmd (char * buf , int nbuf )
135
138
{
136
- printf (2 , "$ " );
139
+ dprintf (2 , "$ " );
137
140
memset (buf , 0 , nbuf );
138
- gets (buf , nbuf );
141
+ fgets (buf , nbuf , stdin );
139
142
if (buf [0 ] == 0 ) // EOF
140
143
return -1 ;
141
144
return 0 ;
@@ -161,21 +164,21 @@ main(void)
161
164
// Chdir must be called by the parent, not the child.
162
165
buf [strlen (buf )- 1 ] = 0 ; // chop \n
163
166
if (chdir (buf + 3 ) < 0 )
164
- printf (2 , "cannot cd %s\n" , buf + 3 );
167
+ dprintf (2 , "cannot cd %s\n" , buf + 3 );
165
168
continue ;
166
169
}
167
170
if (fork1 () == 0 )
168
171
runcmd (parsecmd (buf ));
169
- wait ();
172
+ wait (NULL );
170
173
}
171
- exit ();
174
+ exit (1 );
172
175
}
173
176
174
177
void
175
178
panic (char * s )
176
179
{
177
- printf (2 , "%s\n" , s );
178
- exit ();
180
+ dprintf (2 , "%s\n" , s );
181
+ exit (1 );
179
182
}
180
183
181
184
int
@@ -334,7 +337,7 @@ parsecmd(char *s)
334
337
cmd = parseline (& s , es );
335
338
peek (& s , es , "" );
336
339
if (s != es ){
337
- printf (2 , "leftovers: %s\n" , s );
340
+ dprintf (2 , "leftovers: %s\n" , s );
338
341
panic ("syntax" );
339
342
}
340
343
nulterminate (cmd );
@@ -386,10 +389,10 @@ parseredirs(struct cmd *cmd, char **ps, char *es)
386
389
cmd = redircmd (cmd , q , eq , O_RDONLY , 0 );
387
390
break ;
388
391
case '>' :
389
- cmd = redircmd (cmd , q , eq , O_WRONLY |O_CREATE , 1 );
392
+ cmd = redircmd (cmd , q , eq , O_WRONLY |O_CREAT , 1 );
390
393
break ;
391
394
case '+' : // >>
392
- cmd = redircmd (cmd , q , eq , O_WRONLY |O_CREATE , 1 );
395
+ cmd = redircmd (cmd , q , eq , O_WRONLY |O_CREAT , 1 );
393
396
break ;
394
397
}
395
398
}
0 commit comments