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)
TRESRC = nosshres.$(RES)
##-- resources pscp
SRESRC = scp.$(RES)
+##-- resources plink
+LRESRC = plink.$(RES)
##--
##-- gui-apps
##--
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
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
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
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
void (*send) (char *buf, int len);
void (*size) (void);
void (*special) (Telnet_Special code);
+ SOCKET (*socket) (void);
} Backend;
GLOBAL Backend *back;
#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;
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";
return;
}
+SOCKET raw_socket(void) { return s; }
+
Backend raw_backend = {
raw_init,
raw_msg,
raw_send,
raw_size,
- raw_special
+ raw_special,
+ raw_socket
};
default_protocol = PROT_TELNET;
- scp_flags = SCP_FLAG;
+ flags = 0;
ssh_get_password = &get_password;
init_winsock();
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)
* 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);
#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
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;
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;
}
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
}
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--)
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);
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));
}
}
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))) {
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);
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)
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");
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");
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);
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))) {
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";
long to_read;
int len;
- assert(IS_SCP);
-
p = NULL;
len = 0;
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;
*/
void ssh_scp_send(unsigned char *buf, int len)
{
- assert(IS_SCP);
if (s == INVALID_SOCKET)
return;
send_packet(SSH1_CMSG_STDIN_DATA,
*/
void ssh_scp_send_eof(void)
{
- assert(IS_SCP);
if (s == INVALID_SOCKET)
return;
send_packet(SSH1_CMSG_EOF, PKT_END);
{
char buf[160], *p;
- assert(IS_SCP);
-
#ifdef MSCRYPTOAPI
if (crypto_startup() == 0)
return "Microsoft high encryption pack not installed!";
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
};
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";
s = INVALID_SOCKET;
return 0;
}
-
do_telnet_read (buf, ret);
} while (in_synch);
}
}
}
+SOCKET telnet_socket(void) { return s; }
+
Backend telnet_backend = {
telnet_init,
telnet_msg,
telnet_send,
telnet_size,
- telnet_special
+ telnet_special,
+ telnet_socket
};
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)) {