]> andersk Git - openssh.git/blobdiff - scp.c
- (stevesk) logintest.c: fix for systems without __progname
[openssh.git] / scp.c
diff --git a/scp.c b/scp.c
index 26d4c2daa4e5a1b889f652d6e22830f3a9523895..bd2c5c751736f8cb9983867a4620bcafa10a0744 100644 (file)
--- a/scp.c
+++ b/scp.c
@@ -14,8 +14,8 @@
  * called by a name other than "ssh" or "Secure Shell".
  */
 /*
- * Copyright (c) 1999 Theo de Raadt. All rights reserved.
- * Copyright (c) 1999 Aaron Campbell. All rights reserved.
+ * Copyright (c) 1999 Theo de Raadt.  All rights reserved.
+ * Copyright (c) 1999 Aaron Campbell.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: scp.c,v 1.53 2001/02/04 23:56:22 deraadt Exp $");
+RCSID("$OpenBSD: scp.c,v 1.64 2001/03/28 20:04:38 stevesk Exp $");
 
 #include "xmalloc.h"
 #include "atomicio.h"
 #include "pathnames.h"
 #include "log.h"
+#include "misc.h"
 
 #ifdef HAVE___PROGNAME
 extern char *__progname;
@@ -201,8 +202,6 @@ typedef struct {
        char *buf;
 } BUF;
 
-extern int iamremote;
-
 BUF *allocbuf(BUF *, int, int);
 char *colon(char *);
 void lostconn(int);
@@ -224,6 +223,7 @@ void rsource(char *, struct stat *);
 void sink(int, char *[]);
 void source(int, char *[]);
 void tolocal(int, char *[]);
+char *cleanhostname(char *);
 void toremote(char *, int, char *[]);
 void usage(void);
 
@@ -292,7 +292,6 @@ main(argc, argv)
                        iamremote = 1;
                        tflag = 1;
                        break;
-               case '?':
                default:
                        usage();
                }
@@ -326,7 +325,8 @@ main(argc, argv)
 
        remin = remout = -1;
        /* Command to be executed on remote system using "ssh". */
