From b2712e35b948d7ab37cf6ef46bcdfea678506444 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 24 May 2001 21:58:39 +0000 Subject: 2000-05-24 Fernando Ruiz Casas * monitor/mon-prmisc.c: Correct print line. * shell/Makefile.am: Added new file telnetd.c. * shell/telnetd.c, shell/telnetd.h, shell/pty.c: New files. * shell/shell.c, shell/cmds.c, shell/shell.h: Numerous improvments: - The shell_init has a new parameter 'forever' because in /dev/console you need that this process runs forever but in tcp/ip not. (respawn?) - A new task for every session opened trought tcp/ip telnet client. (the chargen,daytime and more are possible of implementation but I ask me if they are necesary) - Exit from the session delete the task and when the client fails too. - More cmds have been implemented. (very reduced version of these) umask, chmod, id, whoami, rm, cat, ... - A reduced line edit has been implemented. Ctrl-C abort the input, Ctrl-d in the first position gives EOF (logout). '\b' and DEL makes the rubout operation. I think that readline() for every session spents a lot of resources. --- c/src/libnetworking/rtems_servers/telnetd.c | 107 ++++++++++++++++++++++++++++ c/src/libnetworking/rtems_servers/telnetd.h | 20 ++++++ 2 files changed, 127 insertions(+) create mode 100644 c/src/libnetworking/rtems_servers/telnetd.c create mode 100644 c/src/libnetworking/rtems_servers/telnetd.h (limited to 'c/src/libnetworking/rtems_servers') diff --git a/c/src/libnetworking/rtems_servers/telnetd.c b/c/src/libnetworking/rtems_servers/telnetd.c new file mode 100644 index 0000000000..6a643f7d25 --- /dev/null +++ b/c/src/libnetworking/rtems_servers/telnetd.c @@ -0,0 +1,107 @@ +/* + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +/***********************************************************/ +rtems_id telnetd_task_id =0; +rtems_unsigned32 telnetd_stack_size =16384; +rtems_task_priority telnetd_task_priority=100; +/***********************************************************/ +rtems_task rtems_task_telnetd(rtems_task_argument task_argument) { + int des_socket, + acp_socket; + struct sockaddr_in srv; + char * devname; + int i=1; + int size_adr; + if ((des_socket=socket(PF_INET,SOCK_STREAM,0))<0) { + perror("socket"); + rtems_task_delete(RTEMS_SELF); + }; + setsockopt(des_socket,SOL_SOCKET,0,&i,sizeof(i)); + memset(&srv,0,sizeof(srv)); + srv.sin_family=AF_INET; + srv.sin_port=htons(23); + size_adr=sizeof(srv); + if ((bind(des_socket,(struct sockaddr *)&srv,size_adr))<0) { + perror("bind"); + close(des_socket); + rtems_task_delete(RTEMS_SELF); + }; + if ((listen(des_socket,5))<0) { + perror("listen"); + close(des_socket); + rtems_task_delete(RTEMS_SELF); + }; + do { + acp_socket=accept(des_socket,(struct sockaddr*)&srv,&size_adr); + if (acp_socket<0) { + perror("accept"); + break; + }; + if (devname = get_pty(acp_socket) ) { + shell_init(&devname[5], + telnetd_stack_size, + telnetd_task_priority, + devname,B9600|CS8,FALSE); + } else { + close(acp_socket); + }; + } while(1); + close(des_socket); + rtems_task_delete(RTEMS_SELF); +} +/***********************************************************/ +int rtems_initialize_telnetd(void) { + rtems_status_code sc; + if (telnetd_task_id ) return RTEMS_RESOURCE_IN_USE; + if (telnetd_stack_size<=0 ) telnetd_stack_size =16384; + if (telnetd_task_priority<=2) telnetd_task_priority=100; + sc=rtems_task_create(new_rtems_name("TLND"), + 100,RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &telnetd_task_id); + if (sc!=RTEMS_SUCCESSFUL) { + rtems_error(sc,"creating task telnetd"); + return (int)sc; + }; + sc=rtems_task_start(telnetd_task_id, + rtems_task_telnetd, + (rtems_task_argument)NULL); + if (sc!=RTEMS_SUCCESSFUL) { + rtems_error(sc,"starting task telnetd"); + }; + return (int)sc; +} +/***********************************************************/ +int main_telnetd(int argc,char * argv[]) { + rtems_status_code sc; + if (telnetd_task_id) { + printf("ERROR:telnetd already started\n"); + return 1; + }; + if (argc>1) telnetd_stack_size =str2int(argv[1]); + if (argc>2) telnetd_task_priority=str2int(argv[2]); + sc=rtems_initialize_telnetd(); + if (sc!=RTEMS_SUCCESSFUL) return sc; + printf("rtems_telnetd() started with stacksize=%u,priority=%d\n", + telnetd_stack_size,telnetd_task_priority); + return 0; +} +/***********************************************************/ +int register_telnetd(void) { + shell_add_cmd("telnetd","telnet","telnetd [stacksize [tsk_priority]]",main_telnetd); + return 0; +} +/***********************************************************/ diff --git a/c/src/libnetworking/rtems_servers/telnetd.h b/c/src/libnetworking/rtems_servers/telnetd.h new file mode 100644 index 0000000000..fa710151bf --- /dev/null +++ b/c/src/libnetworking/rtems_servers/telnetd.h @@ -0,0 +1,20 @@ +/* + * $Id$ + */ + +#ifndef __TELNETD_H +#define __TELNETD_H + +#ifdef __cplusplus +extern "C" { +#endif + +int rtems_initialize_telnetd(void); +int main_telnetd(int argc,char * argv[]); +int register_telnetd(void); + +#ifdef __cplusplus +} +#endif + +#endif -- cgit v1.2.3