From 0dc303f09dbb3a8e681c899f9452fa1731adf8e0 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 10 Oct 2018 10:40:21 +0200 Subject: telnetd: Create sessions at start Update #3543. --- cpukit/telnetd/pty.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) (limited to 'cpukit/telnetd/pty.c') diff --git a/cpukit/telnetd/pty.c b/cpukit/telnetd/pty.c index 7a47fddbc9..a593bbd224 100644 --- a/cpukit/telnetd/pty.c +++ b/cpukit/telnetd/pty.c @@ -94,26 +94,37 @@ int send_iac(rtems_pty_context *pty, unsigned char mode, unsigned char option) return write(pty->socket, buf, sizeof(buf)); } -/* This procedure returns the devname for a pty slot free. - * If not slot availiable (field socket>=0) - * then the socket argument is closed - */ - -char *telnet_get_pty(rtems_pty_context *pty, int socket) +const char *rtems_pty_initialize(rtems_pty_context *pty, uintptr_t unique) { rtems_status_code sc; - struct timeval t; memset(pty, 0, sizeof(*pty)); - snprintf(pty->name, sizeof(pty->name), "/dev/pty%" PRIuPTR, (uintptr_t)pty); + (void)snprintf(pty->name, sizeof(pty->name), "/dev/pty%" PRIuPTR, unique); rtems_termios_device_context_initialize(&pty->base, "pty"); - pty->socket = socket; + pty->socket = -1; sc = rtems_termios_device_install(pty->name, &pty_handler, NULL, &pty->base); if (sc != RTEMS_SUCCESSFUL) { - close(socket); return NULL; } + return pty->name; +} + +void rtems_pty_close_socket(rtems_pty_context *pty) +{ + if (pty->socket >= 0) { + (void)close(pty->socket); + pty->socket = -1; + } +} + +void rtems_pty_set_socket(rtems_pty_context *pty, int socket) +{ + struct timeval t; + + rtems_pty_close_socket(pty); + pty->socket = socket; + /* set a long polling interval to save CPU time */ t.tv_sec=2; t.tv_usec=00000; @@ -121,8 +132,6 @@ char *telnet_get_pty(rtems_pty_context *pty, int socket) /* inform the client that we will echo */ send_iac(pty, IAC_WILL, 1); - - return pty->name; } /*-----------------------------------------------------------*/ -- cgit v1.2.3