Skip to content

Commit d021520

Browse files
committed
Fixed corner cases with cat and &, and modified setenv to match the requirements
1 parent eb2e027 commit d021520

File tree

9 files changed

+66
-39
lines changed

9 files changed

+66
-39
lines changed

envvar.c

+12-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,18 @@
22

33
void setEnv(char **parsedCommand, int parsedLength)
44
{
5-
if (parsedLength == 3)
5+
if (parsedLength == 2)
6+
{
7+
if (setenv(parsedCommand[1], "", 1) != -1)
8+
{
9+
printf("%s=%s\n", parsedCommand[1], "");
10+
}
11+
else
12+
{
13+
printf("setenv: [Error] environment variable cannot be set.\n");
14+
}
15+
}
16+
else if (parsedLength == 3)
617
{
718
if (setenv(parsedCommand[1], parsedCommand[2], 1) != -1)
819
{

execute.c

+12-11
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ void execute(char **data, int len, char *trimmedCommand, int isBackground)
1818
signal(SIGTTIN, SIG_IGN);
1919
signal(SIGTTOU, SIG_IGN);
2020

21-
if (tcsetpgrp(STDIN_FILENO, pid) == -1)
22-
{
23-
perror("Error, process cannot be made foreground");
24-
return;
25-
}
21+
tcsetpgrp(STDIN_FILENO, pid);
22+
// if (tcsetpgrp(STDIN_FILENO, pid) == -1)
23+
// {
24+
// perror("Error, process cannot be made foreground");
25+
// return;
26+
// }
2627

2728
int status;
2829
if (waitpid(pid, &status, WUNTRACED) == -1)
@@ -39,12 +40,12 @@ void execute(char **data, int len, char *trimmedCommand, int isBackground)
3940
printf("[%d] %d\n", node->jobid, node->pid);
4041
}
4142
}
42-
43-
if (tcsetpgrp(STDIN_FILENO, getpgrp()) == -1)
44-
{
45-
perror("Error, terminal cannot be made foreground");
46-
return;
47-
}
43+
tcsetpgrp(STDIN_FILENO, getpgrp());
44+
// if (tcsetpgrp(STDIN_FILENO, getpgrp()) == -1)
45+
// {
46+
// perror("Error, terminal cannot be made foreground");
47+
// return;
48+
// }
4849
signal(SIGTTIN, SIG_DFL);
4950
signal(SIGTTOU, SIG_DFL);
5051
setCurrentFgPid(-1);

fgbg.c

+12-10
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
int terminalFG()
77
{
88
setCurrentFgPid(-1);
9-
if (tcsetpgrp(STDIN_FILENO, getpgrp()) == -1)
10-
{
11-
perror("Error, terminal cannot be made foreground");
12-
return -1;
13-
}
9+
tcsetpgrp(STDIN_FILENO, getpgrp());
10+
// if (tcsetpgrp(STDIN_FILENO, getpgrp()) == -1)
11+
// {
12+
// perror("Error, terminal cannot be made foreground");
13+
// return -1;
14+
// }
1415
signal(SIGTTIN, SIG_DFL);
1516
signal(SIGTTOU, SIG_DFL);
1617
return 0;
@@ -42,11 +43,12 @@ int fg(char **parsedCommand, int parsedLength)
4243
signal(SIGTTIN, SIG_IGN);
4344
signal(SIGTTOU, SIG_IGN);
4445

45-
if (tcsetpgrp(STDIN_FILENO, tmpProcess->pid) == -1)
46-
{
47-
perror("Error, process cannot be made foreground");
48-
return -1;
49-
}
46+
tcsetpgrp(STDIN_FILENO, tmpProcess->pid);
47+
// if (tcsetpgrp(STDIN_FILENO, tmpProcess->pid) == -1)
48+
// {
49+
// perror("Error, process cannot be made foreground");
50+
// return -1;
51+
// }
5052
if (kill(tmpProcess->pid, SIGCONT) == -1)
5153
{
5254
perror("Error, SIGCONT signal cannot be sent to the process");

init.c

+6-1
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,16 @@ void ctrlZHandler()
7373
}
7474
}
7575

76+
void ctrlDHandler()
77+
{
78+
cleanup();
79+
}
80+
7681
void init()
7782
{
7883
setHomeDir(pwd());
7984
signal(SIGINT, ctrlCHandler);
80-
// signal(SIGQUIT, SIG_IGN);
85+
// signal(SIGQUIT, ctrlDHandler);
8186
signal(SIGCHLD, childProcHandler);
8287
signal(SIGTSTP, ctrlZHandler);
8388
initialiseChildProcessList();

log.txt

+14-14
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
1-
fg
2-
lls
31
ls
4-
git
2+
cd
53
make
64
ls
75
cat
86
vi
9-
jobs
10-
overkill
11-
kjob
12-
make
13-
exit
7+
fg
8+
ls
149
vi
15-
sleep
16-
kjobs
17-
kjob
18-
jobs
19-
kjob
20-
git
10+
overkill
11+
d
12+
ddd
13+
a
14+
pwd
15+
pinfo
16+
echo
17+
ssstcsetpgrp(STDIN_FILENO,
18+
getenv
19+
printenv
20+
history

main

64 Bytes
Binary file not shown.

shellinput.c

+8-1
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ void parseIORedir(char *command, int stdinBkp2, int stdoutBkp2)
145145

146146
for (int i = 0; i < parsedLength; i++)
147147
{
148+
if (i == parsedLength - 1 && (strcmp(parsed[i], "&") == 0))
149+
{
150+
continue;
151+
}
148152
if (strcmp(parsed[i], "<") == 0)
149153
{
150154
ipFlag = 1;
@@ -572,7 +576,10 @@ void shellInput(char *homeDir)
572576
size_t bufferLen = 1024;
573577
buffer = (char *)malloc(bufferLen * sizeof(char));
574578

575-
getline(&buffer, &bufferLen, stdin);
579+
if (getline(&buffer, &bufferLen, stdin) == EOF)
580+
{
581+
cleanup();
582+
}
576583

577584
parseInput(buffer);
578585

test/a

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
A aa b c d i p1 p2 p3 p4 p5 p6 p7 test1
1+
1 47 466

test/cat

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
A aa b c cat d i p1 p2 p3 p4 p5 p6 p7 test1

0 commit comments

Comments
 (0)