diff --git a/configure/os/CONFIG.Common.RTEMS b/configure/os/CONFIG.Common.RTEMS index e4b046b00..40c8120eb 100644 --- a/configure/os/CONFIG.Common.RTEMS +++ b/configure/os/CONFIG.Common.RTEMS @@ -104,7 +104,7 @@ OP_SYS_CFLAGS_NET_yes = -DRTEMS_LEGACY_STACK OP_SYS_CFLAGS_NET_no = -DHAVE_SOCKADDR_SA_LEN=1 OP_SYS_CFLAGS += $(OP_SYS_CFLAGS_NET_$(RTEMS_HAS_NETWORKING)) -OP_SYS_LDLIBS_posix_NET_yes = -ltftpfs -lnfs -lz +OP_SYS_LDLIBS_posix_NET_yes = -ltftpfs -lnfs -lz -telnetd OP_SYS_LDLIBS_posix_NET_no = -ltftpfs -lbsd -lz OP_SYS_LDLIBS_kernel_NET_yes = -lCom -lnfs OP_SYS_LDLIBS_kernel_NET_no = -lCom -lnfs diff --git a/modules/libcom/RTEMS/posix/rtems_init.c b/modules/libcom/RTEMS/posix/rtems_init.c index 6a4d627bf..605c5f992 100644 --- a/modules/libcom/RTEMS/posix/rtems_init.c +++ b/modules/libcom/RTEMS/posix/rtems_init.c @@ -63,6 +63,7 @@ #include #if __RTEMS_MAJOR__ > 4 #include +#include #endif #include "epicsVersion.h" #include "epicsThread.h" @@ -76,6 +77,7 @@ #include "osdTime.h" #include "epicsMemFs.h" #include "epicsEvent.h" +#include "errlog.h" #include "epicsRtemsInitHooks.h" @@ -793,6 +795,68 @@ default_network_dhcpcd(void) } #endif // not RTEMS_LEGACY_STACK +#if __RTEMS_MAJOR__>4 +/* + *********************************************************************** + * TELNET DAEMON * + *********************************************************************** + */ +#define LINE_SIZE 256 +static void +telnet_pseudoIocsh(char *name, void *arg) +{ + char line[LINE_SIZE]; + int fid[3], save_fid[3]; + + printf("info: pty dev name = %s\n", name); + + save_fid[1] = dup2(1,1); + fid[1] = dup2( fileno(stdout), 1); + if (fid[1] == -1 ) printf("Can't dup stdout\n"); + save_fid[2] = dup2(2,2); + fid[2] = dup2( fileno(stderr), 2); + if (fid[2] == -1 ) printf("Can't dup stderr\n"); + + const char *prompt = "tIocSh> "; + + while (1) { + fputs(prompt, stdout); + fflush(stdout); + /* telnet close not detected ??? tbd */ + if (fgets(line, LINE_SIZE, stdin) == NULL) { + dup2(save_fid[1],1); ++ dup2(save_fid[2],2); + return; + } + if (line[strlen(line)-1] == '\n') line[strlen(line)-1] = 0; + if (!strncmp( line, "bye",3)) { + printf( "%s", "Will end session\n"); + dup2(save_fid[1],1); + dup2(save_fid[2],2); + return; + } + iocshCmd(line); + } +} + +#define SHELL_ENTRY telnet_pseudoIocsh + +/* + * Telnet daemon configuration + */ +rtems_telnetd_config_table rtems_telnetd_config = { + .command = SHELL_ENTRY, + .arg = NULL, + .priority = 99, // if RTEMS_NETWORK and .priority == 0 bsd_network_prio should be used ... + .stack_size = 0, + .client_maximum = 5, // should be 1, on RTEMS and Epics it makes only sense for one connection a time + .login_check = NULL, + .keep_stdio = false +}; + +#endif + + /* * RTEMS Startup task */ @@ -1004,6 +1068,13 @@ POSIX_Init (void *argument) /*/Volumes/Epics/myExample/bin/RTEMS-xilinx_zynq_a9_qemu * Run the EPICS startup script */ +#if __RTEMS_MAJOR__>4 + // if telnetd is requested ... + printf(" Will try to start telnetd with prio %d ...\n", rtems_telnetd_config.priority); + result = rtems_telnetd_initialize(); + printf (" telnetd initialized with result %d\n", result); +#endif + printf ("***** Preparing EPICS application *****\n"); iocshRegisterRTEMS (); set_directory (argv[1]);