+1 (315) 557-6473 

Graphical shell for Linux using C and the IOL graphical console environment homework help

The assignment deals with implementing a graphical shell for Linux using C and the IOL console environment. Our C programming homework help experts divide the program into three parts. The first part deals with implementing a text-based shell with some basic commands. The second part deals with implementing the shell as a graphical user interface using the ioL console. The last part of the assignment deals with implementing advanced file operations to copy, paste and cut files using the graphical interface.
Table Of Contents
  • Implementing a Text-based Graphical Shell using Basic C Commands

Implementing a Text-based Graphical Shell using Basic C Commands

#include #include #include #include #include #include #include #include #include /* Remove spaces at start and end of string */ char *trim(char *string) { char *trimmed; while (isspace(string[strlen(string) - 1])) string[strlen(string) - 1] = 0; trimmed = string; while (isspace(*trimmed)) trimmed++; return trimmed; } /* Print the contents of the current directory */ void print_directory() { DIR *dir; struct dirent *dir_entry; struct stat file_stat; char buffer[PATH_MAX]; getcwd(buffer, PATH_MAX); printf("Current directory: %s\n", buffer); printf("***Directory listing follows***\n"); dir = opendir("."); while((dir_entry = readdir(dir)) != NULL) { if (dir_entry->d_name[0]!='.') { if(stat(dir_entry->d_name, &file_stat) != -1) { if (file_stat.st_mode & S_IFDIR) /* directory */ printf("Directory: "); else if (file_stat.st_mode & S_IXUSR) /* executable */ printf("Executable: "); else printf("File: "); printf("%s\n", dir_entry->d_name); } } } } /* Execute the file given as an argument */ void execute_file(char *filename) { struct stat file_stat; char buffer[PATH_MAX]; if(stat(filename, &file_stat) != -1) { if ( !(file_stat.st_mode & S_IFDIR) && /* not directory */ file_stat.st_mode & S_IXUSR) /* executable */ { if (strchr(filename, '/') != NULL) sprintf(buffer, "xterm -hold -e '%s' &", filename); else sprintf(buffer, "xterm -hold -e './%s' &", filename); system(buffer); } else printf("Error: Unable to execute file.\n"); } else printf("Error: Unable to execute file.\n"); } /* Show the contents of the file given as an argument */ void show_file(char *filename) { struct stat file_stat; char buffer[PATH_MAX]; if(stat(filename, &file_stat) != -1) { if (!(file_stat.st_mode & S_IFDIR)) /* not directory */ { if (file_stat.st_size < 500000) { sprintf(buffer, "xterm -hold -e 'less %s' &", filename); system(buffer); } else printf("Error: Could not open text file. File size too large.\n"); } else printf("Error: file is a directory.\n"); } else printf("Error: Unable to show file contents.\n"); } int main() { int quit; char buffer[PATH_MAX]; char *command; print_directory(); printf("\n"); quit = 0; while(!quit) { fgets(buffer, PATH_MAX, stdin); command = trim(buffer); if(!strncmp(command, "d:", 2)) { command = trim(command + 2); if (command[0] == 0) strcpy(command, "."); if( chdir(command) < 0 ) printf("Unable to change to directory: %s\n", command); else { getcwd(buffer, PATH_MAX); print_directory(); } } else if(!strncmp(command, "x:", 2)) { command = trim(command + 2); execute_file(command); } else if(!strncmp(command, "v:", 2)) { command = trim(command + 2); show_file(command); } else if(!strncmp(command, "q:", 2)) quit = 1; else printf("Invalid command\n"); printf("\n"); } return 0; } #include #include #include #include #include #include #include #include #include int error_visible = 0; /* Show an error message on the error box */ void Error(char *msg) { printf(""); printf("",msg); error_visible = 1; } void ClearError() { if(error_visible) printf(""); error_visible = 0; } /* Remove spaces at start and end of string */ char *trim(char *string) { char *trimmed; while (isspace(string[strlen(string) - 1])) string[strlen(string) - 1] = 0; trimmed = string; while (isspace(*trimmed)) trimmed++; return trimmed; } /* Print the contents of the current directory */ void print_directory() { DIR *dir; struct dirent *dir_entry; struct stat file_stat; char buffer[PATH_MAX]; int n, open; getcwd(buffer, PATH_MAX); printf("", buffer); printf("\n"); dir = opendir("."); /*count number of entries */ n = 0; while((dir_entry = readdir(dir)) != NULL) if (dir_entry->d_name[0]!='.') if(stat(dir_entry->d_name, &file_stat) != -1) n++; if(n>0) /* if there's at least one entry*/ { printf("d_name[0]!='.') { if(stat(dir_entry->d_name, &file_stat) != -1) { if((n%2) == 0) { printf(" " " onmousein=" " onmouseout= " "{" " }>" " " "}>}>", n, dir_entry->d_name, n, n, dir_entry->d_name); else if (file_stat.st_mode & S_IXUSR) /* executable */ printf( " " " onmousein= " " onmouseout= " "{" " }>" " " "}>}>", n, dir_entry->d_name, n, n, dir_entry->d_name); else printf( " " " onmousein= " " onmouseout= " "{" " }>" " " "}>}>", n, dir_entry->d_name, n, n, dir_entry->d_name); n++; if((n%2) == 0) { printf(">\n"); open=0; } } } } if(open) printf(">"); printf(">}>\n"); } else printf("}"); ClearError(); } /* Execute the file given as an argument */ void execute_file(char *filename) { struct stat file_stat; char buffer[PATH_MAX]; if(stat(filename, &file_stat) != -1) { if ( !(file_stat.st_mode & S_IFDIR) && /* not directory */ file_stat.st_mode & S_IXUSR) /* executable */ { if (strchr(filename, '/') != NULL) sprintf(buffer, "xterm -e '%s' &", filename); else sprintf(buffer, "xterm -e './%s' &", filename); system(buffer); ClearError(); } else Error("Unable to execute file."); } else Error("Unable to execute file."); } /* Show the contents of the file given as an argument */ void show_file(char *filename) { struct stat file_stat; char buffer[PATH_MAX]; if(stat(filename, &file_stat) != -1) { if (!(file_stat.st_mode & S_IFDIR)) /* not directory */ { if (file_stat.st_size < 500000) { sprintf(buffer, "xterm -e 'less %s' &", filename); system(buffer); ClearError(); } else Error("Could not open text file. File size too large."); } else Error("File is a directory."); } else Error("Unable to show file contents."); } int main() { int quit; char buffer[PATH_MAX]; char *command; printf(""); printf(""); printf(""); printf(">"); printf(" {Go to parent directory} >"); printf(" "); printf("}>"); printf("}> "); printf(""); printf("}>"); printf(""); printf("}>"); print_directory(); quit = 0; while(!quit) { fgets(buffer, PATH_MAX, stdin); command = trim(buffer); if(!strncmp(command, "d:", 2)) { command = trim(command + 2); if (command[0] == 0) strcpy(command, "."); if( chdir(command) < 0 ) Error("Unable to change to directory"); else { getcwd(buffer, PATH_MAX); print_directory(); } } else if(!strncmp(command, "x:", 2)) { command = trim(command + 2); execute_file(command); } else if(!strncmp(command, "v:", 2)) { command = trim(command + 2); show_file(command); } else if(!strncmp(command, "q:", 2)) quit = 1; } return 0; } #include #include #include #include #include #include #include #include #include enum Operations {COPY, CUT}; /* Show an error message on the error box */ void Error(char *msg) { printf(""); printf("",msg); printf( "" "" ""); } /* Remove spaces at start and end of string */ char *trim(char *string) { char *trimmed; while (isspace(string[strlen(string) - 1])) string[strlen(string) - 1] = 0; trimmed = string; while (isspace(*trimmed)) trimmed++; return trimmed; } /* Print the contents of the current directory */ void print_directory() { DIR *dir; struct dirent *dir_entry; struct stat file_stat; char buffer[PATH_MAX]; int n, open; getcwd(buffer, PATH_MAX); printf("", buffer); printf("\n"); printf( "" ""); dir = opendir("."); /*count number of entries */ n = 0; while((dir_entry = readdir(dir)) != NULL) if (dir_entry->d_name[0]!='.') if(stat(dir_entry->d_name, &file_stat) != -1) n++; if(n>0) /* if there's at least one entry*/ { printf("d_name[0]!='.') { if(stat(dir_entry->d_name, &file_stat) != -1) { if((n%2) == 0) { printf(" " " onmousein=" " onmouseout= " "{" " }>" " " "}>}>", n, dir_entry->d_name, n, n, dir_entry->d_name); else if (file_stat.st_mode & S_IXUSR) /* executable */ printf( " " " onmousein= " " oncontextclick=" " ,, " " ,, " " , " " " " onmouseout= " "{" " }>" " " "}>}>", n, dir_entry->d_name, n, dir_entry->d_name, dir_entry->d_name, n, dir_entry->d_name); else printf( " " " onmousein= " " oncontextclick=" " ,, " " ,, " " , " " " " onmouseout= " "{" " }>" " " "}>}>", n, dir_entry->d_name, n, dir_entry->d_name, dir_entry->d_name, n, dir_entry->d_name); n++; if((n%2) == 0) { printf(">\n"); open=0; } } } } if(open) printf(">"); printf(">}>\n"); } else printf("}"); } /* Execute the file given as an argument */ void execute_file(char *filename) { struct stat file_stat; char buffer[PATH_MAX]; if(stat(filename, &file_stat) != -1) { if ( !(file_stat.st_mode & S_IFDIR) && /* not directory */ file_stat.st_mode & S_IXUSR) /* executable */ { if (strchr(filename, '/') != NULL) sprintf(buffer, "xterm -e '%s' &", filename); else sprintf(buffer, "xterm -e './%s' &", filename); system(buffer); } else Error("Unable to execute file."); } else Error("Unable to execute file."); } /* Show the contents of the file given as an argument */ void show_file(char *filename) { struct stat file_stat; char buffer[PATH_MAX]; if(stat(filename, &file_stat) != -1) { if (!(file_stat.st_mode & S_IFDIR)) /* not directory */ { if (file_stat.st_size < 500000) { sprintf(buffer, "xterm -e 'less %s' &", filename); system(buffer); } else Error("Could not open text file. File size too large."); } else Error("File is a directory."); } else Error("Unable to show file contents."); } void paste_file(char *dirname, char *filename, int operation) { struct stat file_stat; char buffer[PATH_MAX]; char inpath[PATH_MAX]; char outpath[PATH_MAX]; getcwd(buffer, PATH_MAX); if(!strcmp(dirname, buffer)) /* if we are in the same directory */ { if(operation != CUT) /* moving to the same place */ { sprintf(inpath, "\"%s/%s\"", buffer, filename); sprintf(outpath, "\"%s/Copy of %s\"", buffer, filename); sprintf(buffer, "cp %s %s", inpath, outpath); system(buffer); } } else { sprintf(inpath, "\"%s/%s\"", dirname, filename); if(stat(filename, &file_stat) == -1) /* file doesn't exist here */ { if (operation == COPY) sprintf(buffer, "cp %s .", inpath); else sprintf(buffer, "mv %s .", inpath); } else { if (operation == COPY) sprintf(buffer, "cp %s \"./Copy of %s\"", inpath, filename); else sprintf(buffer, "mv %s \"./Copy of %s\"", inpath, filename); } system(buffer); } if(operation == CUT) printf(""); } int main() { int quit; char buffer[PATH_MAX]; char *command; char sel_dir[PATH_MAX]; char sel_file[PATH_MAX]; int operation; /**/ printf(""); printf(""); printf(""); printf(">"); printf(" {Go to parent directory} >"); printf(" "); printf(" "); printf(" , "); printf(" {Cut} "); printf(" >"); printf(" , "); printf(" {Copy} "); printf(" >"); printf(" "); printf(" {Paste} "); printf(" >"); printf("}>"); printf("}> "); printf(""); printf("}>"); printf(""); printf("}>"); print_directory(); quit = 0; while(!quit) { fgets(buffer, PATH_MAX, stdin); command = trim(buffer); if(!strncmp(command, "d:", 2)) { command = trim(command + 2); if (command[0] == 0) strcpy(command, "."); if( chdir(command) < 0 ) Error("Unable to change to directory"); else print_directory(); } else if(!strncmp(command, "x:", 2)) { command = trim(command + 2); execute_file(command); } else if(!strncmp(command, "v:", 2)) { command = trim(command + 2); show_file(command); } else if(!strncmp(command, "k:", 2)) /* cut */ { operation = CUT; } else if(!strncmp(command, "c:", 2)) /* copy */ { operation = COPY; } else if(!strncmp(command, "p:", 2)) /* paste */ { paste_file(sel_dir, sel_file, operation); print_directory(); } else if(!strncmp(command, "f:", 2)) /* file selected */ { command = trim(command + 2); getcwd(sel_dir, PATH_MAX); strcpy(sel_file, command); } else if(!strncmp(command, "q:", 2)) quit = 1; } return 0; }