summaryrefslogblamecommitdiffstats
path: root/shell/shell_init.c
blob: 32d7bbe2ea9e0ee1cc690662cdc46e93f4207080 (plain) (tree)























































































































































                                                                               
/*
 *  This is a derived from the init.c file in the telnetd demo.
 *
 *  $Id$
 */

#include <bsp.h>

#include <errno.h>
#include <time.h>

#include <stdio.h>
#include <rtems/rtems_bsdnet.h>
#include <rtems/telnetd.h>
#include <rtems/shell.h>

#include <rtems/error.h>
#include <rpc/rpc.h>
#include <netinet/in.h>
#include <time.h>

#include <arpa/inet.h>
#include <sys/socket.h>
#include "../networkconfig.h"

// I'm not sure why this is necessary
#include <rtems/bdbuf.h>
const rtems_bdbuf_config rtems_bdbuf_configuration;

typedef char * (* prompt_function_t)(void);

static prompt_function_t prompt_function = NULL;

extern void set_prompt_function(prompt_function_t f)
{
  prompt_function = f;
}

extern char * get_prompt(void);
void rtems_shell_get_prompt(
  rtems_shell_env_t *shell_env,
  char              *prompt,
  size_t             size
)
{
  char curdir[256];

  if (prompt_function == NULL)
  {
    getcwd(curdir,sizeof(curdir));
    snprintf(prompt, size - 1, "%s%s[%s] %c ",
            ((shell_env->taskname) ? shell_env->taskname : ""),
            ((shell_env->taskname) ? " " : ""),
            curdir,
            geteuid()?'$':'#');

  }
  else
    snprintf(prompt, size - 1, prompt_function());
}

/*
 *  If true, listen on socket(s).
 *  If false, remain on console.
 */
/* #define REMAIN_ON_CONSOLE */
bool remain_on_console = false;

#include <rtems/shell.h>

#define SHELL_HELP_MSG \
  "Starting rtemsShell via telnetd -- default account is rtems w/no password\n"

#define CONFIGURE_SHELL_COMMANDS_ALL_NETWORKING
#define CONFIGURE_SHELL_COMMANDS_ALL

#define CONFIGURE_SHELL_COMMANDS_INIT
#include <rtems/shellconfig.h>


static void rtemsShell(
  char *pty_name,
  void *cmd_arg
)
{
  rtems_shell_env_t env = rtems_global_shell_env;
  
  env.devname = pty_name;
  env.taskname = "TLNT";
  env.login_check = rtems_shell_login_check;

  if ( !remain_on_console )
    printk("============== Starting Shell ==============\n");

  rtems_shell_main_loop( &env ); 

  if ( !remain_on_console )
    printk("============== Exiting Shell ==============\n");
}

#define SHELL_ENTRY rtemsShell

/*
 *  Telnet demon configuration
 */
rtems_telnetd_config_table rtems_telnetd_config = {
  .command = SHELL_ENTRY,
  .arg = NULL,
  .priority = 1, /* We feel important today */
  .stack_size = 20 * RTEMS_MINIMUM_STACK_SIZE, /* Shell needs a large stack */
  .login_check = NULL, /* Shell asks for user and password */
  .keep_stdio = false
};

/*
 *  Initialization Aid
 */
void init_telnet_daemon(void)
{
  fprintf(stderr, "\n\n*** Telnetd Server Test ***\n\r" );

  fprintf(stderr, "============== Initializing Network ==============\n");
  rtems_bsdnet_initialize_network ();

  fprintf(stderr, "============== Add Route ==============\n");
  rtems_bsdnet_show_inet_routes ();

  fprintf(stderr, "============== Start Telnetd ==============\n");

  printk( SHELL_HELP_MSG );

  #if defined(REMAIN_ON_CONSOLE)
    remain_on_console = true;
  #endif

  rtems_global_shell_env.login_check = rtems_shell_login_check;
  rtems_telnetd_config.keep_stdio = remain_on_console;
  
  rtems_telnetd_initialize();
}


#include <stdlib.h>
#include <rtems.h>
#include <rtems/telnetd.h>

/* Helper for Ada */
void invoke_rtems_shell(void)
{
  rtemsShell("console", NULL);
}