From 4017be6d5375063f59b63474490ac072e7f09b1a Mon Sep 17 00:00:00 2001 From: simon Date: Fri, 8 Sep 2000 14:45:20 +0000 Subject: [PATCH] Added a fourth application: plink, a command line connection utility git-svn-id: svn://svn.tartarus.org/sgt/putty@575 cda61777-01e9-0310-a592-d414129be87e --- Makefile | 49 ++++++++++++++++++++++++++++++++++++++--------- putty.h | 9 +++++++++ raw.c | 7 +++++-- scp.c | 4 ++-- scp.h | 4 ---- ssh.c | 67 +++++++++++++++++++++++++++++++--------------------------------- telnet.c | 8 +++++--- window.c | 1 + 8 files changed, 94 insertions(+), 55 deletions(-) diff --git a/Makefile b/Makefile index 91493569..3b134914 100644 --- 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 a8135117..fbd5e64b 100644 --- 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 e65190fa..2c3e8522 100644 --- 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 0cb2dee3..68eca580 100644 --- 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 401e38db..a3eabf57 100644 --- 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 49984767..26043c63 100644 --- 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 }; diff --git a/telnet.c b/telnet.c index 1b83a311..9e6e6cdb 100644 --- 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 }; diff --git a/window.c b/window.c index 6c67b592..408a9b68 100644 --- 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)) { -- 2.11.0