6c4f892ec69a195e386674abe6a9cc8c5de0ae76
[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 \r
8 #define BUFSIZ  128\r
9 \r
10 // === PROTOTYPES ===\r
11  int    main(int argc, char *argv[], char *envp[]);\r
12  int    OpenTCP(const char *AddressString, short PortNumber);\r
13 \r
14 // ==== CODE ====\r
15 int main(int argc, char *argv[], char *envp[])\r
16 {\r
17          int    server_fd, rv;\r
18          int    client_running = 1;\r
19         \r
20         // Connect to the remove server\r
21         server_fd = OpenTCP( argv[1], atoi(argv[2]) );\r
22         if( server_fd == -1 ) {\r
23                 fprintf(stderr, "Unable to create socket\n");\r
24                 return -1;\r
25         }\r
26         \r
27         while( client_running )\r
28         {\r
29                 fd_set  fds;\r
30                 char    buffer[BUFSIZ];\r
31                  int    len;\r
32                 \r
33                 FD_ZERO(&fds);\r
34                 FD_SET(0, &fds);\r
35                 FD_SET(server_fd, &fds);\r
36                 \r
37                 rv = select(server_fd+1, &fds, NULL, NULL, NULL);\r
38                 if( rv < 0 )    break;\r
39                 \r
40                 if( FD_ISSET(server_fd, &fds) )\r
41                 {\r
42                         // Read from server, and write to stdout\r
43                         do\r
44                         {\r
45                                 len = read(server_fd, BUFSIZ, buffer);\r
46                                 write(1, len, buffer);\r
47                         } while( len == BUFSIZ );\r
48                 }\r
49                 \r
50                 if( FD_ISSET(0, &fds) )\r
51                 {\r
52                         // Read from stdin, and write to server\r
53                         do\r
54                         {\r
55                                 len = read(0, BUFSIZ, buffer);\r
56                                 write(server_fd, len, buffer);\r
57                                 write(1, len, buffer);\r
58                         } while( len == BUFSIZ );\r
59                 }\r
60         }\r
61         \r
62         close(server_fd);\r
63         return 0;\r
64 }\r
65 \r
66 /**\r
67  * \brief Initialise a TCP connection to \a AddressString on port \a PortNumber\r
68  */\r
69 int OpenTCP(const char *AddressString, short PortNumber)\r
70 {\r
71          int    fd, addrType;\r
72         char    *iface;\r
73         char    addrBuffer[8];\r
74         \r
75         // Parse IP Address\r
76         addrType = Net_ParseAddress(AddressString, addrBuffer);\r
77         if( addrType == 0 ) {\r
78                 fprintf(stderr, "Unable to parse '%s' as an IP address\n", AddressString);\r
79                 return -1;\r
80         }\r
81         \r
82         // Finds the interface for the destination address\r
83         iface = Net_GetInterface(addrType, addrBuffer);\r
84         if( iface == NULL ) {\r
85                 fprintf(stderr, "Unable to find a route to '%s'\n", AddressString);\r
86                 return -1;\r
87         }\r
88         \r
89         printf("iface = '%s'\n", iface);\r
90         \r
91         // Open client socket\r
92         // TODO: Move this out to libnet?\r
93         {\r
94                  int    len = snprintf(NULL, 100, "/Devices/ip/%s/tcpc", iface);\r
95                 char    path[len+1];\r
96                 snprintf(path, 100, "/Devices/ip/%s/tcpc", iface);\r
97                 fd = open(path, OPENFLAG_READ|OPENFLAG_WRITE);\r
98         }\r
99         \r
100         free(iface);\r
101         \r
102         if( fd == -1 ) {\r
103                 fprintf(stderr, "Unable to open TCP Client for reading\n");\r
104                 return -1;\r
105         }\r
106         \r
107         // Set remote port and address\r
108         printf("Setting port and remote address\n");\r
109         ioctl(fd, 5, &PortNumber);\r
110         ioctl(fd, 6, addrBuffer);\r
111         \r
112         // Connect\r
113         printf("Initiating connection\n");\r
114         if( ioctl(fd, 7, NULL) == 0 ) {\r
115                 // Shouldn't happen :(\r
116                 fprintf(stderr, "Unable to start connection\n");\r
117                 return -1;\r
118         }\r
119         \r
120         // Return descriptor\r
121         return fd;\r
122 }\r
123 \r

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