console_provide_logctx(logctx);
static int psftp_connect(char *userhost, char *user, int portnumber){    char *host, *realhost;    char *err;    /* Separate host and username */    host = userhost;    host = strrchr(host, '@');    if (host == NULL) {	host = userhost;    } else {	*host++ = '\0';	if (user) {	    printf("psftp: multiple usernames specified; using \"%s\"\n",		   user);	} else	    user = userhost;    }    /* Try to load settings for this host */    do_defaults(host, &cfg);    if (cfg.host[0] == '\0') {	/* No settings for this host; use defaults */	do_defaults(NULL, &cfg);	strncpy(cfg.host, host, sizeof(cfg.host) - 1);	cfg.host[sizeof(cfg.host) - 1] = '\0';    }    /*     * Force use of SSH. (If they got the protocol wrong we assume the     * port is useless too.)     */    if (cfg.protocol != PROT_SSH) {        cfg.protocol = PROT_SSH;        cfg.port = 22;    }    /*     * Enact command-line overrides.     */    cmdline_run_saved(&cfg);    /*     * Trim leading whitespace off the hostname if it's there.     */    {	int space = strspn(cfg.host, " \t");	memmove(cfg.host, cfg.host+space, 1+strlen(cfg.host)-space);    }    /* See if host is of the form user@host */    if (cfg.host[0] != '\0') {	char *atsign = strchr(cfg.host, '@');	/* Make sure we're not overflowing the user field */	if (atsign) {	    if (atsign - cfg.host < sizeof cfg.username) {		strncpy(cfg.username, cfg.host, atsign - cfg.host);		cfg.username[atsign - cfg.host] = '\0';	    }	    memmove(cfg.host, atsign + 1, 1 + strlen(atsign + 1));	}    }    /*     * Trim a colon suffix off the hostname if it's there.     */    cfg.host[strcspn(cfg.host, ":")] = '\0';    /*     * Remove any remaining whitespace from the hostname.     */    {	int p1 = 0, p2 = 0;	while (cfg.host[p2] != '\0') {	    if (cfg.host[p2] != ' ' && cfg.host[p2] != '\t') {		cfg.host[p1] = cfg.host[p2];		p1++;	    }	    p2++;	}	cfg.host[p1] = '\0';    }    /* Set username */    if (user != NULL && user[0] != '\0') {	strncpy(cfg.username, user, sizeof(cfg.username) - 1);	cfg.username[sizeof(cfg.username) - 1] = '\0';    }    if (!cfg.username[0]) {	printf("login as: ");	fflush(stdout);	if (!fgets(cfg.username, sizeof(cfg.username), stdin)) {	    fprintf(stderr, "psftp: aborting\n");	    cleanup_exit(1);	} else {	    int len = strlen(cfg.username);	    if (cfg.username[len - 1] == '\n')		cfg.username[len - 1] = '\0';	}    }    if (portnumber)	cfg.port = portnumber;    /* SFTP uses SSH2 by default always */    cfg.sshprot = 2;    /*     * Disable scary things which shouldn't be enabled for simple     * things like SCP and SFTP: agent forwarding, port forwarding,     * X forwarding.     */    cfg.x11_forward = 0;    cfg.agentfwd = 0;    cfg.portfwd[0] = cfg.portfwd[1] = '\0';    /* 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 a kludgy piece of shellery which should     * try to find sftp-server in various places (the obvious     * systemwide spots /usr/lib and /usr/local/lib, and then the     * user's PATH) and finally give up.     *      *   test -x /usr/lib/sftp-server && exec /usr/lib/sftp-server     *   test -x /usr/local/lib/sftp-server && exec /usr/local/lib/sftp-server     *   exec sftp-server     *      * 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 =	"test -x /usr/lib/sftp-server && exec /usr/lib/sftp-server\n"	"test -x /usr/local/lib/sftp-server && exec /usr/local/lib/sftp-server\n"	"exec sftp-server";    cfg.ssh_subsys2 = FALSE;    back = &ssh_backend;    err = back->init(NULL, &backhandle, &cfg, cfg.host, cfg.port, &realhost,0);    if (err != NULL) {	fprintf(stderr, "ssh_init: %s\n", err);	return 1;    }    logctx = log_init(NULL, &cfg);    back->provide_logctx(backhandle, logctx);    ssh_sftp_init();    if (verbose && realhost != NULL)	printf("Connected to %s\n", realhost);    return 0;}