source: rtems/cpukit/telnetd/telnetd.c @ 956dfedf

4.104.114.84.95
Last change on this file since 956dfedf was 79061679, checked in by Ralf Corsepius <ralf.corsepius@…>, on 10/25/05 at 14:19:45

2005-10-25 Ralf Corsepius <ralf.corsepius@…>

  • telnetd/icmds.c: Rename register_icmds to _rtems_telnet_register_icmds. Make main_* functions static.
  • telnetd/pty.c: Make many functions static. Rename rtems_telnetd_maximum_ptys to rtems_pty_maximum_ptys.
  • telnetd/pty.h: Reflect changes above. Rename get_pty to rtems_pty_get. New header guards.
  • telnetd/telnetd.c: Reflect changes above.
  • telnetd/telnetd.h: New header guards.
  • Property mode set to 100644
File size: 4.0 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 <string.h>     /* memset */
36#include <stdio.h>
37
38/* FIXME: This should not be here */
39extern void _rtems_telnetd_register_icmds(void);
40
41/***********************************************************/
42rtems_id            telnetd_task_id      =0;
43uint32_t            telnetd_stack_size   =16384;
44rtems_task_priority telnetd_task_priority=100;
45/***********************************************************/
46rtems_task rtems_task_telnetd(rtems_task_argument task_argument) {
47        int des_socket,
48            acp_socket;
49        struct sockaddr_in srv;
50        char * devname;
51        int i=1;
52        socklen_t size_adr;
53        if ((des_socket=socket(PF_INET,SOCK_STREAM,0))<0) {
54                perror("telnetd:socket");
55                rtems_task_delete(RTEMS_SELF);
56        };
57        setsockopt(des_socket,SOL_SOCKET,0,&i,sizeof(i));
58        memset(&srv,0,sizeof(srv));
59        srv.sin_family=AF_INET;
60        srv.sin_port=htons(23);
61        size_adr=sizeof(srv);
62        if ((bind(des_socket,(struct sockaddr *)&srv,size_adr))<0) {
63                perror("telnetd:bind");
64                close(des_socket);
65                rtems_task_delete(RTEMS_SELF);
66        };
67        if ((listen(des_socket,5))<0) {
68                perror("telnetd:listen");
69                close(des_socket);
70                rtems_task_delete(RTEMS_SELF);
71        };
72        do {
73          acp_socket=accept(des_socket,(struct sockaddr*)&srv,&size_adr);
74          if (acp_socket<0) {
75                perror("telnetd:accept");
76                break;
77          };
78          if ((devname = rtems_pty_get(acp_socket)) ) {
79           shell_init(&devname[5],
80                      telnetd_stack_size,
81                      telnetd_task_priority,
82                      devname,B9600|CS8,FALSE);
83          } else {
84           close(acp_socket);
85          };
86        } while(1);
87        close(des_socket);
88        rtems_task_delete(RTEMS_SELF);
89}
90/***********************************************************/
91int rtems_telnetd_initialize(void) {
92        rtems_status_code sc;
93       
94        _rtems_telnetd_register_icmds(); /* stats for tcp/ip */
95       
96        if (telnetd_task_id         ) return RTEMS_RESOURCE_IN_USE;
97        if (telnetd_stack_size<=0   ) telnetd_stack_size   =16384;
98        if (telnetd_task_priority<=2) telnetd_task_priority=100;
99        sc=rtems_task_create(new_rtems_name("tlnd"),
100                             100,RTEMS_MINIMUM_STACK_SIZE,     
101                             RTEMS_DEFAULT_MODES,
102                             RTEMS_DEFAULT_ATTRIBUTES,
103                             &telnetd_task_id);
104        if (sc!=RTEMS_SUCCESSFUL) {
105                rtems_error(sc,"creating task telnetd");
106                return (int)sc;
107        };
108        sc=rtems_task_start(telnetd_task_id,
109                            rtems_task_telnetd,
110                            (rtems_task_argument)NULL);
111        if (sc!=RTEMS_SUCCESSFUL) {
112                rtems_error(sc,"starting task telnetd");
113        };
114        return (int)sc;
115}
116/***********************************************************/
117int rtems_telnetd_main(int argc,char * argv[]) {
118        rtems_status_code sc;
119        if (telnetd_task_id) {
120                printf("ERROR:telnetd already started\n");
121                return 1;
122        };
123        if (argc>1) telnetd_stack_size   =str2int(argv[1]);
124        if (argc>2) telnetd_task_priority=str2int(argv[2]);
125        sc=rtems_initialize_telnetd();
126        if (sc!=RTEMS_SUCCESSFUL) return sc;
127        printf("rtems_telnetd() started with stacksize=%u,priority=%d\n",
128                        telnetd_stack_size,telnetd_task_priority);
129        return 0;
130}
131/***********************************************************/
132int rtems_telnetd_register(void) {
133        shell_add_cmd("telnetd","telnet","telnetd [stacksize [tsk_priority]]",main_telnetd);
134        return 0;
135}
136/***********************************************************/
Note: See TracBrowser for help on using the repository browser.