OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [c/] [src/] [libnetworking/] [rtems_telnetd/] [telnetd.c] - Blame information for rev 1780

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1026 ivang
/***********************************************************/
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
/***********************************************************/
37
rtems_id            telnetd_task_id      =0;
38
rtems_unsigned32    telnetd_stack_size   =16384;
39
rtems_task_priority telnetd_task_priority=100;
40
/***********************************************************/
41
rtems_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
/***********************************************************/
86
int 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
/***********************************************************/
113
int 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
/***********************************************************/
128
int register_telnetd(void) {
129
        shell_add_cmd("telnetd","telnet","telnetd [stacksize [tsk_priority]]",main_telnetd);
130
        return 0;
131
}
132
/***********************************************************/

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.