views:

54

answers:

3

i have a project for a course, i did almost everything but i have this error i dont know who to solve it...

the project about doing our own shell some of them we have to write our code, others we will use the fork method..

this is the code,

#include <sys/wait.h>
#include <dirent.h>
#include <limits.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>

int main(int argc, char **argv)
{
    pid_t pid;
    char str[21], *arg[10];
    int x,status,number;   
    system("clear");
    while(1)
    {

        printf("Rshell>" );
        fgets(str,21,stdin);
        x = 0;
        arg[x] = strtok(str, " \n\t");
        while(arg[x])
        arg[++x] = strtok(NULL, " \n\t");
        if(NULL!=arg[0])
        {

            if(strcasecmp(arg[0],"cat")==0) //done
            {
                int f=0,n;
                    char l[1];
                    struct stat s;
                    if(x!=2)
                    {
                            printf("Mismatch argument\n");


                    } 
                    /*if(access(arg[1],F_OK))
                {
                        printf("File Exist");
                        exit(1);
                    }
                   if(stat(arg[1],&s)<0)
                   {
                       printf("Stat ERROR");
                       exit(1);
                   }
                   if(S_ISREG(s.st_mode)<0)
                   {
                       printf("Not a Regular FILE");
                       exit(1);
                   }
                   if(geteuid()==s.st_uid)
                       if(s.st_mode & S_IRUSR)
                           f=1;
                   else if(getegid()==s.st_gid)
                       if(s.st_mode & S_IRGRP)
                           f=1;
                   else if(s.st_mode & S_IROTH)
                       f=1;
                   if(!f)
                   {
                       printf("Permission denied");
                       exit(1);
                   }*/
                       f=open(arg[1],O_RDONLY);
                   while((n=read(f,l,1))>0)
                       write(1,l,n);

            }
            else if(strcasecmp(arg[0],"rm")==0) //done
            {
                if( unlink( arg[1] ) != 0 )
                    perror( "Error deleting file" );
                else
                puts( "File successfully deleted" );

            }
            else if(strcasecmp(arg[0],"rmdir")==0) //done
            {
                if( remove( arg[1] ) != 0 )
                    perror( "Error deleting Directory" );
                else
                puts( "Directory successfully deleted" );

            }
            else if(strcasecmp(arg[0],"ls")==0) //done
            {

                DIR *dir;
                struct dirent *dirent;
                char *where = NULL;
                //printf("x== %i\n",x);
                //printf("x== %s\n",arg[1]);
                //printf("x== %i\n",get_current_dir_name());
                if (x == 1) 
                where = get_current_dir_name();
                else where = arg[1];

                if (NULL == (dir = opendir(where))) {
                    fprintf(stderr,"%d (%s) opendir %s failed\n", errno, strerror(errno), where);
                    return 2;
                }

                while (NULL != (dirent = readdir(dir))) {
                    printf("%s\n", dirent->d_name);
                }

                closedir(dir);

            }
            else if(strcasecmp(arg[0],"cp")==0) //not yet for Raed
            {
                FILE *from, *to;
                char ch;


                if(argc!=3) {
                printf("Usage: copy <source> <destination>\n");
                 exit(1);
                }

                 /* open source file */
                if((from = fopen(argv[1], "rb"))==NULL) {
                        printf("Cannot open source file.\n");
                        exit(1);
                }

                 /* open destination file */
                if((to = fopen(argv[2], "wb"))==NULL) {
                        printf("Cannot open destination file.\n");
                     exit(1);
                }

                /* copy the file */
                 while(!feof(from)) {
                    ch = fgetc(from);
                    if(ferror(from)) 
                    {
                        printf("Error reading source file.\n");
                            exit(1);
                    }
                    if(!feof(from)) fputc(ch, to);
                        if(ferror(to)) {
                             printf("Error writing destination file.\n");
                             exit(1);
                    }
                 }

                if(fclose(from)==EOF) {
                     printf("Error closing source file.\n");
                     exit(1);
                 }

                 if(fclose(to)==EOF) {
                     printf("Error closing destination file.\n");
                     exit(1);
                 }

            }
            else if(strcasecmp(arg[0],"mv")==0)//done
            {
                if( rename(arg[1],arg[2]) != 0 )
                    perror( "Error moving file" );
                else
                puts( "File successfully moved" );

            }
            else if(strcasecmp(arg[0],"hi")==0)//done
            {

                printf("hello\n");
            }
            else if(strcasecmp(arg[0],"exit")==0) // done
            {

                return 0;

            }
            else if(strcasecmp(arg[0],"sleep")==0) // done 
            {

                if(x==1)
                printf("plz enter the # seconds to sleep\n");
                else
                sleep(atoi(arg[1]));
            }
            else if(strcmp(arg[0],"history")==0) // not done 
            {
                FILE *infile;
                //char fname[40];
                char line[100];
                int lcount;
                ///* Read in the filename */
                //printf("Enter the name of a ascii file: ");
                //fgets(History.txt, sizeof(fname), stdin);

                /* Open the file.  If NULL is returned there was an error */
                if((infile = fopen("History.txt", "r")) == NULL) 
                {
                        printf("Error Opening File.\n");
                        exit(1);
                }

                while( fgets(line, sizeof(line), infile) != NULL ) {
                    /* Get each line from the infile */
                        lcount++;
                        /* print the line number and data */
                        printf("Line %d: %s", lcount, line);  
                }

                fclose(infile);  /* Close the file */
                writeHistory(arg);
                //write to txt file every new executed command
                //read from the file once the history command been called
                //if a command called not for the first time then just replace it to the end of the file
            }
            else if(strncmp(arg[0],"@",1)==0) // not done 
            {
                //scripting files
                // read from the file command by command and executing them
            }
            else if(strcmp(arg[0],"type")==0) //not done 
            {

                //if(x==1)
                //printf("plz enter the argument\n");
                //else
                //type((arg[1]));
            }
            else
            {

                pid = fork( );

                if (pid == 0)
                {
                    execlp(arg[0], arg[0], arg[1], arg[2], NULL);
                    printf ("EXEC Failed\n");
                }
                else
                {

                    wait(&status);
                    if(strcmp(arg[0],"clear")!=0)
                    {   
                        printf("status %04X\n",status);
                        if(WIFEXITED(status))
                            printf("Normal termination, exit code %d\n", WEXITSTATUS(status));
                        else
                            printf("Abnormal termination\n");
                    }
                }

            }

        }
    }
}
void writeHistory(char *arg[]) 
{
    FILE *file; 
    file = fopen("History.txt","a+"); /* apend file (add text to 
    a file or create a file if it does not exist.*/ 
    int i =0;
    while(strcasecmp(arg[0],NULL)==0)
    {
        fprintf(file,"%s ",arg[i]); /*writes*/ 
    }
    fprintf(file,"\n"); /*new line*/ 
    fclose(file); /*done!*/ 
    getchar(); /* pause and wait for key */ 
    //return 0; 
}

the thing is when i compile the code, this what it gives me

/home/ugics/st255375/ICS431Labs/Project/Rshell.c: At top level:
/home/ugics/st255375/ICS431Labs/Project/Rshell.c:264: warning: conflicting types for ‘writeHistory’
/home/ugics/st255375/ICS431Labs/Project/Rshell.c:217: note: previous implicit declaration of ‘writeHistory’ was here

can any one help me???

thanks

A: 
#include <sys/wait.h>
#include <dirent.h>
#include <limits.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>

int main(int argc, char **argv)
{
    pid_t pid;
    char str[21], *arg[10];
    int x,status,number;   
    system("clear");
    while(1)
    {

        printf("Rshell>" );
        fgets(str,21,stdin);
        x = 0;
        arg[x] = strtok(str, " \n\t");
        while(arg[x])
        arg[++x] = strtok(NULL, " \n\t");
        if(NULL!=arg[0])
        {

            if(strcasecmp(arg[0],"cat")==0) //done
            {
                int f=0,n;
                    char l[1];
                    struct stat s;
                    if(x!=2)
                    {
                            printf("Mismatch argument\n");


                    } 
                    /*if(access(arg[1],F_OK))
                {
                        printf("File Exist");
                        exit(1);
                    }
                   if(stat(arg[1],&s)<0)
                   {
                       printf("Stat ERROR");
                       exit(1);
                   }
                   if(S_ISREG(s.st_mode)<0)
                   {
                       printf("Not a Regular FILE");
                       exit(1);
                   }
                   if(geteuid()==s.st_uid)
                       if(s.st_mode & S_IRUSR)
                           f=1;
                   else if(getegid()==s.st_gid)
                       if(s.st_mode & S_IRGRP)
                           f=1;
                   else if(s.st_mode & S_IROTH)
                       f=1;
                   if(!f)
                   {
                       printf("Permission denied");
                       exit(1);
                   }*/
                       f=open(arg[1],O_RDONLY);
                   while((n=read(f,l,1))>0)
                       write(1,l,n);

            }
            else if(strcasecmp(arg[0],"rm")==0) //done
            {
                if( unlink( arg[1] ) != 0 )
                    perror( "Error deleting file" );
                else
                puts( "File successfully deleted" );

            }
            else if(strcasecmp(arg[0],"rmdir")==0) //done
            {
                if( remove( arg[1] ) != 0 )
                    perror( "Error deleting Directory" );
                else
                puts( "Directory successfully deleted" );

            }
            else if(strcasecmp(arg[0],"ls")==0) //done
            {

                DIR *dir;
                struct dirent *dirent;
                char *where = NULL;
                //printf("x== %i\n",x);
                //printf("x== %s\n",arg[1]);
                //printf("x== %i\n",get_current_dir_name());
                if (x == 1) 
                where = get_current_dir_name();
                else where = arg[1];

                if (NULL == (dir = opendir(where))) {
                    fprintf(stderr,"%d (%s) opendir %s failed\n", errno, strerror(errno), where);
                    return 2;
                }

                while (NULL != (dirent = readdir(dir))) {
                    printf("%s\n", dirent->d_name);
                }

                closedir(dir);

            }
            else if(strcasecmp(arg[0],"cp")==0) //not yet for Raed
            {
                FILE *from, *to;
                char ch;


                if(argc!=3) {
                printf("Usage: copy <source> <destination>\n");
                 exit(1);
                }

                 /* open source file */
                if((from = fopen(argv[1], "rb"))==NULL) {
                        printf("Cannot open source file.\n");
                        exit(1);
                }

                 /* open destination file */
                if((to = fopen(argv[2], "wb"))==NULL) {
                        printf("Cannot open destination file.\n");
                     exit(1);
                }

                /* copy the file */
                 while(!feof(from)) {
                    ch = fgetc(from);
                    if(ferror(from)) 
                    {
                        printf("Error reading source file.\n");
                            exit(1);
                    }
                    if(!feof(from)) fputc(ch, to);
                        if(ferror(to)) {
                             printf("Error writing destination file.\n");
                             exit(1);
                    }
                 }

                if(fclose(from)==EOF) {
                     printf("Error closing source file.\n");
                     exit(1);
                 }

                 if(fclose(to)==EOF) {
                     printf("Error closing destination file.\n");
                     exit(1);
                 }

            }
            else if(strcasecmp(arg[0],"mv")==0)//done
            {
                if( rename(arg[1],arg[2]) != 0 )
                    perror( "Error moving file" );
                else
                puts( "File successfully moved" );

            }
            else if(strcasecmp(arg[0],"hi")==0)//done
            {

                printf("hello\n");
            }
            else if(strcasecmp(arg[0],"exit")==0) // done
            {

                return 0;

            }
            else if(strcasecmp(arg[0],"sleep")==0) // done 
            {

                if(x==1)
                printf("plz enter the # seconds to sleep\n");
                else
                sleep(atoi(arg[1]));
            }
            else if(strcmp(arg[0],"history")==0) // not done 
            {
                FILE *infile;
                //char fname[40];
                char line[100];
                int lcount;
                ///* Read in the filename */
                //printf("Enter the name of a ascii file: ");
                //fgets(History.txt, sizeof(fname), stdin);

                /* Open the file.  If NULL is returned there was an error */
                if((infile = fopen("History.txt", "r")) == NULL) 
                {
                        printf("Error Opening File.\n");
                        exit(1);
                }

                while( fgets(line, sizeof(line), infile) != NULL ) {
                    /* Get each line from the infile */
                        lcount++;
                        /* print the line number and data */
                        printf("Line %d: %s", lcount, line);  
                }

                fclose(infile);  /* Close the file */
                writeHistory(*arg);
                //write to txt file every new executed command
                //read from the file once the history command been called
                //if a command called not for the first time then just replace it to the end of the file
            }
            else if(strncmp(arg[0],"@",1)==0) // not done 
            {
                //scripting files
                // read from the file command by command and executing them
            }
            else if(strcmp(arg[0],"type")==0) //not done 
            {

                //if(x==1)
                //printf("plz enter the argument\n");
                //else
                //type((arg[1]));
            }
            else
            {

                pid = fork( );

                if (pid == 0)
                {
                    execlp(arg[0], arg[0], arg[1], arg[2], NULL);
                    printf ("EXEC Failed\n");
                }
                else
                {

                    wait(&status);
                    if(strcmp(arg[0],"clear")!=0)
                    {   
                        printf("status %04X\n",status);
                        if(WIFEXITED(status))
                            printf("Normal termination, exit code %d\n", WEXITSTATUS(status));
                        else
                            printf("Abnormal termination\n");
                    }
                }

            }

        }
    }
}
void writeHistory(char *arg[]) 
{
    FILE *file; 
    file = fopen("History.txt","a+"); /* apend file (add text to 
    a file or create a file if it does not exist.*/ 
    int i =0;
    while(strcasecmp(arg[0],NULL)==0)
    {
        fprintf(file,"%s ",arg[i]); /*writes*/ 
    }
    fprintf(file,"\n"); /*new line*/ 
    fclose(file); /*done!*/ 
    getchar(); /* pause and wait for key */ 
    //return 0; 
}
Nadeem tabbaa
Please do not add edits of your post as answers - this is not a discussion forum. Edit your original post instead. This time, the code in your question has already been formatted by a kindred spirit, so you should just delete this answer.
Péter Török
+1  A: 

First, your WriteHistory call is expecting an array of pointers, but you're only passing in a single char pointer variable to it.

You're getting an odd message because you aren't declaring the function prior to using it, so when it gets to the definition of WriteHistory, it doesn't match the call that you're making earlier.

Joe
so how should i do it in a right way???
Nadeem tabbaa
First, add a declaration for WriteHistory to the top of your source file. Second, figure out what you want to pass to it and either fix the function or the place you call it in main().
Joe
okey that solved the previous one, but now it giving me this errorvoid writeHistory(char *arg[]) { FILE *file; file = fopen("History.txt","a+"); /* apend file (add text to a file or create a file if it does not exist.*/ int i =0; while(strcasecmp(arg[0],NULL)==0) { fprintf(file,"%s ",arg[i]); /*writes*/ } fprintf(file,"\n"); /*new line*/ fclose(file); /*done!*/ getchar(); /* pause and wait for key */ //return 0; }
Nadeem tabbaa
sorry about the above/home/ugics/st255375/ICS431Labs/Project/Rshell.c:12: note: expected ‘char **’ but argument is of type ‘char *’this is the error am receiving now
Nadeem tabbaa
okey i solved it :D thank you very much :D
Nadeem tabbaa
A: 

Just add

void writeHistory(char *arg[]);

before the main declaration

mariosangiorgio