예제 #1
0
파일: sh.c 프로젝트: aniketalshi/SBUnix
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;
}
예제 #2
0
파일: sedit.c 프로젝트: bigmac12/Mac-s-CWG
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);
}