int main(int argc, char **argv) { char str[1024], *newstr, ptr[1024], path_cmd[1024]; int i, j=0, k=0, file_descp, ptr_length, lendir = 0, str_length; char* exec_path; printf("\n\t\t\t\t*******NEW SHELL*******"); //By default current directory stream will be pointing to DIR stream of '/' curr_dir_ptr = opendir("/"); while(1) { j = 0, k = 0; printf("\n[user@SBUnix ~%s]$", currdir); scanf("%s", ptr); ptr_length = strlen(ptr); memset(args, 0, sizeof(args)); execargs[0] = NULL; if (ptr_length == 0) { continue; } else if (strcmp(ptr, "echo $PATH")==0) { printf("PATH: %s", path); continue; } /*****1) To check if process is to be run in background ****/ bg_flag = ptr[ptr_length - 1]; if (bg_flag == '&') { ptr[ptr_length - 1] = '\0'; ptr_length -= 1; if (ptr_length == 0) continue; } //collect the arguments entered by user in 2D array args for (i = 0; i < ptr_length; i++) { if(ptr[i] == ' ') { args[j][k]= '\0'; j++; k=0; } else { args[j][k++] = ptr[i]; } } args[j][k]='\0'; char help_str[2048], help_ptr[2048]; memset(help_ptr, 0, 2048); memset(help_str, 0, 2048); if (strcmp(args[0], "ulimit") == 0) { char *new_pointer; file_descp = open("/rootfs/etc/ulimit", 0); if (file_descp != -1) { read(file_descp, help_ptr, 2048); close(file_descp); new_pointer = help_ptr; cls(); while (*new_pointer != '\0') { new_pointer = getLine(new_pointer, help_str, 1023); printf("\n%s", help_str); } printf("\n"); } } else if (strcmp(args[0], "help") == 0) { char *new_pointer; file_descp = open("/rootfs/etc/help", 0); if (file_descp != -1) { read(file_descp, help_ptr, 2048); close(file_descp); new_pointer = help_ptr; cls(); while (*new_pointer != '\0') { new_pointer = getLine(new_pointer, help_str, 2047); printf("\n%s", help_str); } printf("\n"); } } else if (strcmp(args[0], "cat") == 0) { char *new_pointer; file_descp = open(args[1], 0); if (file_descp != -1) { read(file_descp, help_ptr, 2048); close(file_descp); new_pointer = help_ptr; while (*new_pointer != '\0') { new_pointer = getLine(new_pointer, help_str, 2047); printf("\n%s", help_str); } printf("\n"); } else { printf("\nInvalid Path : Please enter absolute path of the file.\nRefer to help."); } } else if (strcmp(args[0], "shutdown") == 0) { shutdown(); } else if (strcmp(args[0], "cls") == 0) { cls(); } else if(strcmp(args[0], "export") == 0) { /****1) export path****/ export_to_path(); } else if (strcmp(args[0], "pwd") == 0) { /****3) To handle PWD command ****/ if (strlen(currdir) == 0) printf("/"); else printf("%s", currdir); } else if (strcmp(args[0], "cd") == 0) { /****4) To handle CD command ****/ lendir = strlen(currdir); //check if args[1] is a absolute path if (args[1][0] == '/') { curr_dir_ptr = opendir(args[1]); if (curr_dir_ptr == NULL) { printf("%s: No such directory.\nRefer to help.", args[1]); currdir[lendir] = '\0'; curr_dir_ptr = opendir(currdir); } else { //If it is absoulte correct path, modify it to remove dots strcpy(currdir, args[1]); modify_string(currdir); } } else { //If it is a relative path //concatenate to existing dir strcat(currdir, "/"); strcat(currdir, args[1]); curr_dir_ptr = opendir(currdir); if (curr_dir_ptr == NULL) { printf("%s: No such directory.\nRefer to help.", currdir); currdir[lendir] = '\0'; curr_dir_ptr = opendir(currdir); } else { //If it is relative correct path, modify it to remove dots modify_string(currdir); } } } else if (strcmp(args[0], "/rootfs/bin/ls") == 0 || strcmp(args[0], "ls") == 0) { /****5) To handle LS command ****/ // To list contents of directory specified by user if (args[1][0] != '\0') { //if argument to ls is relative path, append it to currdir if (args[1][0] != '/') { int lendir = strlen(currdir); strcat(currdir, "/"); strcat(currdir, args[1]); strcpy(args[1], currdir); //restore orignal currdir currdir[lendir] = '\0'; } execargs[0] = (char *)args[1]; } else { //No argument by user //List contents of current directory execargs[0] = (char *)currdir; } execargs[1] = NULL; strcpy(prog, path); strcat(prog, "ls"); if (Is_file_exist()) { fork_and_execvpe(); } else { printf("CMD does not exist.\nRefer to help."); } } else if (ptr[0] == 's' && ptr[1] == 'h' && ptr[2] == ' ' && ptr_length > 3) { /****6) To check for executable ****/ // Extracting the scan from shell into a 2d array: row 0 = command, other rows = arguments to the cmd exec_path = ptr; //ignore the 'sh' part. exec_path +=3; strcpy(path_cmd, exec_path); //strcat(path_cmd, "\0"); file_descp = open(path_cmd, 0); if (file_descp != -1) { //check if path is valid path read(file_descp, ptr, 1024); close(file_descp); if (ptr[0] == '#' && ptr[1] == '!') { newstr = ptr; newstr = getLine(newstr, str, 1023); // For parsing a script file and extracting the commands from the file newstr = getLine(newstr, str, 1023); while (*newstr != '\0') { str_length = strlen(str); bg_flag = str[str_length - 1]; if (bg_flag == '&') str[str_length - 1] = '\0'; j = 0, k = 0; memset(args, 0, sizeof(args)); execargs[0] = NULL; for (i = 0; i < str_length ; i++) { if (str[i] == ' ') { args[j][k]= '\0'; j++; k=0; } else args[j][k++] = str[i]; } *str = NULL; args[j][k]='\0'; strcpy(prog, path); strcat(prog, args[0]); if (Is_file_exist()) { copy_args_to_execargs(); fork_and_execvpe(); yield(); } else { printf("CMD does not exist.\nRefer to help."); } newstr = getLine(newstr, str, 1023); } } else { printf("File not an executable.\nRefer to help."); } } else { printf("File does not exist.\nRefer to help."); } } else { /****7) Run a binary ****/ char *cmd = NULL; cmd = args[0]; if (args[0][0] == '.' && args[0][1] == '/') cmd += 2; if (args[0][0] == '/' && strlen(args[0]) > 1) { strcpy(prog, args[0]); } else { strcpy(prog, path); strcat(prog, cmd); } if (Is_file_exist() || strcmp(prog, "ls") == 0) { copy_args_to_execargs(); fork_and_execvpe(); } else { printf("CMD does not exist.\nRefer to help."); } } *ptr = NULL; } return 0; }
void sedit_parse(struct descriptor_data *d, char *arg) { int i; if (OLC_MODE(d) > SEDIT_NUMERICAL_RESPONSE) { if (!isdigit(arg[0]) && ((*arg == '-') && (!isdigit(arg[1])))) { write_to_output(d, "Field must be numerical, try again : "); return; } } switch (OLC_MODE(d)) { /*-------------------------------------------------------------------*/ case SEDIT_CONFIRM_SAVESTRING: switch (*arg) { case 'y': case 'Y': sedit_save_internally(d); mudlog(CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE, "OLC: %s edits shop %d", GET_NAME(d->character), OLC_NUM(d)); if (CONFIG_OLC_SAVE) { sedit_save_to_disk(real_zone_by_thing(OLC_NUM(d))); write_to_output(d, "Shop saved to disk.\r\n"); } else write_to_output(d, "Shop saved to memory.\r\n"); cleanup_olc(d, CLEANUP_STRUCTS); return; case 'n': case 'N': cleanup_olc(d, CLEANUP_ALL); return; default: write_to_output(d, "Invalid choice!\r\nDo you wish to save your changes? : "); return; } break; /*-------------------------------------------------------------------*/ case SEDIT_MAIN_MENU: i = 0; switch (*arg) { case 'q': case 'Q': if (OLC_VAL(d)) { /* Anything been changed? */ write_to_output(d, "Do you wish to save your changes? : "); OLC_MODE(d) = SEDIT_CONFIRM_SAVESTRING; } else cleanup_olc(d, CLEANUP_ALL); return; case '0': OLC_MODE(d) = SEDIT_KEEPER; write_to_output(d, "Enter vnum number of shop keeper : "); return; case '1': OLC_MODE(d) = SEDIT_OPEN1; i++; break; case '2': OLC_MODE(d) = SEDIT_CLOSE1; i++; break; case '3': OLC_MODE(d) = SEDIT_OPEN2; i++; break; case '4': OLC_MODE(d) = SEDIT_CLOSE2; i++; break; case '5': OLC_MODE(d) = SEDIT_BUY_PROFIT; i++; break; case '6': OLC_MODE(d) = SEDIT_SELL_PROFIT; i++; break; case '7': OLC_MODE(d) = SEDIT_NOITEM1; i--; break; case '8': OLC_MODE(d) = SEDIT_NOITEM2; i--; break; case '9': OLC_MODE(d) = SEDIT_NOCASH1; i--; break; case 'a': case 'A': OLC_MODE(d) = SEDIT_NOCASH2; i--; break; case 'b': case 'B': OLC_MODE(d) = SEDIT_NOBUY; i--; break; case 'c': case 'C': OLC_MODE(d) = SEDIT_BUY; i--; break; case 'd': case 'D': OLC_MODE(d) = SEDIT_SELL; i--; break; case 'e': case 'E': sedit_no_trade_menu(d); return; case 'f': case 'F': sedit_shop_flags_menu(d); return; case 'r': case 'R': sedit_rooms_menu(d); return; case 'p': case 'P': sedit_products_menu(d); return; case 't': case 'T': sedit_namelist_menu(d); return; default: sedit_disp_menu(d); return; } if (i == 0) break; else if (i == 1) write_to_output(d, "\r\nEnter new value : "); else if (i == -1) write_to_output(d, "\r\nEnter new text :\r\n] "); else write_to_output(d, "Oops...\r\n"); return; /*-------------------------------------------------------------------*/ case SEDIT_NAMELIST_MENU: switch (*arg) { case 'a': case 'A': sedit_types_menu(d); return; case 'd': case 'D': write_to_output(d, "\r\nDelete which entry? : "); OLC_MODE(d) = SEDIT_DELETE_TYPE; return; case 'q': case 'Q': break; } break; /*-------------------------------------------------------------------*/ case SEDIT_PRODUCTS_MENU: switch (*arg) { case 'a': case 'A': write_to_output(d, "\r\nEnter new product vnum number : "); OLC_MODE(d) = SEDIT_NEW_PRODUCT; return; case 'd': case 'D': write_to_output(d, "\r\nDelete which product? : "); OLC_MODE(d) = SEDIT_DELETE_PRODUCT; return; case 'q': case 'Q': break; } break; /*-------------------------------------------------------------------*/ case SEDIT_ROOMS_MENU: switch (*arg) { case 'a': case 'A': write_to_output(d, "\r\nEnter new room vnum number : "); OLC_MODE(d) = SEDIT_NEW_ROOM; return; case 'c': case 'C': sedit_compact_rooms_menu(d); return; case 'l': case 'L': sedit_rooms_menu(d); return; case 'd': case 'D': write_to_output(d, "\r\nDelete which room? : "); OLC_MODE(d) = SEDIT_DELETE_ROOM; return; case 'q': case 'Q': break; } break; /*-------------------------------------------------------------------*/ /* * String edits. */ case SEDIT_NOITEM1: if (genolc_checkstring(d, arg)) modify_string(&S_NOITEM1(OLC_SHOP(d)), arg); break; case SEDIT_NOITEM2: if (genolc_checkstring(d, arg)) modify_string(&S_NOITEM2(OLC_SHOP(d)), arg); break; case SEDIT_NOCASH1: if (genolc_checkstring(d, arg)) modify_string(&S_NOCASH1(OLC_SHOP(d)), arg); break; case SEDIT_NOCASH2: if (genolc_checkstring(d, arg)) modify_string(&S_NOCASH2(OLC_SHOP(d)), arg); break; case SEDIT_NOBUY: if (genolc_checkstring(d, arg)) modify_string(&S_NOBUY(OLC_SHOP(d)), arg); break; case SEDIT_BUY: if (genolc_checkstring(d, arg)) modify_string(&S_BUY(OLC_SHOP(d)), arg); break; case SEDIT_SELL: if (genolc_checkstring(d, arg)) modify_string(&S_SELL(OLC_SHOP(d)), arg); break; case SEDIT_NAMELIST: if (genolc_checkstring(d, arg)) { struct shop_buy_data new_entry; BUY_TYPE(new_entry) = OLC_VAL(d); BUY_WORD(new_entry) = strdup(arg); add_to_type_list(&(S_NAMELISTS(OLC_SHOP(d))), &new_entry); } sedit_namelist_menu(d); return; /*-------------------------------------------------------------------*/ /* * Numerical responses. */ case SEDIT_KEEPER: i = atoi(arg); if ((i = atoi(arg)) != -1) if ((i = real_mobile(i)) == NOBODY) { write_to_output(d, "That mobile does not exist, try again : "); return; } S_KEEPER(OLC_SHOP(d)) = i; if (i == -1) break; /* * Fiddle with special procs. */ S_FUNC(OLC_SHOP(d)) = mob_index[i].func != shop_keeper ? mob_index[i].func : NULL; mob_index[i].func = shop_keeper; break; case SEDIT_OPEN1: S_OPEN1(OLC_SHOP(d)) = LIMIT(atoi(arg), 0, 28); break; case SEDIT_OPEN2: S_OPEN2(OLC_SHOP(d)) = LIMIT(atoi(arg), 0, 28); break; case SEDIT_CLOSE1: S_CLOSE1(OLC_SHOP(d)) = LIMIT(atoi(arg), 0, 28); break; case SEDIT_CLOSE2: S_CLOSE2(OLC_SHOP(d)) = LIMIT(atoi(arg), 0, 28); break; case SEDIT_BUY_PROFIT: sscanf(arg, "%f", &S_BUYPROFIT(OLC_SHOP(d))); break; case SEDIT_SELL_PROFIT: sscanf(arg, "%f", &S_SELLPROFIT(OLC_SHOP(d))); break; case SEDIT_TYPE_MENU: OLC_VAL(d) = LIMIT(atoi(arg), 0, NUM_ITEM_TYPES - 1); write_to_output(d, "Enter namelist (return for none) :-\r\n] "); OLC_MODE(d) = SEDIT_NAMELIST; return; case SEDIT_DELETE_TYPE: remove_from_type_list(&(S_NAMELISTS(OLC_SHOP(d))), atoi(arg)); sedit_namelist_menu(d); return; case SEDIT_NEW_PRODUCT: if ((i = atoi(arg)) != -1) if ((i = real_object(i)) == NOTHING) { write_to_output(d, "That object does not exist, try again : "); return; } if (i > 0) add_to_int_list(&(S_PRODUCTS(OLC_SHOP(d))), i); sedit_products_menu(d); return; case SEDIT_DELETE_PRODUCT: remove_from_int_list(&(S_PRODUCTS(OLC_SHOP(d))), atoi(arg)); sedit_products_menu(d); return; case SEDIT_NEW_ROOM: if ((i = atoi(arg)) != -1) if ((i = real_room(i)) == NOWHERE) { write_to_output(d, "That room does not exist, try again : "); return; } if (i >= 0) add_to_int_list(&(S_ROOMS(OLC_SHOP(d))), atoi(arg)); sedit_rooms_menu(d); return; case SEDIT_DELETE_ROOM: remove_from_int_list(&(S_ROOMS(OLC_SHOP(d))), atoi(arg)); sedit_rooms_menu(d); return; case SEDIT_SHOP_FLAGS: if ((i = LIMIT(atoi(arg), 0, NUM_SHOP_FLAGS)) > 0) { TOGGLE_BIT(S_BITVECTOR(OLC_SHOP(d)), 1 << (i - 1)); sedit_shop_flags_menu(d); return; } break; case SEDIT_NOTRADE: if ((i = LIMIT(atoi(arg), 0, NUM_TRADERS)) > 0) { TOGGLE_BIT(S_NOTRADE(OLC_SHOP(d)), 1 << (i - 1)); sedit_no_trade_menu(d); return; } break; /*-------------------------------------------------------------------*/ default: /* * We should never get here. */ cleanup_olc(d, CLEANUP_ALL); mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: sedit_parse(): Reached default case!"); write_to_output(d, "Oops...\r\n"); break; } /*-------------------------------------------------------------------*/ /* * END OF CASE * If we get here, we have probably changed something, and now want to * return to main menu. Use OLC_VAL as a 'has changed' flag. */ OLC_VAL(d) = 1; sedit_disp_menu(d); }