*/
/* ----------------------------------------------------------------------
- * String handling routines.
- */
-
-char *dupstr(char *s)
-{
- int len = strlen(s);
- char *p = smalloc(len + 1);
- strcpy(p, s);
- return p;
-}
-
-/* Allocate the concatenation of N strings. Terminate arg list with NULL. */
-char *dupcat(char *s1, ...)
-{
- int len;
- char *p, *q, *sn;
- va_list ap;
-
- len = strlen(s1);
- va_start(ap, s1);
- while (1) {
- sn = va_arg(ap, char *);
- if (!sn)
- break;
- len += strlen(sn);
- }
- va_end(ap);
-
- p = smalloc(len + 1);
- strcpy(p, s1);
- q = p + strlen(p);
-
- va_start(ap, s1);
- while (1) {
- sn = va_arg(ap, char *);
- if (!sn)
- break;
- strcpy(q, sn);
- q += strlen(q);
- }
- va_end(ap);
-
- return p;
-}
-
-/* ----------------------------------------------------------------------
* sftp client state.
*/
/* SFTP uses SSH2 by default always */
cfg.sshprot = 2;
- /* Set up subsystem name. FIXME: fudge for SSH1. */
+ /* Set up subsystem name. */
strcpy(cfg.remote_cmd, "sftp");
cfg.ssh_subsys = TRUE;
cfg.nopty = TRUE;
+ /*
+ * Set up fallback option, for SSH1 servers or servers with the
+ * sftp subsystem not enabled but the server binary installed
+ * in the usual place. We only support fallback on Unix
+ * systems, and we use the kludgy command string
+ *
+ * if test ! -x /usr/lib/sftp-server -a -x /usr/local/lib/sftp-server
+ * then
+ * exec /usr/local/lib/sftp-server
+ * else
+ * exec /usr/lib/sftp-server
+ * fi
+ *
+ * the idea being that this will attempt to use either of the
+ * obvious pathnames and then give up, and when it does give up
+ * it will print the preferred pathname in the error messages.
+ */
+ cfg.remote_cmd_ptr2 =
+ "if test ! -x /usr/lib/sftp-server -a -x /usr/local/lib/sftp-server\n"
+ "then\n"
+ " exec /usr/local/lib/sftp-server\n"
+ "else\n"
+ " exec /usr/lib/sftp-server\n"
+ "fi";
+ cfg.ssh_subsys2 = FALSE;
+
back = &ssh_backend;
err = back->init(cfg.host, cfg.port, &realhost);