source: rtems/c/src/libnetworking/rtems_telnetd/telnetd.c @ d0d73ec

4.104.114.84.95
Last change on this file since d0d73ec was bd520203, checked in by Joel Sherrill <joel.sherrill@…>, on 08/09/01 at 22:06:51

2001-08-09 Fernando-Ruiz Casas <correo@…>

  • Makefile.am, configure.in, rtems_servers/Makefile.am, rtems_servers/telnetd.c, rtems_servers/telnetd.h, rtems_telnetd/Makefile.am, rtems_telnetd/README, rtems_telnetd/icmds.c, rtems_telnetd/pty.c, rtems_telnetd/pty.h, rtems_telnetd/telnetd.c, rtems_telnetd/telnetd.h, wrapup/Makefile.am:
    • pty and telnetd have a new subdir rtems_telnetd to avoid the side effect when ftpd change.
    • the tcp/ip stats have been implemented into icmds.c and started when telnetd daemon is started.
  • rtems_servers/telnetd.c, rtems_servers/telnetd.h: Removed.
  • rtems_telnetd: New directory.
  • rtems_telnetd/Makefile.am, rtems_telnetd/README, rtems_telnetd/icmds.c, rtems_telnetd/pty.c, rtems_telnetd/pty.h, rtems_telnetd/telnetd.c, rtems_telnetd/telnetd.h: New files.
  • Property mode set to 100644
File size: 3.9 KB
Line 
1/***********************************************************/
2/*
3 *
4 *  The telnet DAEMON
5 *
6 *  Author: 17,may 2001
7 *
8 *   WORK: fernando.ruiz@ctv.es
9 *   HOME: correo@fernando-ruiz.com
10 *
11 * After start the net you can start this daemon.
12 * It uses the previously inited pseudo-terminales (pty.c)
13 * getting a new terminal with getpty(). This function
14 * gives a terminal name passing a opened socket like parameter.
15 *
16 * With register_telnetd() you add a new command in the shell to start
17 * this daemon interactively. (Login in /dev/console of course)
18 *
19 * Sorry but OOB is not still implemented. (This is the first version)
20 */
21#ifdef HAVE_CONFIG_H
22#include "config.h"
23#endif
24
25#include <rtems.h>
26#include <rtems/error.h>
27#include <rtems/pty.h>
28#include <rtems/shell.h>
29#include <rtems/telnetd.h>
30#include <sys/socket.h>
31#include <netinet/in.h>
32#include <arpa/inet.h>
33#include <unistd.h>
34#include <stdlib.h>
35#include <stdio.h>
36/***********************************************************/
37rtems_id            telnetd_task_id      =0;
38rtems_unsigned32    telnetd_stack_size   =16384;
39rtems_task_priority telnetd_task_priority=100;
40/***********************************************************/
41rtems_task rtems_task_telnetd(rtems_task_argument task_argument) {
42        int des_socket,
43            acp_socket;
44        struct sockaddr_in srv;
45        char * devname;
46        int i=1;
47        int size_adr;
48        if ((des_socket=socket(PF_INET,SOCK_STREAM,0))<0) {
49                perror("telnetd:socket");
50                rtems_task_delete(RTEMS_SELF);
51        };
52        setsockopt(des_socket,SOL_SOCKET,0,&i,sizeof(i));
53        memset(&srv,0,sizeof(srv));
54        srv.sin_family=AF_INET;
55        srv.sin_port=htons(23);
56        size_adr=sizeof(srv);
57        if ((bind(des_socket,(struct sockaddr *)&srv,size_adr))<0) {
58                perror("telnetd:bind");
59                close(des_socket);
60                rtems_task_delete(RTEMS_SELF);
61        };
62        if ((listen(des_socket,5))<0) {
63                perror("telnetd:listen");
64                close(des_socket);
65                rtems_task_delete(RTEMS_SELF);
66        };
67        do {
68          acp_socket=accept(des_socket,(struct sockaddr*)&srv,&size_adr);
69          if (acp_socket<0) {
70                perror("telnetd:accept");
71                break;
72          };
73          if ((devname = get_pty(acp_socket)) ) {
74           shell_init(&devname[5],
75                      telnetd_stack_size,
76                      telnetd_task_priority,
77                      devname,B9600|CS8,FALSE);
78          } else {
79           close(acp_socket);
80          };
81        } while(1);
82        close(des_socket);
83        rtems_task_delete(RTEMS_SELF);
84}
85/***********************************************************/
86int rtems_initialize_telnetd(void) {
87        void register_icmds(void);
88        rtems_status_code sc;
89       
90        register_icmds(); /* stats for tcp/ip */
91       
92        if (telnetd_task_id         ) return RTEMS_RESOURCE_IN_USE;
93        if (telnetd_stack_size<=0   ) telnetd_stack_size   =16384;
94        if (telnetd_task_priority<=2) telnetd_task_priority=100;
95        sc=rtems_task_create(new_rtems_name("tlnd"),
96                             100,RTEMS_MINIMUM_STACK_SIZE,     
97                             RTEMS_DEFAULT_MODES,
98                             RTEMS_DEFAULT_ATTRIBUTES,
99                             &telnetd_task_id);
100        if (sc!=RTEMS_SUCCESSFUL) {
101                rtems_error(sc,"creating task telnetd");
102                return (int)sc;
103        };
104        sc=rtems_task_start(telnetd_task_id,
105                            rtems_task_telnetd,
106                            (rtems_task_argument)NULL);
107        if (sc!=RTEMS_SUCCESSFUL) {
108                rtems_error(sc,"starting task telnetd");
109        };
110        return (int)sc;
111}
112/***********************************************************/
113int main_telnetd(int argc,char * argv[]) {
114        rtems_status_code sc;
115        if (telnetd_task_id) {
116                printf("ERROR:telnetd already started\n");
117                return 1;
118        };
119        if (argc>1) telnetd_stack_size   =str2int(argv[1]);
120        if (argc>2) telnetd_task_priority=str2int(argv[2]);
121        sc=rtems_initialize_telnetd();
122        if (sc!=RTEMS_SUCCESSFUL) return sc;
123        printf("rtems_telnetd() started with stacksize=%u,priority=%d\n",
124                        telnetd_stack_size,telnetd_task_priority);
125        return 0;
126}
127/***********************************************************/
128int register_telnetd(void) {
129        shell_add_cmd("telnetd","telnet","telnetd [stacksize [tsk_priority]]",main_telnetd);
130        return 0;
131}
132/***********************************************************/
Note: See TracBrowser for help on using the repository browser.