Added a fourth application: plink, a command line connection utility
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Fri, 8 Sep 2000 14:45:20 +0000 (14:45 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Fri, 8 Sep 2000 14:45:20 +0000 (14:45 +0000)
git-svn-id: svn://svn.tartarus.org/sgt/putty@575 cda61777-01e9-0310-a592-d414129be87e

Makefile
putty.h
raw.c
scp.c
scp.h
ssh.c
telnet.c
window.c

index 9149356..3b13491 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -45,17 +45,21 @@ OBJ=obj
 RES=res
 
 ##-- objects putty puttytel
-GOBJS1 = window.$(OBJ) windlg.$(OBJ) terminal.$(OBJ) telnet.$(OBJ) raw.$(OBJ)
-GOBJS2 = xlat.$(OBJ) ldisc.$(OBJ) sizetip.$(OBJ)
-##-- objects putty
+GOBJS1 = window.$(OBJ) windlg.$(OBJ) terminal.$(OBJ)
+GOBJS2 = xlat.$(OBJ) sizetip.$(OBJ)
+##-- objects putty puttytel plink
+LOBJS1 = telnet.$(OBJ) raw.$(OBJ) ldisc.$(OBJ)
+##-- objects putty plink
 POBJS = ssh.$(OBJ) be_all.$(OBJ)
 ##-- objects puttytel
 TOBJS = be_nossh.$(OBJ)
+##-- objects plink
+PLOBJS = plink.$(OBJ) windlg.$(OBJ)
 ##-- objects pscp
 SOBJS = scp.$(OBJ) windlg.$(OBJ) ssh.$(OBJ) be_none.$(OBJ)
-##-- objects putty puttytel pscp
+##-- objects putty puttytel pscp plink
 MOBJS = misc.$(OBJ) version.$(OBJ)
-##-- objects putty pscp
+##-- objects putty pscp plink
 OBJS1 = sshcrc.$(OBJ) sshdes.$(OBJ) sshmd5.$(OBJ) sshrsa.$(OBJ) sshrand.$(OBJ)
 OBJS2 = sshsha.$(OBJ) sshblowf.$(OBJ) noise.$(OBJ) sshdh.$(OBJ) sshdss.$(OBJ)
 OBJS3 = sshbn.$(OBJ) sshpubk.$(OBJ)
@@ -65,6 +69,8 @@ PRESRC = win_res.$(RES)
 TRESRC = nosshres.$(RES)
 ##-- resources pscp
 SRESRC = scp.$(RES)
+##-- resources plink
+LRESRC = plink.$(RES)
 ##--
 
 ##-- gui-apps
@@ -75,23 +81,29 @@ SRESRC = scp.$(RES)
 ##--
 
 LIBS1 = advapi32.lib user32.lib gdi32.lib
-LIBS2 = wsock32.lib comctl32.lib comdlg32.lib
+LIBS2 = comctl32.lib comdlg32.lib
+SOCK1 = wsock32.lib
+SOCK2 = ws2_32.lib
 
-all: putty.exe puttytel.exe pscp.exe
+all: putty.exe puttytel.exe pscp.exe plink.exe
 
-putty.exe: $(GOBJS1) $(GOBJS2) $(POBJS) $(MOBJS) $(OBJS1) $(OBJS2) $(OBJS3) $(PRESRC) putty.rsp
+putty.exe: $(GOBJS1) $(GOBJS2) $(LOBJS1) $(POBJS) $(MOBJS) $(OBJS1) $(OBJS2) $(OBJS3) $(PRESRC) putty.rsp
        link $(LFLAGS) -out:putty.exe @putty.rsp
 
-puttytel.exe: $(GOBJS1) $(GOBJS2) $(TOBJS) $(MOBJS) $(TRESRC) puttytel.rsp
+puttytel.exe: $(GOBJS1) $(GOBJS2) $(LOBJS1) $(TOBJS) $(MOBJS) $(TRESRC) puttytel.rsp
        link $(LFLAGS) -out:puttytel.exe @puttytel.rsp
 
 pscp.exe: $(SOBJS) $(MOBJS) $(OBJS1) $(OBJS2) $(OBJS3) $(SRESRC) pscp.rsp
        link $(LFLAGS) -out:pscp.exe @pscp.rsp
 
+plink.exe: $(LOBJS1) $(POBJS) $(PLOBJS) $(MOBJS) $(OBJS1) $(OBJS2) $(OBJS3) $(LRESRC) plink.rsp
+       link $(LFLAGS) -out:plink.exe @plink.rsp
+
 putty.rsp: makefile
        echo /nologo /subsystem:windows > putty.rsp
        echo $(GOBJS1) >> putty.rsp
        echo $(GOBJS2) >> putty.rsp
+       echo $(LOBJS1) >> putty.rsp
        echo $(POBJS) >> putty.rsp
        echo $(MOBJS) >> putty.rsp
        echo $(OBJS1) >> putty.rsp
@@ -100,16 +112,19 @@ putty.rsp: makefile
        echo $(PRESRC) >> putty.rsp
        echo $(LIBS1) >> putty.rsp
        echo $(LIBS2) >> putty.rsp
+       echo $(SOCK1) >> putty.rsp
 
 puttytel.rsp: makefile
        echo /nologo /subsystem:windows > puttytel.rsp
        echo $(GOBJS1) >> puttytel.rsp
        echo $(GOBJS2) >> puttytel.rsp
+       echo $(LOBJS1) >> puttytel.rsp
        echo $(TOBJS) >> puttytel.rsp
        echo $(MOBJS) >> puttytel.rsp
        echo $(TRESRC) >> puttytel.rsp
        echo $(LIBS1) >> puttytel.rsp
        echo $(LIBS2) >> puttytel.rsp
+       echo $(SOCK1) >> puttytel.rsp
 
 pscp.rsp: makefile
        echo /nologo /subsystem:console > pscp.rsp
@@ -121,6 +136,21 @@ pscp.rsp: makefile
        echo $(SRESRC) >> pscp.rsp
        echo $(LIBS1) >> pscp.rsp
        echo $(LIBS2) >> pscp.rsp
+       echo $(SOCK1) >> pscp.rsp
+
+plink.rsp: makefile
+       echo /nologo /subsystem:console > plink.rsp
+       echo $(LOBJS1) >> plink.rsp
+       echo $(POBJS) >> plink.rsp
+       echo $(PLOBJS) >> plink.rsp
+       echo $(MOBJS) >> plink.rsp
+       echo $(OBJS1) >> plink.rsp
+       echo $(OBJS2) >> plink.rsp
+       echo $(OBJS3) >> plink.rsp
+       echo $(LRESRC) >> plink.rsp
+       echo $(LIBS1) >> plink.rsp
+       echo $(LIBS2) >> plink.rsp
+       echo $(SOCK2) >> plink.rsp
 
 ##-- dependencies
 window.$(OBJ): window.c putty.h win_res.h
@@ -150,6 +180,7 @@ version.$(OBJ): version.c
 be_all.$(OBJ): be_all.c
 be_nossh.$(OBJ): be_nossh.c
 be_none.$(OBJ): be_none.c
+plink.$(OBJ): plink.c putty.h
 ##--
 
 # Hack to force version.obj to be rebuilt always
diff --git a/putty.h b/putty.h
index a813511..fbd5e64 100644 (file)
--- a/putty.h
+++ b/putty.h
@@ -109,6 +109,7 @@ typedef struct {
     void (*send) (char *buf, int len);
     void (*size) (void);
     void (*special) (Telnet_Special code);
+    SOCKET (*socket) (void);
 } Backend;
 
 GLOBAL Backend *back;
@@ -196,6 +197,14 @@ typedef struct {
 #define DEFAULT_PORT 22
 #endif
 
+/*
+ * Some global flags denoting the type of application.
+ */
+#define FLAG_VERBOSE  0x0001
+#define FLAG_WINDOWED 0x0002
+#define FLAG_CONNECTION 0x0004
+GLOBAL int flags;
+
 GLOBAL Config cfg;
 GLOBAL int default_protocol;
 GLOBAL int default_port;
diff --git a/raw.c b/raw.c
index e65190f..2c3e852 100644 (file)
--- a/raw.c
+++ b/raw.c
@@ -124,7 +124,7 @@ static char *raw_init (HWND hwnd, char *host, int port, char **realhost) {
          default: return "connect(): unknown error";
        }
 
-    if (WSAAsyncSelect (s, hwnd, WM_NETEVENT, FD_READ |
+    if (hwnd && WSAAsyncSelect (s, hwnd, WM_NETEVENT, FD_READ |
                        FD_WRITE | FD_OOB | FD_CLOSE) == SOCKET_ERROR)
        switch (WSAGetLastError()) {
          case WSAENETDOWN: return "Network is down";
@@ -215,10 +215,13 @@ static void raw_special (Telnet_Special code) {
     return;
 }
 
+SOCKET raw_socket(void) { return s; }
+
 Backend raw_backend = {
     raw_init,
     raw_msg,
     raw_send,
     raw_size,
-    raw_special
+    raw_special,
+    raw_socket
 };
diff --git a/scp.c b/scp.c
index 0cb2dee..68eca58 100644 (file)
--- a/scp.c
+++ b/scp.c
@@ -844,7 +844,7 @@ int main(int argc, char *argv[])
 
     default_protocol = PROT_TELNET;
 
-    scp_flags = SCP_FLAG;
+    flags = 0;
     ssh_get_password = &get_password;
     init_winsock();
 
@@ -852,7 +852,7 @@ int main(int argc, char *argv[])
        if (argv[i][0] != '-')
            break;
        if (strcmp(argv[i], "-v") == 0)
-           verbose = 1, scp_flags |= SCP_VERBOSE;
+           verbose = 1, flags |= FLAG_VERBOSE;
        else if (strcmp(argv[i], "-r") == 0)
            recursive = 1;
        else if (strcmp(argv[i], "-p") == 0)
diff --git a/scp.h b/scp.h
index 401e38d..a3eabf5 100644 (file)
--- a/scp.h
+++ b/scp.h
@@ -3,10 +3,6 @@
  *  Joris van Rantwijk, Aug 1999, Jun 2000.
  */
 
-#define SCP_FLAG       1
-#define SCP_VERBOSE    2
-#define IS_SCP ((scp_flags & SCP_FLAG) != 0)
-
 /* Exported from ssh.c */
 extern int scp_flags;
 extern int (*ssh_get_password)(const char *prompt, char *str, int maxlen);
diff --git a/ssh.c b/ssh.c
index 4998476..26043c6 100644 (file)
--- a/ssh.c
+++ b/ssh.c
@@ -16,7 +16,7 @@
 #endif
 
 #define logevent(s) { logevent(s); \
-                      if (IS_SCP && (scp_flags & SCP_VERBOSE) != 0) \
+                      if (!(flags & FLAG_CONNECTION) && (flags & FLAG_VERBOSE)) \
                       fprintf(stderr, "%s\n", s); }
 
 #define SSH1_MSG_DISCONNECT    1
@@ -160,7 +160,6 @@ static struct ssh_compress *cscomp = NULL;
 static struct ssh_compress *sccomp = NULL;
 static struct ssh_kex *kex = NULL;
 static struct ssh_hostkey *hostkey = NULL;
-int scp_flags = 0;
 int (*ssh_get_password)(const char *prompt, char *str, int maxlen) = NULL;
 
 static char *savedhost;
@@ -177,11 +176,9 @@ static int size_needed = FALSE;
 static void s_write (char *buf, int len) {
     while (len > 0) {
        int i = send (s, buf, len, 0);
-       if (IS_SCP) {
-           noise_ultralight(i);
-           if (i <= 0)
-               fatalbox("Lost connection while sending");
-       }
+        noise_ultralight(i);
+        if (i <= 0)
+            fatalbox("Lost connection while sending");
        if (i > 0)
            len -= i, buf += i;
     }
@@ -191,8 +188,7 @@ static int s_read (char *buf, int len) {
     int ret = 0;
     while (len > 0) {
        int i = recv (s, buf, len, 0);
-       if (IS_SCP)
-           noise_ultralight(i);
+        noise_ultralight(i);
        if (i > 0)
            len -= i, buf += i, ret += i;
        else
@@ -202,10 +198,11 @@ static int s_read (char *buf, int len) {
 }
 
 static void c_write (char *buf, int len) {
-    if (IS_SCP) {
-       if (len > 0 && buf[len-1] == '\n') len--;
-       if (len > 0 && buf[len-1] == '\r') len--;
-       if (len > 0) { fwrite(buf, len, 1, stderr); fputc('\n', stderr); }
+    if (!(flags & FLAG_CONNECTION)) {
+        int i;
+        for (i = 0; i < len; i++)
+            if (buf[i] != '\r')
+                fputc(buf[i], stderr);
        return;
     }
     while (len--) 
@@ -1133,7 +1130,7 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
        static char username[100];
        static int pos = 0;
        static char c;
-       if (!IS_SCP && !*cfg.username) {
+       if (!(flags & FLAG_CONNECTION) && !*cfg.username) {
            c_write("login as: ", 10);
            while (pos >= 0) {
                crWaitUntil(!ispkt);
@@ -1173,9 +1170,9 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
            char stuff[200];
            strncpy(username, cfg.username, 99);
            username[99] = '\0';
-           if (!IS_SCP) {
+            if (flags & FLAG_VERBOSE) {
                sprintf(stuff, "Sent username \"%s\".\r\n", username);
-               c_write(stuff, strlen(stuff));
+                c_write(stuff, strlen(stuff));
            }
        }
 
@@ -1204,7 +1201,7 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
         if (*cfg.keyfile && !tried_publickey)
             pwpkt_type = SSH1_CMSG_AUTH_RSA;
 
-       if (pwpkt_type == SSH1_CMSG_AUTH_PASSWORD && IS_SCP) {
+       if (pwpkt_type == SSH1_CMSG_AUTH_PASSWORD && !FLAG_WINDOWED) {
            char prompt[200];
            sprintf(prompt, "%s@%s's password: ", cfg.username, savedhost);
            if (!ssh_get_password(prompt, password, sizeof(password))) {
@@ -1242,9 +1239,11 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
             if (pwpkt_type == SSH1_CMSG_AUTH_PASSWORD)
                 c_write("password: ", 10);
             if (pwpkt_type == SSH1_CMSG_AUTH_RSA) {
-                c_write("Trying public key authentication.\r\n", 35);
+                if (flags & FLAG_VERBOSE)
+                    c_write("Trying public key authentication.\r\n", 35);
                 if (!rsakey_encrypted(cfg.keyfile)) {
-                    c_write("No passphrase required.\r\n", 25);
+                    if (flags & FLAG_VERBOSE)
+                        c_write("No passphrase required.\r\n", 25);
                     goto tryauth;
                 }
                 c_write("passphrase: ", 12);
@@ -1313,7 +1312,8 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
 
             crWaitUntil(ispkt);
             if (pktin.type == SSH1_SMSG_FAILURE) {
-                c_write("Server refused our public key.\r\n", 32);
+                if (flags & FLAG_VERBOSE)
+                    c_write("Server refused our public key.\r\n", 32);
                 continue;              /* go and try password */
             }
             if (pktin.type != SSH1_SMSG_AUTH_RSA_CHALLENGE)
@@ -1337,7 +1337,9 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
 
             crWaitUntil(ispkt);
             if (pktin.type == SSH1_SMSG_FAILURE) {
-                c_write("Failed to authenticate with our public key.\r\n", 45);
+                if (flags & FLAG_VERBOSE)
+                    c_write("Failed to authenticate with our public key.\r\n",
+                            45);
                 continue;              /* go and try password */
             } else if (pktin.type != SSH1_SMSG_SUCCESS) {
                 fatalbox("Bizarre response to RSA authentication response");
@@ -1351,7 +1353,8 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
        memset(password, 0, strlen(password));
        crWaitUntil(ispkt);
        if (pktin.type == SSH1_SMSG_FAILURE) {
-           c_write("Access denied\r\n", 15);
+            if (flags & FLAG_VERBOSE)
+                c_write("Access denied\r\n", 15);
            logevent("Authentication refused");
        } else if (pktin.type == SSH1_MSG_DISCONNECT) {
            logevent("Received disconnect request");
@@ -1775,7 +1778,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
        static int pos = 0;
        static char c;
 
-       if (!IS_SCP && !*cfg.username) {
+       if ((flags & FLAG_CONNECTION) && !*cfg.username) {
            c_write("login as: ", 10);
            while (pos >= 0) {
                crWaitUntilV(!ispkt);
@@ -1815,13 +1818,13 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
            char stuff[200];
            strncpy(username, cfg.username, 99);
            username[99] = '\0';
-           if (!IS_SCP) {
+           if (flags & FLAG_VERBOSE) {
                sprintf(stuff, "Using username \"%s\".\r\n", username);
                c_write(stuff, strlen(stuff));
            }
        }
 
-       if (IS_SCP) {
+       if (!(flags & FLAG_WINDOWED)) {
            char prompt[200];
            sprintf(prompt, "%s@%s's password: ", cfg.username, savedhost);
            if (!ssh_get_password(prompt, password, sizeof(password))) {
@@ -2033,7 +2036,7 @@ static char *ssh_init (HWND hwnd, char *host, int port, char **realhost) {
     if (!do_ssh_init())
        return "Protocol initialisation error";
 
-    if (WSAAsyncSelect (s, hwnd, WM_NETEVENT, FD_READ | FD_CLOSE) == SOCKET_ERROR)
+    if (hwnd && WSAAsyncSelect (s, hwnd, WM_NETEVENT, FD_READ | FD_CLOSE) == SOCKET_ERROR)
        switch (WSAGetLastError()) {
          case WSAENETDOWN: return "Network is down";
          default: return "WSAAsyncSelect(): unknown error";
@@ -2134,8 +2137,6 @@ static void get_packet(void)
     long to_read;
     int len;
 
-    assert(IS_SCP);
-
     p = NULL;
     len = 0;
 
@@ -2164,8 +2165,6 @@ int ssh_scp_recv(unsigned char *buf, int len)
     static unsigned char *pending_input_ptr;
     int to_read = len;
 
-    assert(IS_SCP);
-
     if (pending_input_len >= to_read) {
        memcpy(buf, pending_input_ptr, to_read);
        pending_input_ptr += to_read;
@@ -2229,7 +2228,6 @@ int ssh_scp_recv(unsigned char *buf, int len)
  */
 void ssh_scp_send(unsigned char *buf, int len)
 {
-    assert(IS_SCP);
     if (s == INVALID_SOCKET)
        return;
     send_packet(SSH1_CMSG_STDIN_DATA,
@@ -2242,7 +2240,6 @@ void ssh_scp_send(unsigned char *buf, int len)
  */
 void ssh_scp_send_eof(void)
 {
-    assert(IS_SCP);
     if (s == INVALID_SOCKET)
        return;
     send_packet(SSH1_CMSG_EOF, PKT_END);
@@ -2258,8 +2255,6 @@ char *ssh_scp_init(char *host, int port, char *cmd, char **realhost)
 {
     char buf[160], *p;
 
-    assert(IS_SCP);
-
 #ifdef MSCRYPTOAPI
     if (crypto_startup() == 0)
        return "Microsoft high encryption pack not installed!";
@@ -2295,11 +2290,13 @@ char *ssh_scp_init(char *host, int port, char *cmd, char **realhost)
     return NULL;
 }
 
+SOCKET ssh_socket(void) { return s; }
 
 Backend ssh_backend = {
     ssh_init,
     ssh_msg,
     ssh_send,
     ssh_size,
-    ssh_special
+    ssh_special,
+    ssh_socket
 };
index 1b83a31..9e6e6cd 100644 (file)
--- a/telnet.c
+++ b/telnet.c
@@ -552,7 +552,7 @@ static char *telnet_init (HWND hwnd, char *host, int port, char **realhost) {
          default: return "connect(): unknown error";
        }
 
-    if (WSAAsyncSelect (s, hwnd, WM_NETEVENT, FD_READ |
+    if (hwnd && WSAAsyncSelect (s, hwnd, WM_NETEVENT, FD_READ |
                        FD_WRITE | FD_OOB | FD_CLOSE) == SOCKET_ERROR)
        switch (WSAGetLastError()) {
          case WSAENETDOWN: return "Network is down";
@@ -631,7 +631,6 @@ static int telnet_msg (WPARAM wParam, LPARAM lParam) {
                    s = INVALID_SOCKET;
                    return 0;
                }
-
                do_telnet_read (buf, ret);
            } while (in_synch);
        }
@@ -733,10 +732,13 @@ static void telnet_special (Telnet_Special code) {
     }
 }
 
+SOCKET telnet_socket(void) { return s; }
+
 Backend telnet_backend = {
     telnet_init,
     telnet_msg,
     telnet_send,
     telnet_size,
-    telnet_special
+    telnet_special,
+    telnet_socket
 };
index 6c67b59..408a9b6 100644 (file)
--- a/window.c
+++ b/window.c
@@ -89,6 +89,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
     int guess_width, guess_height;
 
     putty_inst = inst;
+    flags = FLAG_VERBOSE | FLAG_WINDOWED | FLAG_CONNECTION;
 
     winsock_ver = MAKEWORD(1, 1);
     if (WSAStartup(winsock_ver, &wsadata)) {