=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/sftp.c,v retrieving revision 1.56.2.3 retrieving revision 1.57 diff -u -r1.56.2.3 -r1.57 --- src/usr.bin/ssh/sftp.c 2005/09/02 03:45:00 1.56.2.3 +++ src/usr.bin/ssh/sftp.c 2004/11/05 12:19:56 1.57 @@ -16,7 +16,7 @@ #include "includes.h" -RCSID("$OpenBSD: sftp.c,v 1.56.2.3 2005/09/02 03:45:00 brad Exp $"); +RCSID("$OpenBSD: sftp.c,v 1.57 2004/11/05 12:19:56 djm Exp $"); #include #include @@ -145,10 +145,8 @@ static void killchild(int signo) { - if (sshpid > 1) { + if (sshpid > 1) kill(sshpid, SIGTERM); - waitpid(sshpid, NULL, 0); - } _exit(1); } @@ -157,11 +155,9 @@ cmd_interrupt(int signo) { const char msg[] = "\rInterrupt \n"; - int olderrno = errno; write(STDERR_FILENO, msg, sizeof(msg) - 1); interrupted = 1; - errno = olderrno; } static void @@ -261,7 +257,7 @@ return (xstrdup(path)); len = strlen(strip); - if (strncmp(path, strip, len) == 0) { + if (strip != NULL && strncmp(path, strip, len) == 0) { if (strip[len - 1] != '/' && path[len] == '/') len++; return (xstrdup(path + len)); @@ -352,7 +348,7 @@ /* Check for flags */ if (cp++[0] == '-') { - for (; strchr(WHITESPACE, *cp) == NULL; cp++) { + for(; strchr(WHITESPACE, *cp) == NULL; cp++) { switch (*cp) { case 'l': *lflag &= ~VIEW_FLAGS; @@ -399,7 +395,7 @@ { const char *cp = *cpp, *end; char quot; - u_int i, j; + int i, j; cp += strspn(cp, WHITESPACE); if (!*cp) { @@ -659,15 +655,14 @@ static int do_ls_dir(struct sftp_conn *conn, char *path, char *strip_path, int lflag) { - int n; - u_int c = 1, colspace = 0, columns = 1; + int n, c = 1, colspace = 0, columns = 1; SFTP_DIRENT **d; if ((n = do_readdir(conn, path, &d)) != 0) return (n); if (!(lflag & LS_SHORT_VIEW)) { - u_int m = 0, width = 80; + int m = 0, width = 80; struct winsize ws; char *tmp; @@ -743,15 +738,13 @@ int lflag) { glob_t g; - u_int i, c = 1, colspace = 0, columns = 1; - Attrib *a = NULL; + int i, c = 1, colspace = 0, columns = 1; + Attrib *a; memset(&g, 0, sizeof(g)); if (remote_glob(conn, path, GLOB_MARK|GLOB_NOCHECK|GLOB_BRACE, - NULL, &g) || (g.gl_pathc && !g.gl_matchc)) { - if (g.gl_pathc) - globfree(&g); + NULL, &g)) { error("Can't ls: \"%s\" not found", path); return (-1); } @@ -760,26 +753,24 @@ goto out; /* - * If the glob returns a single match and it is a directory, - * then just list its contents. + * If the glob returns a single match, which is the same as the + * input glob, and it is a directory, then just list its contents */ - if (g.gl_matchc == 1) { - if ((a = do_lstat(conn, g.gl_pathv[0], 1)) == NULL) { + if (g.gl_pathc == 1 && + strncmp(path, g.gl_pathv[0], strlen(g.gl_pathv[0]) - 1) == 0) { + if ((a = do_lstat(conn, path, 1)) == NULL) { globfree(&g); return (-1); } if ((a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) && S_ISDIR(a->perm)) { - int err; - - err = do_ls_dir(conn, g.gl_pathv[0], strip_path, lflag); globfree(&g); - return (err); + return (do_ls_dir(conn, path, strip_path, lflag)); } } if (!(lflag & LS_SHORT_VIEW)) { - u_int m = 0, width = 80; + int m = 0, width = 80; struct winsize ws; /* Count entries for sort and find longest filename */ @@ -794,7 +785,7 @@ colspace = width / columns; } - for (i = 0; g.gl_pathv[i] && !interrupted; i++, a = NULL) { + for (i = 0; g.gl_pathv[i] && !interrupted; i++) { char *fname; fname = path_strip(g.gl_pathv[i], strip_path); @@ -811,8 +802,7 @@ * that the server returns as well as the filenames. */ memset(&sb, 0, sizeof(sb)); - if (a == NULL) - a = do_lstat(conn, g.gl_pathv[i], 1); + a = do_lstat(conn, g.gl_pathv[i], 1); if (a != NULL) attrib_to_stat(a, &sb); lname = ls_file(fname, &sb, 1); @@ -1230,7 +1220,7 @@ char *dir = NULL; char cmd[2048]; struct sftp_conn *conn; - int err, interactive; + int err; EditLine *el = NULL; History *hl = NULL; HistEvent hev; @@ -1266,11 +1256,8 @@ if (remote_is_dir(conn, dir) && file2 == NULL) { printf("Changing to: %s\n", dir); snprintf(cmd, sizeof cmd, "cd \"%s\"", dir); - if (parse_dispatch_command(conn, cmd, &pwd, 1) != 0) { - xfree(dir); - xfree(pwd); + if (parse_dispatch_command(conn, cmd, &pwd, 1) != 0) return (-1); - } } else { if (file2 == NULL) snprintf(cmd, sizeof cmd, "get %s", dir); @@ -1289,7 +1276,6 @@ setvbuf(stdout, NULL, _IOLBF, 0); setvbuf(infile, NULL, _IOLBF, 0); - interactive = !batchmode && isatty(STDIN_FILENO); err = 0; for (;;) { char *cp; @@ -1299,24 +1285,16 @@ signal(SIGINT, SIG_IGN); if (el == NULL) { - if (interactive) - printf("sftp> "); + printf("sftp> "); if (fgets(cmd, sizeof(cmd), infile) == NULL) { - if (interactive) - printf("\n"); + printf("\n"); break; } - if (!interactive) { /* Echo command */ - printf("sftp> %s", cmd); - if (strlen(cmd) > 0 && - cmd[strlen(cmd) - 1] != '\n') - printf("\n"); - } + if (batchmode) /* Echo command */ + printf("%s", cmd); } else { - if ((line = el_gets(el, &count)) == NULL || count <= 0) { - printf("\n"); + if ((line = el_gets(el, &count)) == NULL || count <= 0) break; - } history(hl, &hev, H_ENTER, line); if (strlcpy(cmd, line, sizeof(cmd)) >= sizeof(cmd)) { fprintf(stderr, "Error: input line too long\n"); @@ -1338,9 +1316,6 @@ } xfree(pwd); - if (el != NULL) - el_end(el); - /* err == 1 signifies normal "quit" exit */ return (err >= 0 ? 0 : -1); } @@ -1470,11 +1445,10 @@ /* Allow "-" as stdin */ if (strcmp(optarg, "-") != 0 && - (infile = fopen(optarg, "r")) == NULL) + (infile = fopen(optarg, "r")) == NULL) fatal("%s (%s).", strerror(errno), optarg); showprogress = 0; batchmode = 1; - addargs(&args, "-obatchmode yes"); break; case 'P': sftp_direct = optarg;