Kernel/ARMv7 - Fixed not using ASIDs
[tpg/acess2.git] / Usermode / Applications / telnet_src / main.c
1 /*\r
2  AcessOS Test Network Application\r
3 */\r
4 #include <acess/sys.h>\r
5 #include <stdio.h>\r
6 #include <net.h>\r
7 #include <readline.h>\r
8 #include <string.h>\r
9 \r
10 #define BUFSIZ  2048\r
11 \r
12 // === PROTOTYPES ===\r
13  int    main(int argc, char *argv[], char *envp[]);\r
14  int    OpenTCP(const char *AddressString, short PortNumber);\r
15 \r
16 // ==== CODE ====\r
17 int main(int argc, char *argv[], char *envp[])\r
18 {\r
19          int    server_fd, rv;\r
20          int    client_running = 1;\r
21          int    bUseReadline = !!argv[3];       // HACK: If third argument is present, use ReadLine\r
22         tReadline       *readline_info;\r
23          int    port;\r
24         \r
25         if( argc < 2 || argc > 3 ) {\r
26                 fprintf(stderr, "Usage: telnet <host> [<port>]\n Port defaults to 23\n");\r
27                 return 0;\r
28         }\r
29         \r
30         if(argc == 3)\r
31                 port = atoi(argv[2]);\r
32         else\r
33                 port = 23;\r
34         \r
35         // Connect to the remove server\r
36         server_fd = OpenTCP( argv[1], port );\r
37         if( server_fd == -1 ) {\r
38                 fprintf(stderr, "Unable to create socket\n");\r
39                 return -1;\r
40         }\r
41         \r
42         // Create a ReadLine instance with no history\r
43         readline_info = Readline_Init(0);\r
44         \r
45         while( client_running )\r
46         {\r
47                 fd_set  fds;\r
48                 fd_set  err_fds;\r
49                 char    buffer[BUFSIZ];\r
50                  int    len;\r
51                 \r
52                 // Prepare FD sets\r
53                 FD_ZERO(&fds);  FD_ZERO(&err_fds);\r
54                 FD_SET(0, &fds);        FD_SET(0, &err_fds);\r
55                 FD_SET(server_fd, &fds);        FD_SET(server_fd, &err_fds);\r
56                 \r
57                 // Wait for data (no timeout)\r
58                 rv = select(server_fd+1, &fds, NULL, &err_fds, NULL);\r
59                 if( rv < 0 )    break;\r
60                 \r
61                 // Check for remote data avaliable\r
62                 if( FD_ISSET(server_fd, &fds) )\r
63                 {\r
64                         // Read from server, and write to stdout\r
65                         do\r
66                         {\r
67                                 len = read(server_fd, buffer, BUFSIZ);\r
68                                 write(1, buffer, len);\r
69                         } while( len == BUFSIZ );\r
70                 }\r
71                 \r
72                 // Check for local data input\r
73                 if( FD_ISSET(0, &fds) )\r
74                 {\r
75                         // Read from stdin, and write to server\r
76                         if( bUseReadline )\r
77                         {\r
78                                 char    *line = Readline_NonBlock(readline_info);\r
79                                 if( line )\r
80                                 {\r
81                                         write(server_fd, line, strlen(line));\r
82                                         write(server_fd, "\n", 1);\r
83                                 }\r
84                         }\r
85                         else\r
86                         {\r
87                                 do\r
88                                 {\r
89                                         len = read(0, buffer, BUFSIZ);\r
90                                         write(server_fd, buffer, len);\r
91                                         write(1, buffer, len);\r
92                                 } while( len == BUFSIZ );\r
93                         }\r
94                 }\r
95                 \r
96                 // If there was an error, quit\r
97                 if( FD_ISSET(server_fd, &err_fds) )\r
98                 {\r
99                         printf("\nRemote connection lost\n");\r
100                         break ;\r
101                 }\r
102         }\r
103         \r
104         close(server_fd);\r
105         return 0;\r
106 }\r
107 \r
108 /**\r
109  * \brief Initialise a TCP connection to \a AddressString on port \a PortNumber\r
110  */\r
111 int OpenTCP(const char *AddressString, short PortNumber)\r
112 {\r
113          int    fd, addrType;\r
114         uint8_t addrBuffer[16];\r
115         \r
116         // Parse IP Address\r
117         addrType = Net_ParseAddress(AddressString, addrBuffer);\r
118         if( addrType == 0 ) {\r
119                 fprintf(stderr, "Unable to parse '%s' as an IP address\n", AddressString);\r
120                 return -1;\r
121         }\r
122 \r
123         // Opens a R/W handle\r
124         fd = Net_OpenSocket(addrType, addrBuffer, "tcpc");\r
125         if( fd == -1 )\r
126         {\r
127                 fprintf(stderr, "Unable to open TCP Client\n");\r
128                 return -1;\r
129         }\r
130         \r
131         // Set remote port and address\r
132         ioctl(fd, 5, &PortNumber);\r
133         ioctl(fd, 6, addrBuffer);\r
134         \r
135         // Connect\r
136         if( ioctl(fd, 7, NULL) == 0 ) {\r
137                 fprintf(stderr, "Unable to start connection\n");\r
138                 return -1;\r
139         }\r
140         \r
141         printf("Connection opened\n");\r
142         \r
143         // Return descriptor\r
144         return fd;\r
145 }\r
146 \r

UCC git Repository :: git.ucc.asn.au