version 1.15, 2001/04/16 02:31:44 |
version 1.15.2.1, 2001/09/27 19:03:55 |
|
|
#include "xmalloc.h" |
#include "xmalloc.h" |
#include "log.h" |
#include "log.h" |
#include "pathnames.h" |
#include "pathnames.h" |
|
#include "misc.h" |
|
|
#include "sftp.h" |
#include "sftp.h" |
#include "sftp-common.h" |
#include "sftp-common.h" |
#include "sftp-client.h" |
#include "sftp-client.h" |
#include "sftp-int.h" |
#include "sftp-int.h" |
|
|
#include "scp-common.h" |
|
|
|
int use_ssh1 = 0; |
|
char *ssh_program = _PATH_SSH_PROGRAM; |
char *ssh_program = _PATH_SSH_PROGRAM; |
char *sftp_server = NULL; |
|
FILE* infile; |
FILE* infile; |
|
|
void |
static void |
connect_to_server(char **args, int *in, int *out, pid_t *sshpid) |
connect_to_server(char **args, int *in, int *out, pid_t *sshpid) |
{ |
{ |
int c_in, c_out; |
int c_in, c_out; |
|
|
close(c_out); |
close(c_out); |
} |
} |
|
|
char ** |
static void |
make_ssh_args(char *add_arg) |
|
{ |
|
static char **args = NULL; |
|
static int nargs = 0; |
|
char debug_buf[4096]; |
|
int i; |
|
|
|
/* Init args array */ |
|
if (args == NULL) { |
|
nargs = 2; |
|
i = 0; |
|
args = xmalloc(sizeof(*args) * nargs); |
|
args[i++] = "ssh"; |
|
args[i++] = NULL; |
|
} |
|
|
|
/* If asked to add args, then do so and return */ |
|
if (add_arg) { |
|
i = nargs++ - 1; |
|
args = xrealloc(args, sizeof(*args) * nargs); |
|
args[i++] = add_arg; |
|
args[i++] = NULL; |
|
return(NULL); |
|
} |
|
|
|
/* no subsystem if the server-spec contains a '/' */ |
|
if (sftp_server == NULL || strchr(sftp_server, '/') == NULL) |
|
make_ssh_args("-s"); |
|
make_ssh_args("-oForwardX11=no"); |
|
make_ssh_args("-oForwardAgent=no"); |
|
make_ssh_args(use_ssh1 ? "-oProtocol=1" : "-oProtocol=2"); |
|
|
|
/* Otherwise finish up and return the arg array */ |
|
if (sftp_server != NULL) |
|
make_ssh_args(sftp_server); |
|
else |
|
make_ssh_args("sftp"); |
|
|
|
/* XXX: overflow - doesn't grow debug_buf */ |
|
debug_buf[0] = '\0'; |
|
for(i = 0; args[i]; i++) { |
|
if (i) |
|
strlcat(debug_buf, " ", sizeof(debug_buf)); |
|
|
|
strlcat(debug_buf, args[i], sizeof(debug_buf)); |
|
} |
|
debug("SSH args \"%s\"", debug_buf); |
|
|
|
return(args); |
|
} |
|
|
|
void |
|
usage(void) |
usage(void) |
{ |
{ |
fprintf(stderr, "usage: sftp [-1vC] [-b batchfile] [-osshopt=value] [user@]host[:file [file]]\n"); |
fprintf(stderr, |
|
"usage: sftp [-1Cv] [-b batchfile] [-F config] [-o option] [-s subsystem|path]\n" |
|
" [-S program] [user@]host[:file [file]]\n"); |
exit(1); |
exit(1); |
} |
} |
|
|
int |
int |
main(int argc, char **argv) |
main(int argc, char **argv) |
{ |
{ |
int in, out, ch, debug_level, compress_flag; |
int in, out, ch; |
pid_t sshpid; |
pid_t sshpid; |
char *file1 = NULL; |
|
char *host, *userhost, *cp, *file2; |
char *host, *userhost, *cp, *file2; |
LogLevel ll; |
int debug_level = 0, sshver = 2; |
|
char *file1 = NULL, *sftp_server = NULL; |
|
LogLevel ll = SYSLOG_LEVEL_INFO; |
|
arglist args; |
extern int optind; |
extern int optind; |
extern char *optarg; |
extern char *optarg; |
|
|
|
args.list = NULL; |
|
addargs(&args, "ssh"); /* overwritten with ssh_program */ |
|
addargs(&args, "-oFallBackToRsh no"); |
|
addargs(&args, "-oForwardX11 no"); |
|
addargs(&args, "-oForwardAgent no"); |
|
addargs(&args, "-oClearAllForwardings yes"); |
|
ll = SYSLOG_LEVEL_INFO; |
infile = stdin; /* Read from STDIN unless changed by -b */ |
infile = stdin; /* Read from STDIN unless changed by -b */ |
debug_level = compress_flag = 0; |
|
|
|
while ((ch = getopt(argc, argv, "1hvCo:s:S:b:")) != -1) { |
while ((ch = getopt(argc, argv, "1hvCo:s:S:b:F:")) != -1) { |
switch (ch) { |
switch (ch) { |
case 'C': |
case 'C': |
compress_flag = 1; |
addargs(&args, "-C"); |
break; |
break; |
case 'v': |
case 'v': |
debug_level = MIN(3, debug_level + 1); |
if (debug_level < 3) { |
|
addargs(&args, "-v"); |
|
ll = SYSLOG_LEVEL_DEBUG1 + debug_level; |
|
} |
|
debug_level++; |
break; |
break; |
|
case 'F': |
case 'o': |
case 'o': |
make_ssh_args("-o"); |
addargs(&args, "-%c%s", ch, optarg); |
make_ssh_args(optarg); |
|
break; |
break; |
case '1': |
case '1': |
use_ssh1 = 1; |
sshver = 1; |
if (sftp_server == NULL) |
if (sftp_server == NULL) |
sftp_server = _PATH_SFTP_SERVER; |
sftp_server = _PATH_SFTP_SERVER; |
break; |
break; |
|
|
fprintf(stderr, "Missing username\n"); |
fprintf(stderr, "Missing username\n"); |
usage(); |
usage(); |
} |
} |
make_ssh_args("-l"); |
addargs(&args, "-l%s",userhost); |
make_ssh_args(userhost); |
|
} |
} |
|
|
host = cleanhostname(host); |
host = cleanhostname(host); |
|
|
usage(); |
usage(); |
} |
} |
|
|
/* Set up logging and debug '-d' arguments to ssh */ |
|
ll = SYSLOG_LEVEL_INFO; |
|
switch (debug_level) { |
|
case 1: |
|
ll = SYSLOG_LEVEL_DEBUG1; |
|
make_ssh_args("-v"); |
|
break; |
|
case 2: |
|
ll = SYSLOG_LEVEL_DEBUG2; |
|
make_ssh_args("-v"); |
|
make_ssh_args("-v"); |
|
break; |
|
case 3: |
|
ll = SYSLOG_LEVEL_DEBUG3; |
|
make_ssh_args("-v"); |
|
make_ssh_args("-v"); |
|
make_ssh_args("-v"); |
|
break; |
|
} |
|
|
|
if (compress_flag) |
|
make_ssh_args("-C"); |
|
|
|
log_init(argv[0], ll, SYSLOG_FACILITY_USER, 1); |
log_init(argv[0], ll, SYSLOG_FACILITY_USER, 1); |
|
addargs(&args, "-oProtocol %d", sshver); |
|
|
make_ssh_args(host); |
/* no subsystem if the server-spec contains a '/' */ |
|
if (sftp_server == NULL || strchr(sftp_server, '/') == NULL) |
|
addargs(&args, "-s"); |
|
|
|
addargs(&args, "%s", host); |
|
addargs(&args, "%s", (sftp_server != NULL ? sftp_server : "sftp")); |
|
args.list[0] = ssh_program; |
|
|
fprintf(stderr, "Connecting to %s...\n", host); |
fprintf(stderr, "Connecting to %s...\n", host); |
|
|
connect_to_server(make_ssh_args(NULL), &in, &out, &sshpid); |
connect_to_server(args.list, &in, &out, &sshpid); |
|
|
interactive_loop(in, out, file1, file2); |
interactive_loop(in, out, file1, file2); |
|
|