Changeset 798ff5a in rtems


Ignore:
Timestamp:
Jul 16, 2008, 5:17:29 PM (11 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.9, master
Children:
10f095c
Parents:
c2a5939f
Message:

2008-07-16 Joel Sherrill <joel.sherrill@…>

  • libmisc/shell/shell.c, libmisc/shell/shell.h: New argument sequence for rtems_shell_init(). This makes it possible to run the shell forever or invoke it from a program as a subroutine, have a user enter commands, and wait for it to exit.
Location:
cpukit
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • cpukit/ChangeLog

    rc2a5939f r798ff5a  
     12008-07-16      Joel Sherrill <joel.sherrill@oarcorp.com>
     2
     3        * libmisc/shell/shell.c, libmisc/shell/shell.h: New argument sequence
     4        for rtems_shell_init(). This makes it possible to run the shell
     5        forever or invoke it from a program as a subroutine, have a user
     6        enter commands, and wait for it to exit.
     7
    182008-07-15      Joel Sherrill <joel.sherrill@oarcorp.com>
    29
  • cpukit/libmisc/shell/shell.c

    rc2a5939f r798ff5a  
    5656    rtems_global_shell_env.devname       = "";
    5757    rtems_global_shell_env.taskname      = "GLOBAL";
    58     rtems_global_shell_env.tcflag        = 0;
    5958    rtems_global_shell_env.exit_shell    = 0;
    6059    rtems_global_shell_env.forever       = TRUE;
     
    7574
    7675  return shell_env;
     76}
     77
     78/*
     79 *  Completely free a shell_env_t and all associated memory
     80 */
     81void rtems_shell_env_free(
     82  void *ptr
     83)
     84{
     85  rtems_shell_env_t *shell_env;
     86  shell_env = (rtems_shell_env_t *) ptr;
     87
     88  if ( !ptr )
     89    return;
     90
     91  if ( shell_env->input )
     92    free((void *)shell_env->input);
     93  if ( shell_env->output )
     94    free((void *)shell_env->output);
     95  free( ptr );
    7796}
    7897
     
    613632    "shell_env->devname=%s\n"
    614633    "shell_env->taskname=%s\t"
    615     "shell_env->tcflag=%d\n"
    616634    "shell_env->exit_shell=%d\t"
    617635    "shell_env->forever=%d\n",
     
    619637    shell_env->devname,
    620638    ((shell_env->taskname) ? shell_env->taskname : "NOT SET"),
    621     shell_env->tcflag,
    622639    shell_env->exit_shell,
    623640    shell_env->forever
     
    659676rtems_boolean rtems_shell_main_loop(
    660677  rtems_shell_env_t *shell_env_arg
    661                                     )
     678)
    662679{
    663680  rtems_shell_env_t *shell_env;
     
    679696  FILE              *stdoutToClose = NULL;
    680697
    681   memset(cmds, 0, sizeof(cmds));
    682  
    683698  rtems_shell_initialize_command_set();
    684699
    685   shell_env               =
    686     rtems_current_shell_env = rtems_shell_init_env( shell_env_arg );
     700  shell_env =
     701  rtems_current_shell_env = rtems_shell_init_env( shell_env_arg );
    687702 
    688703  /*
     
    693708   * Task variables are a virus to embedded systems software.
    694709   */
    695   sc = rtems_task_variable_add(RTEMS_SELF,(void*)&rtems_current_shell_env,free);
     710  sc = rtems_task_variable_add(
     711    RTEMS_SELF,
     712    (void*)&rtems_current_shell_env,
     713    rtems_shell_env_free
     714  );
    696715  if (sc != RTEMS_SUCCESSFUL) {
    697716    rtems_error(sc,"rtems_task_variable_add(current_shell_env):");
     
    748767      term.c_oflag |= (OPOST|ONLCR); /* But with cr+nl on output */
    749768      term.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
    750       if (shell_env->tcflag)
    751         term.c_cflag = shell_env->tcflag;
    752769      term.c_cflag  |= CLOCAL | CREAD;
    753770      term.c_cc[VMIN]  = 1;
     
    915932  if (cmd_argv)
    916933    free (cmd_argv);
    917  
     934  if (prompt)
     935    free (prompt);
     936
    918937  if (stdinToClose) {
    919938    fclose( stdinToClose );
    920939  } else {
    921     if (tcsetattr( fileno( stdin), TCSADRAIN, &previous_term) < 0) {
     940    if (tcsetattr(fileno(stdin), TCSADRAIN, &previous_term) < 0) {
    922941      fprintf(
    923942        stderr,
     
    938957  rtems_task_priority  task_priority,
    939958  char                *devname,
    940   tcflag_t             tcflag,
    941959  int                  forever,
     960  int                  wait,
    942961  const char*          input,
    943962  const char*          output,
     
    979998  shell_env->devname       = devname;
    980999  shell_env->taskname      = task_name;
    981   shell_env->tcflag        = tcflag;
    9821000  shell_env->exit_shell    = FALSE;
    9831001  shell_env->forever       = forever;
     
    9901008  getcwd(shell_env->cwd, sizeof(shell_env->cwd));
    9911009
    992   return rtems_task_start(task_id, rtems_shell_task,
     1010  sc = rtems_task_start(task_id, rtems_shell_task,
    9931011                          (rtems_task_argument) shell_env);
    994 }
    995 
    996 rtems_status_code   rtems_shell_init (
     1012  if (sc != RTEMS_SUCCESSFUL) {
     1013    rtems_error(sc,"starting task %s in shell_init()",task_name);
     1014    return sc;
     1015  }
     1016
     1017  if (wait) {
     1018    rtems_event_set out;
     1019    sc = rtems_event_receive (RTEMS_EVENT_1, RTEMS_WAIT, 0, &out);
     1020  }
     1021
     1022  return 0;
     1023}
     1024
     1025rtems_status_code rtems_shell_init(
    9971026  char                *task_name,
    9981027  uint32_t             task_stacksize,
    9991028  rtems_task_priority  task_priority,
    10001029  char                *devname,
    1001   tcflag_t             tcflag,
    1002   int                  forever
     1030  int                  forever,
     1031  int                  wait
    10031032)
    10041033{
    1005   return rtems_shell_run (task_name, task_stacksize, task_priority,
    1006                           devname, tcflag, forever,
    1007                           "stdin", "stdout", 0, RTEMS_INVALID_ID, 0);
     1034  rtems_id to_wake = RTEMS_INVALID_ID;
     1035
     1036  if ( wait )
     1037    to_wake = rtems_task_self();
     1038
     1039  return rtems_shell_run(
     1040    task_name,               /* task_name */
     1041    task_stacksize,          /* task_stacksize */
     1042    task_priority,           /* task_priority */
     1043    devname,                 /* devname */
     1044    forever,                 /* forever */
     1045    wait,                    /* wait */
     1046    "stdin",                 /* input */
     1047    "stdout",                /* output */
     1048    0,                       /* output_append */
     1049    to_wake,                 /* wake_on_end */
     1050    0                        /* echo */
     1051  );
    10081052}
    10091053
     
    10281072  }
    10291073 
    1030   sc = rtems_shell_run (task_name, task_stacksize, task_priority,
    1031                         NULL, 0, 0, input, output, output_append,
    1032                         current_task, echo);
     1074  sc = rtems_shell_run(
     1075    task_name,       /* task_name */
     1076    task_stacksize,  /* task_stacksize */
     1077    task_priority,   /* task_priority */
     1078    NULL,            /* devname */
     1079    0,               /* forever */
     1080    wait,            /* wait */
     1081    input,           /* input */
     1082    output,          /* output */
     1083    output_append,   /* output_append */
     1084    current_task,    /* wake_on_end */
     1085    echo             /* echo */
     1086  );
    10331087  if (sc != RTEMS_SUCCESSFUL)
    10341088    return sc;
    10351089
    1036   if (wait) {
    1037     rtems_event_set out;
    1038     sc = rtems_event_receive (RTEMS_EVENT_1, RTEMS_WAIT, 0, &out);
    1039   }
    1040 
    10411090  return sc;
    10421091}
  • cpukit/libmisc/shell/shell.h

    rc2a5939f r798ff5a  
    134134 * @param task_stacksize The size of the stack. If 0 the default size is used.
    135135 * @param task_priority The priority the shell runs at.
    136  * @param tcflag The termios c_cflag value. If 0 the default is used, if
    137  *               not 0 the value is ORed with CLOCAL and CREAD.
    138136 * @param forever Repeat logins.
    139  *
    140  * @todo CCJ I am not sure this termios flag setting is a good idea. The shell
    141  *           needs to adjust the termios for its use but it should assume the
    142  *           settings are set by the user for things like baudrate etc.
     137 * @param wait Caller should block until shell exits
     138 *
    143139 */
    144140rtems_status_code rtems_shell_init(
     
    147143  rtems_task_priority  task_priority,
    148144  char                *devname,
    149   tcflag_t             tcflag,
    150   int                  forever
     145  int                  forever,
     146  int                  wait
    151147);
    152148
     
    185181  char       *devname;
    186182  char       *taskname;
    187   tcflag_t    tcflag;
    188183  /* user extensions */
    189184  int         exit_shell; /* logout */
Note: See TracChangeset for help on using the changeset viewer.