-       (void) sprintf(cmd, "scp%s%s%s%s", verbose_mode ? " -v" : "",
+       (void) snprintf(cmd, sizeof cmd, "scp%s%s%s%s",
+           verbose_mode ? " -v" : "",
            iamrecursive ? " -r" : "", pflag ? " -p" : "",
            targetshouldbedirectory ? " -d" : "");
 
@@ -397,16 +397,18 @@ toremote(targ, argc, argv)
                                        suser = pwd->pw_name;
                                else if (!okname(suser))
                                        continue;
-                               sprintf(bp,
-                                   "%s%s -x -o'FallBackToRsh no' -n -l %s %s %s %s '%s%s%s:%s'",
+                               snprintf(bp, len,
+                                   "%s%s -x -o'FallBackToRsh no' -n "
+                                   "-l %s %s %s %s '%s%s%s:%s'",
                                    ssh_program, verbose_mode ? " -v" : "",
                                    suser, host, cmd, src,
                                    tuser ? tuser : "", tuser ? "@" : "",
                                    thost, targ);
                        } else {
                                host = cleanhostname(argv[i]);
-                               sprintf(bp,
-                                   "exec %s%s -x -o'FallBackToRsh no' -n %s %s %s '%s%s%s:%s'",
+                               snprintf(bp, len,
+                                   "exec %s%s -x -o'FallBackToRsh no' -n %s "
+                                   "%s %s '%s%s%s:%s'",
                                    ssh_program, verbose_mode ? " -v" : "",
                                    host, cmd, src,
                                    tuser ? tuser : "", tuser ? "@" : "",
@@ -420,7 +422,7 @@ toremote(targ, argc, argv)
                        if (remin == -1) {
                                len = strlen(targ) + CMDNEEDS + 20;
                                bp = xmalloc(len);
-                               (void) sprintf(bp, "%s -t %s", cmd, targ);
+                               (void) snprintf(bp, len, "%s -t %s", cmd, targ);
                                host = cleanhostname(thost);
                                if (do_cmd(host, tuser, bp, &remin,
                                    &remout, argc) < 0)
@@ -447,7 +449,7 @@ tolocal(argc, argv)
                        len = strlen(_PATH_CP) + strlen(argv[i]) +
                            strlen(argv[argc - 1]) + 20;
                        bp = xmalloc(len);
-                       (void) sprintf(bp, "exec %s%s%s %s %s", _PATH_CP,
+                       (void) snprintf(bp, len, "exec %s%s%s %s %s", _PATH_CP,
                            iamrecursive ? " -r" : "", pflag ? " -p" : "",
                            argv[i], argv[argc - 1]);
                        if (verbose_mode)
@@ -474,7 +476,7 @@ tolocal(argc, argv)
                host = cleanhostname(host);
                len = strlen(src) + CMDNEEDS + 20;
                bp = xmalloc(len);
-               (void) sprintf(bp, "%s -f %s", cmd, src);
+               (void) snprintf(bp, len, "%s -f %s", cmd, src);
                if (do_cmd(host, suser, bp, &remin, &remout, argc) < 0) {
                        (void) xfree(bp);
                        ++errs;
@@ -531,7 +533,7 @@ syserr:                     run_err("%s: %s", name, strerror(errno));
                         * Make it compatible with possible future
                         * versions expecting microseconds.
                         */
-                       (void) sprintf(buf, "T%lu 0 %lu 0\n",
+                       (void) snprintf(buf, sizeof buf, "T%lu 0 %lu 0\n",
                            (u_long) stb.st_mtime,
                            (u_long) stb.st_atime);
                        (void) atomicio(write, remout, buf, strlen(buf));
@@ -539,9 +541,17 @@ syserr:                    run_err("%s: %s", name, strerror(errno));
                                goto next;
                }
 #define        FILEMODEMASK    (S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO)
-               sprintf(buf, "C%04o %lu %s\n",
+#ifdef HAVE_LONG_LONG_INT
+               snprintf(buf, sizeof buf, "C%04o %lld %s\n",
+                   (u_int) (stb.st_mode & FILEMODEMASK),
+                   (long long) stb.st_size, last);
+#else
+               /* XXX: Handle integer overflow? */
+               snprintf(buf, sizeof buf, "C%04o %lu %s\n",
                    (u_int) (stb.st_mode & FILEMODEMASK),
                    (u_long) stb.st_size, last);
+#endif
+
                if (verbose_mode) {
                        fprintf(stderr, "Sending file modes: %s", buf);
                        fflush(stderr);
@@ -608,7 +618,7 @@ rsource(name, statp)
        else
                last++;
        if (pflag) {
-               (void) sprintf(path, "T%lu 0 %lu 0\n",
+               (void) snprintf(path, sizeof(path), "T%lu 0 %lu 0\n",
                    (u_long) statp->st_mtime,
                    (u_long) statp->st_atime);
                (void) atomicio(write, remout, path, strlen(path));
@@ -617,7 +627,7 @@ rsource(name, statp)
                        return;
                }
        }
-       (void) sprintf(path, "D%04o %d %.1024s\n",
+       (void) snprintf(path, sizeof path, "D%04o %d %.1024s\n",
            (u_int) (statp->st_mode & FILEMODEMASK), 0, last);
        if (verbose_mode)
                fprintf(stderr, "Entering directory: %s", path);
@@ -626,7 +636,7 @@ rsource(name, statp)
                closedir(dirp);
                return;
        }
-       while ((dp = readdir(dirp))) {
+       while ((dp = readdir(dirp)) != NULL) {
                if (dp->d_ino == 0)
                        continue;
                if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
@@ -635,7 +645,7 @@ rsource(name, statp)
                        run_err("%s/%s: name too long", name, dp->d_name);
                        continue;
                }
-               (void) sprintf(path, "%s/%s", name, dp->d_name);
+               (void) snprintf(path, sizeof path, "%s/%s", name, dp->d_name);
                vect[0] = path;
                source(1, vect);
        }
@@ -755,7 +765,7 @@ sink(argc, argv)
                if (*cp++ != ' ')
                        SCREWUP("mode not delimited");
 
-               for (size = 0; *cp >= '0' && *cp <= '9';)
+               for (size = 0; isdigit(*cp);)
                        size = size * 10 + (*cp++ - '0');
                if (*cp++ != ' ')
                        SCREWUP("size not delimited");
@@ -765,9 +775,13 @@ sink(argc, argv)
                        size_t need;
 
                        need = strlen(targ) + strlen(cp) + 250;
-                       if (need > cursize)
+                       if (need > cursize) {
+                               if (namebuf)
+                                       xfree(namebuf);
                                namebuf = xmalloc(need);
-                       (void) sprintf(namebuf, "%s%s%s", targ,
+                               cursize = need;
+                       }
+                       (void) snprintf(namebuf, need, "%s%s%s", targ,
                            *targ ? "/" : "", cp);
                        np = namebuf;
                } else
@@ -790,16 +804,18 @@ sink(argc, argv)
                                if (mkdir(np, mode | S_IRWXU) < 0)
                                        goto bad;
                        }
-                       vect[0] = np;
+                       vect[0] = xstrdup(np);
                        sink(1, vect);
                        if (setimes) {
                                setimes = 0;
-                               if (utimes(np, tv) < 0)
+                               if (utimes(vect[0], tv) < 0)
                                        run_err("%s: set times: %s",
-                                               np, strerror(errno));
+                                           vect[0], strerror(errno));
                        }
                        if (mod_flag)
-                               (void) chmod(np, mode);
+                               (void) chmod(vect[0], mode);
+                       if (vect[0])
+                               xfree(vect[0]);
                        continue;
                }
                omode = mode;
@@ -832,7 +848,7 @@ bad:                        run_err("%s: %s", np, strerror(errno));
                                        continue;
                                } else if (j <= 0) {
                                        run_err("%s", j ? strerror(errno) :
-                                               "dropped connection");
+                                           "dropped connection");
                                        exit(1);
                                }
                                amt -= j;
@@ -873,7 +889,7 @@ bad:                        run_err("%s: %s", np, strerror(errno));
                                if (chmod(np, omode))
 #endif /* HAVE_FCHMOD */
                                        run_err("%s: set mode: %s",
-                                               np, strerror(errno));
+                                           np, strerror(errno));
                } else {
                        if (!exists && omode != mode)
 #ifdef HAVE_FCHMOD
@@ -882,7 +898,7 @@ bad:                        run_err("%s: %s", np, strerror(errno));
                                if (chmod(np, omode & ~mask))
 #endif /* HAVE_FCHMOD */
                                        run_err("%s: set mode: %s",
-                                               np, strerror(errno));
+                                           np, strerror(errno));
                }
                if (close(ofd) == -1) {
                        wrerr = YES;
@@ -893,7 +909,7 @@ bad:                        run_err("%s: %s", np, strerror(errno));
                        setimes = 0;
                        if (utimes(np, tv) < 0) {
                                run_err("%s: set times: %s",
-                                       np, strerror(errno));
+                                   np, strerror(errno));
                                wrerr = DISPLAYED;
                        }
                }
