source: rtems/cpukit/telnetd/telnetd.c @ 3523321

4.104.114.84.95
Last change on this file since 3523321 was 3523321, checked in by Joel Sherrill <joel.sherrill@…>, on 08/30/06 at 13:53:02

2006-08-30 Joel Sherrill <joel@…>

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