Commit 9e2d48fd authored by desiredeveloper's avatar desiredeveloper

part 4 IO

parent a8193dca
......@@ -60,6 +60,46 @@ void funcCd(char *fpath){
free(temp);
}
void ioRedirect(char **tokens,int n){
FILE *fp;
char **arglist = (char **)malloc(MAX_NUM_TOKENS * sizeof(char *));
int j=0;
for(int i=0;strcmp(tokens[i],">>") && strcmp(tokens[i],">") && strcmp(tokens[i],"<");i++){
arglist[j] = (char*)malloc(MAX_TOKEN_SIZE*sizeof(char));
strcpy(arglist[j++],tokens[i]);
}
arglist[j]=NULL;
char *temp = (char *)malloc(sizeof(char)*150);
switch (fork()) {
case -1:
break;
case 0:
if(!strcmp(tokens[n-2],">>"))
fp = freopen(tokens[n-1],"a",stdout);
else if(!strcmp(tokens[n-2],">"))
fp = freopen(tokens[n-1],"w",stdout);
else
fp = freopen(tokens[n-1],"r",stdin);
strcpy(temp,"/bin/");
strcat(temp,arglist[0]);
if(execv(temp,arglist)==-1){
strcpy(temp,"/usr/bin/");
strcat(temp,arglist[0]);
execv(temp,arglist);
}
free(temp);
}
wait(NULL);
for(int i=0;arglist[i]!=NULL;i++)
free(arglist[i]);
free(arglist);
}
void exBackground(char **tokens,int n){
char **arglist = (char **)malloc(MAX_NUM_TOKENS * sizeof(char *));
int j=0,forkcalls=0;
......@@ -100,13 +140,17 @@ void exSerial(char **tokens,int n){
int j=0;
for(int i=0;i<n;i++){
int ioFlag = 0;
while(tokens[i]!=NULL && strcmp(tokens[i],"&&")!=0 ){
if(!ioFlag)
ioFlag=strcmp(tokens[i],">>")==0 || strcmp(tokens[i],">")==0 || strcmp(tokens[i],"<")==0;
arglist[j] = (char*)malloc(MAX_TOKEN_SIZE*sizeof(char));
strcpy(arglist[j++],tokens[i++]);
}
arglist[j]=NULL;
char *temp = (char *)malloc(sizeof(char)*150);
if(!ioFlag){
switch (fork()) {
case -1:
break;
......@@ -120,6 +164,10 @@ void exSerial(char **tokens,int n){
}
free(temp);
}
}
else {
ioRedirect(arglist,j);
}
wait(NULL);
j=0;
}
......@@ -135,14 +183,18 @@ void exParallel(char **tokens,int n){
int j=0,forkcalls=0;
for(int i=0;i<n;i++){
int ioFlag = 0;
while(tokens[i]!=NULL && strcmp(tokens[i],"&&&")!=0 ){
if(!ioFlag)
ioFlag=strcmp(tokens[i],">>")==0 || strcmp(tokens[i],">")==0 || strcmp(tokens[i],"<")==0;
arglist[j] = (char*)malloc(MAX_TOKEN_SIZE*sizeof(char));
strcpy(arglist[j++],tokens[i++]);
}
forkcalls++;
arglist[j]=NULL;
char *temp = (char *)malloc(sizeof(char)*150);
if(!ioFlag){
forkcalls++;
switch (fork()) {
case -1:
break;
......@@ -155,7 +207,10 @@ void exParallel(char **tokens,int n){
execv(temp,arglist);
}
free(temp);
}
}
else {
ioRedirect(arglist,j);
}
j=0;
}
......@@ -169,6 +224,7 @@ void exParallel(char **tokens,int n){
free(arglist);
}
/* Splits the string by space and returns the array of tokens
*/
......@@ -216,7 +272,7 @@ int main(int argc, char* argv[]) {
}
while(1) {
int parallel=0,serial=0,background=0,internal=0,cdir=0;
int parallel=0,serial=0,background=0,io=0,cdir=0;
/* BEGIN: TAKING INPUT */
bzero(line, sizeof(line));
......@@ -250,6 +306,9 @@ int main(int argc, char* argv[]) {
if(!background)
background=strcmp(tokens[i],"&")==0;
if(!io)
io=strcmp(tokens[i],">>")==0 || strcmp(tokens[i],">")==0 || strcmp(tokens[i],"<")==0;
// printf("found token %s\n", tokens[i]);
}
t1 = clock();
......@@ -259,6 +318,8 @@ int main(int argc, char* argv[]) {
exSerial(tokens,i);
else if(background)
exBackground(tokens,i);
else if(io)
ioRedirect(tokens,i);
else {
if(!strcmp(tokens[0],"dir")){
funcDir(tokens);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment