Hi guys, I'm still working on my shell. I'm trying to implement a function typefile that will take a command line input as follows: > type <file1> This command will implement a catenation of file1, equal to the command cat <file1> I need to use execvp() and fork() system calls to create a new process that will type/cat any text file. In my code below, the execvp() call in the function at the bottom gets me the following: o-shell.c:128: warning: passing arg 2 of `execvp' from incompatible pointer type I know for sure i'm calling execvp incorrectly, any tips/pointers would be great. I want to use /bin/cat followed by filename as the argument. Code: #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <string.h> int main(int argc, char *argv[]) { //VARIABLE DECLARATIONS char command[50]; //Command line input //tokens for strtok() funtion char * com; //Primary command char * arg1; //First argument of command (usually a file name) char * arg2; //2nd argument of command (usually a file name) int args; //Number of arguments entered //FUNCTION DECLARATIONS void typefile(char * filename); printf("***************************************************\n"); printf("Welcome to O-Shell! A UNIX shell by O Haqqi\n\n"); printf("Type 'help' for list of commands, 'exit' to exit\n"); printf("***************************************************\n"); for(;;) { printf("o-shell>"); //user prompts for o-shell fgets(command, 1024, stdin); //command line input from user com = strtok(command, " \r\n\t"); args = 0; arg1 = strtok(NULL, " \r\n\t"); if(arg1) args++; //to see if arguments being tracked arg2 = strtok(NULL, " \r\n\t"); if(arg2) args++; //to see if arguments being tracked if(com != NULL) //Can only execute commands if a command is entered //Otherwise it keeps looping and printing prompt { printf("command entered: %s\n", com); printf("There are %d arguments\n", args); if ((strcmp(com,"help")) == 0 || (strcmp(com,"Help")) == 0) { printf("***************************************************\n"); printf("\nO-Shell Help Menu:\n"); printf("\nhelp - Print help menu\n"); printf("\nexit - Exit O-Shell\n"); printf("\ntype <file> - Print contents of <file> to terminal\n"); printf("\ncopy <file1> <file2> - Copy contents of <file1> to <file2>."); printf("\n <file2> must be a non-existent file and will be created\n"); printf("\ndelete <file> - Delete <file> from system\n"); printf("***************************************************\n"); } else if ((strcmp(com,"exit")) == 0 || (strcmp(com,"Exit")) == 0) { printf("Exiting O-Shell...Goodbye!\n"); //if exit command is entered, exit() system call is performed exit(1); } else if ((strcmp(com,"type")) == 0 || (strcmp(com,"Type")) == 0) { if((arg1 == NULL) || (arg2 != NULL)) //arg1 must exist, arg2 must be empty { printf("Incorrect number of arguments! Type 'help' for correct format.\n"); } else printf("Printing contents of file: %s\n", arg1); printf("***************************************************\n"); typefile(arg1); //call typefile function (see below) } else printf("Invalid command!!! Type 'help' for list of valid commands.\n"); } } return 0; } /************************************************************************************************ Function typefile() prints contents of a file to the terminal Format: type <file1> ************************************************************************************************/ void typefile(char * filename) { int pid, status; const char cat[] = "/bin/cat"; pid = fork(); if(pid < 0) printf("ERROR: Child pid = %i FORK FAILED! Please try again.\n", pid); else if(pid > 0) printf("ERROR: Child pid = %i Parent process executing, FORK FAILED!\n", pid); else if(pid == 0) //If the process id is zero, fork() was successful { printf("Child pid = %i FORK SUCCESSFUL...\n"); execvp(cat, filename); } }