Merge branch 'master' of git://git.ucc.asn.au/tpg/acess2
[tpg/acess2.git] / Usermode / Applications / telnet_src / main.c
index 6c4f892..3fdbf00 100644 (file)
@@ -4,8 +4,8 @@
 #include <acess/sys.h>\r
 #include <stdio.h>\r
 #include <net.h>\r
-\r
-#define BUFSIZ 128\r
+#include <readline.h>\r
+#include <string.h>\r
 \r
 // === PROTOTYPES ===\r
  int   main(int argc, char *argv[], char *envp[]);\r
@@ -16,46 +16,86 @@ int main(int argc, char *argv[], char *envp[])
 {\r
         int    server_fd, rv;\r
         int    client_running = 1;\r
+        int    bUseReadline = !!argv[3];       // HACK: If third argument is present, use ReadLine\r
+       tReadline       *readline_info;\r
+        int    port;\r
+       \r
+       if( argc < 2 || argc > 3 ) {\r
+               fprintf(stderr, "Usage: telnet <host> [<port>]\n Port defaults to 23\n");\r
+               return 0;\r
+       }\r
+       \r
+       if(argc == 3)\r
+               port = atoi(argv[2]);\r
+       else\r
+               port = 23;\r
        \r
        // Connect to the remove server\r
-       server_fd = OpenTCP( argv[1], atoi(argv[2]) );\r
+       server_fd = OpenTCP( argv[1], port );\r
        if( server_fd == -1 ) {\r
                fprintf(stderr, "Unable to create socket\n");\r
                return -1;\r
        }\r
        \r
+       // Create a ReadLine instance with no history\r
+       readline_info = Readline_Init(0);\r
+       \r
        while( client_running )\r
        {\r
                fd_set  fds;\r
+               fd_set  err_fds;\r
                char    buffer[BUFSIZ];\r
                 int    len;\r
                \r
-               FD_ZERO(&fds);\r
-               FD_SET(0, &fds);\r
-               FD_SET(server_fd, &fds);\r
+               // Prepare FD sets\r
+               FD_ZERO(&fds);  FD_ZERO(&err_fds);\r
+               FD_SET(0, &fds);        FD_SET(0, &err_fds);\r
+               FD_SET(server_fd, &fds);        FD_SET(server_fd, &err_fds);\r
                \r
-               rv = select(server_fd+1, &fds, NULL, NULL, NULL);\r
+               // Wait for data (no timeout)\r
+               rv = select(server_fd+1, &fds, NULL, &err_fds, NULL);\r
                if( rv < 0 )    break;\r
                \r
+               // Check for remote data avaliable\r
                if( FD_ISSET(server_fd, &fds) )\r
                {\r
                        // Read from server, and write to stdout\r
                        do\r
                        {\r
-                               len = read(server_fd, BUFSIZ, buffer);\r
-                               write(1, len, buffer);\r
+                               len = read(server_fd, buffer, BUFSIZ);\r
+                               write(1, buffer, len);\r
                        } while( len == BUFSIZ );\r
                }\r
                \r
+               // Check for local data input\r
                if( FD_ISSET(0, &fds) )\r
                {\r
                        // Read from stdin, and write to server\r
-                       do\r
+                       if( bUseReadline )\r
                        {\r
-                               len = read(0, BUFSIZ, buffer);\r
-                               write(server_fd, len, buffer);\r
-                               write(1, len, buffer);\r
-                       } while( len == BUFSIZ );\r
+                               char    *line = Readline_NonBlock(readline_info);\r
+                               if( line )\r
+                               {\r
+                                       write(server_fd, line, strlen(line));\r
+                                       write(server_fd, "\n", 1);\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               do\r
+                               {\r
+                                       len = read(0, buffer, BUFSIZ);\r
+                                       write(server_fd, buffer, len);\r
+                                       write(1, buffer, len);\r
+                               } while( len == BUFSIZ );\r
+                       }\r
+               }\r
+               \r
+               // If there was an error, quit\r
+               if( FD_ISSET(server_fd, &err_fds) )\r
+               {\r
+                       printf("\nRemote connection lost\n");\r
+                       break ;\r
                }\r
        }\r
        \r
@@ -69,8 +109,7 @@ int main(int argc, char *argv[], char *envp[])
 int OpenTCP(const char *AddressString, short PortNumber)\r
 {\r
         int    fd, addrType;\r
-       char    *iface;\r
-       char    addrBuffer[8];\r
+       uint8_t addrBuffer[16];\r
        \r
        // Parse IP Address\r
        addrType = Net_ParseAddress(AddressString, addrBuffer);\r
@@ -78,45 +117,27 @@ int OpenTCP(const char *AddressString, short PortNumber)
                fprintf(stderr, "Unable to parse '%s' as an IP address\n", AddressString);\r
                return -1;\r
        }\r
-       \r
-       // Finds the interface for the destination address\r
-       iface = Net_GetInterface(addrType, addrBuffer);\r
-       if( iface == NULL ) {\r
-               fprintf(stderr, "Unable to find a route to '%s'\n", AddressString);\r
-               return -1;\r
-       }\r
-       \r
-       printf("iface = '%s'\n", iface);\r
-       \r
-       // Open client socket\r
-       // TODO: Move this out to libnet?\r
+\r
+       // Opens a R/W handle\r
+       fd = Net_OpenSocket(addrType, addrBuffer, "tcpc");\r
+       if( fd == -1 )\r
        {\r
-                int    len = snprintf(NULL, 100, "/Devices/ip/%s/tcpc", iface);\r
-               char    path[len+1];\r
-               snprintf(path, 100, "/Devices/ip/%s/tcpc", iface);\r
-               fd = open(path, OPENFLAG_READ|OPENFLAG_WRITE);\r
-       }\r
-       \r
-       free(iface);\r
-       \r
-       if( fd == -1 ) {\r
-               fprintf(stderr, "Unable to open TCP Client for reading\n");\r
+               fprintf(stderr, "Unable to open TCP Client\n");\r
                return -1;\r
        }\r
        \r
        // Set remote port and address\r
-       printf("Setting port and remote address\n");\r
        ioctl(fd, 5, &PortNumber);\r
        ioctl(fd, 6, addrBuffer);\r
        \r
        // Connect\r
-       printf("Initiating connection\n");\r
        if( ioctl(fd, 7, NULL) == 0 ) {\r
-               // Shouldn't happen :(\r
                fprintf(stderr, "Unable to start connection\n");\r
                return -1;\r
        }\r
        \r
+       printf("Connection opened\n");\r
+       \r
        // Return descriptor\r
        return fd;\r
 }\r

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