@@ -950,8 +966,8 @@ void
 usage()
 {
        (void) fprintf(stderr, "usage: scp "
-           "[-pqrvC46] [-S ssh] [-P port] [-c cipher] [-i identity] f1 f2; or:\n"
-           "       scp [options] f1 ... fn directory\n");
+           "[-pqrvBC46] [-S ssh] [-P port] [-c cipher] [-i identity] f1 f2\n"
+           "   or: scp [options] f1 ... fn directory\n");
        exit(1);
 }
 
@@ -1103,7 +1119,7 @@ updateprogressmeter(int ignore)
 }
 
 int
-foregroundproc()
+foregroundproc(void)
 {
        static pid_t pgrp = -1;
        int ctty_pgrp;
@@ -1165,7 +1181,8 @@ progressmeter(int flag)
                abbrevsize >>= 10;
        }
        snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " %5lu %c%c ",
-           (unsigned long) abbrevsize, prefixes[i], prefixes[i] == ' ' ? ' ' : 'B');
+           (unsigned long) abbrevsize, prefixes[i],
+           prefixes[i] == ' ' ? ' ' : 'B');
 
        timersub(&now, &lastupdate, &wait);
        if (cursize > lastsize) {
@@ -1209,13 +1226,7 @@ progressmeter(int flag)
        atomicio(write, fileno(stdout), buf, strlen(buf));
 
        if (flag == -1) {
-               struct sigaction sa;
-               sa.sa_handler = updateprogressmeter;
-               sigemptyset((sigset_t *)&sa.sa_mask);
-#ifdef SA_RESTART
-               sa.sa_flags = SA_RESTART;
-#endif
-               sigaction(SIGALRM, &sa, NULL);
+               mysignal(SIGALRM, updateprogressmeter);
                alarmtimer(1);
        } else if (flag == 1) {
                alarmtimer(0);
This page took 0.070388 seconds and 4 git commands to generate.