#include #include #include #include "directory.h" #define MAXLINESIZE 150 /*These below define ishardcoded into scanf strings. Do not change it without changing the %90s strings*/ #define MAXARGSIZE 90 #define TRUE 1 #define FALSE 0 void handle_create (char * args); void handle_append (char * args); void handle_mkdir (char * args); void handle_ln (char * args); void handle_cd (char * args); void handle_rm (char * args); void handle_rmdir (char * args); void handle_mv (char * args); void handle_pwd (char * args); void handle_ls (char * args); void handle_cat (char * args); void handle_setread (char * args); void handle_setwrite (char * args); int check_args(char * args); int check_ls_args(char * args); /*Constant String Declarations*/ const char * create = "create"; const char * append = "append"; const char * mk_dir = "mkdir"; const char * ln = "ln"; const char * cd = "cd"; const char * rm = "rm"; const char * rm_dir = "rmdir"; const char * mv = "mv"; const char * pwd = "pwd"; const char * ls = "ls"; const char * cat = "cat"; const char * setread = "setread"; const char * setwrite = "setwrite"; /*error messages*/ const char * command_not_found = ": command not found"; const char * too_many_args = ": too many arguments"; const char * usage = "usage: "; const char * invalid_file_name =": invalid filename"; const char * invalid_wild_card =": invalid wild card expression"; int main ( ) { char cmd[9]; char line[MAXLINESIZE]; int tokenCount; int numCharsRead=0; initialFileSystem ( ); printf ("> "); while (fgets (line, MAXLINESIZE, stdin) != NULL) { tokenCount = sscanf (line, "%9s%n", cmd, &numCharsRead); while (*(line + numCharsRead) == ' ') numCharsRead++; if (tokenCount <= 0) { /* blank line; do nothing */ } else if (strcmp (cmd, create) == 0) { handle_create (line+numCharsRead); } else if (strcmp (cmd, append) == 0) { handle_append (line+numCharsRead); } else if (strcmp (cmd, mk_dir) == 0) { handle_mkdir (line+numCharsRead); } else if (strcmp (cmd, ln) == 0) { handle_ln (line+numCharsRead); } else if (strcmp (cmd, cd) == 0) { handle_cd (line+numCharsRead); } else if (strcmp (cmd, rm) == 0) { handle_rm (line+numCharsRead); } else if (strcmp (cmd, rm_dir) == 0) { handle_rmdir (line+numCharsRead); } else if (strcmp (cmd, mv) == 0) { handle_mv (line+numCharsRead); } else if (strcmp (cmd, pwd) == 0) { handle_pwd (line+numCharsRead); } else if (strcmp (cmd, ls) == 0) { handle_ls (line+numCharsRead); } else if (strcmp (cmd, cat) == 0) { handle_cat (line+numCharsRead); } else if (strcmp (cmd, setread) == 0) { handle_setread (line+numCharsRead); } else if (strcmp (cmd, setwrite) == 0) { handle_setwrite (line+numCharsRead); } else { printf ("%s: Command not found.\n", cmd); } printf ("> "); } return 0; } void handle_create (char * args) { int argCount; char junk; char arg[MAXARGSIZE]; argCount = sscanf (args, "%90s %1s", arg, &junk); if (argCount > 1) { printf ("%s%s\n",create,too_many_args); } else if (argCount == 0 || argCount == EOF) { printf ("%s%s fileName\n",usage,create); } else if (!check_args(arg)){ printf ("%s%s\n",create,invalid_file_name); } else { createFile (arg); } } void handle_append (char * args) { int argCount; char junk; char arg[MAXARGSIZE]; argCount = sscanf (args, "%90s %1s", arg, &junk); if (argCount > 1) { printf ("%s%s\n",append,too_many_args); } else if (argCount == 0 || argCount == EOF) { printf ("%s%s fileName\n",usage,append); } else if (!check_args(arg)){ printf ("%s%s\n",append,invalid_file_name); } else { appendFile (arg); } } void handle_mkdir (char * args) { int argCount; char junk; char arg[MAXARGSIZE]; argCount = sscanf (args, "%90s %1s", arg, &junk); if (argCount > 1) { printf ("%s%s\n",mk_dir,too_many_args); } else if (argCount == 0 || argCount == EOF) { printf ("%s%s directoryName\n",usage,mk_dir); } else if (!check_args(arg)){ printf ("%s%s\n",mk_dir,invalid_file_name); } else { createDir (arg); } } void handle_ln (char * args) { int argCount; char junk; char arg[MAXARGSIZE]; char arg2[MAXARGSIZE]; argCount = sscanf (args, "%90s %90s %1s", arg, arg2, &junk); if (argCount != 2) { printf ("%s%s target linkname\n",usage,ln); } else if (!check_args(arg) || !check_args(arg2)){ printf ("%s%s\n",ln,invalid_file_name); } else { createSoftLink (arg, arg2); } } void handle_cd (char * args) { int argCount; char junk; char arg[MAXARGSIZE]; argCount = sscanf (args, "%90s %1s", arg, &junk); if (argCount > 1) { printf ("%s%s\n",cd,too_many_args); } else if (argCount == 0 || argCount == EOF) { printf ("%s%s directoryName\n",usage,cd); } else if (!check_args(arg)){ printf ("%s%s\n",cd,invalid_file_name); } else { newWorkingDir (arg); } } void handle_rm (char * args) { int argCount; char junk; char arg[MAXARGSIZE]; argCount = sscanf (args, "%90s %1s", arg, &junk); if (argCount > 1) { printf ("%s%s\n",rm,too_many_args); } else if (argCount == 0 || argCount == EOF) { printf ("%s%s fileName\n",usage,rm); } else if (!check_args(arg)){ printf ("%s%s\n",rm,invalid_file_name); } else { removeFile ( arg); } } void handle_rmdir (char * args) { int argCount; char junk; char arg[MAXARGSIZE]; argCount = sscanf (args, "%90s %1s", arg, &junk); if (argCount > 1) { printf ("%s%s\n",rm_dir,too_many_args); } else if (argCount == 0 || argCount == EOF) { printf ("%s%s directoryName\n",usage,rm_dir); } else if (!check_args(arg)){ printf ("%s%s\n",rm_dir,invalid_file_name); } else { removeDir (arg); } } void handle_mv (char * args) { int argCount; char junk; char fromArg[MAXARGSIZE]; char toArg[MAXARGSIZE]; argCount = sscanf (args, "%90s %90s %1s", fromArg, toArg, &junk); if (argCount > 2) { printf ("%s%s\n",mv,too_many_args); } else if (argCount < 2) { printf ("%s%s file2\n",usage,mv); } else if (!check_args(fromArg) || !check_args(toArg)){ printf ("%s%s\n",mv,invalid_file_name); } else { moveEntry (fromArg, toArg); } } void handle_pwd (char * args) { int argCount; char junk; argCount = sscanf (args, "%1s", &junk); if (argCount > 0) { printf ("%s%s\n",usage,pwd); } else { printWorkingDir (); } } void handle_ls (char * args) { int argCount; char junk; char arg[MAXARGSIZE]; argCount = sscanf (args, "%90s %1s", arg, &junk); if (argCount > 1) { printf ("%s%s\n",ls,too_many_args); } else if (argCount == 1) { if (!check_ls_args(arg)){ printf ("%s%s\n",ls,invalid_wild_card); } else listWithinWorkingDir (arg); } else { listWorkingDir (); } } void handle_cat (char * args) { int argCount; int argSeen = FALSE; int numCharsRead; char arg[MAXARGSIZE]; while (TRUE) { argCount = sscanf (args, "%90s%n", arg, &numCharsRead); if (argCount == 0 || argCount == EOF) { if (!argSeen) { printf ("%s%s fileName ...\n",usage,cat); } return; } argSeen = TRUE; if (!check_args(arg)){ printf ("%s%s\n",cat,invalid_file_name); break; } else{ listFileContents (arg); } args = args + numCharsRead; } } void handle_setread (char * args) { int argCount; char junk; char * junk2; int cnt; char countstr[MAXARGSIZE]; char filename[MAXARGSIZE]; argCount = sscanf (args, "%90s %90s %1s", countstr, filename, &junk); if (argCount > 2) { printf ("%s%s\n",setread,too_many_args); } else if (argCount < 2) { printf ("%s%s <0/1> file\n",usage,setread); } else if (!check_args(filename)){ printf ("%s%s\n",setread,invalid_file_name); } else { cnt = strtol(countstr,&junk2,0); if (*junk2 != '\0' || ((cnt | 1) != 1)) printf ("%s%s <0/1> file\n",usage,setread); else modifyReadable (cnt, filename); } } void handle_setwrite (char * args) { int argCount; char junk; char * junk2; int cnt; char countstr[MAXARGSIZE]; char filename[MAXARGSIZE]; argCount = sscanf (args, "%90s %90s %1s", countstr, filename, &junk); if (argCount > 2) { printf ("%s%s\n",setwrite,too_many_args); } else if (argCount < 2) { printf ("%s%s <0/1> file\n",usage,setwrite); } else if (!check_args(filename)){ printf ("%s%s\n",setwrite,invalid_file_name); } else { cnt = strtol(countstr,&junk2,0); if (*junk2 != '\0' || ((cnt | 1) != 1)) printf ("%s%s <0/1> file\n",usage,setwrite); else modifyWritable (cnt, filename); } } /*verify that paths only consist of [0-9], [a-z], [A-Z], [.], [/]*/ /*Return 1 if path valid; 0 if invalid*/ int check_args(char * args){ while (*args != '\0'){ if ( !(*args >= '0' && *args <= '9') && !(*args >= 'A' && *args <= 'Z') && !(*args >= 'a' && *args <= 'z') && *args != '.' && *args != '/'){ return 0; } args++; } return 1; } /*the same as above, but allows '?' to pass and prevents '/' from going through*/ int check_ls_args(char * args){ while (*args != '\0'){ if ( !(*args >= '0' && *args <= '9') && !(*args >= 'A' && *args <= 'Z') && !(*args >= 'a' && *args <= 'z') && *args != '.' && *args != '?'){ return 0; } args++; } return 1; }