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

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