adam at skullslayer.rod.org
2006-May-14 09:02 UTC
scp patch to delete source files after copy
At work we have a large collection of scripts to move log and config files around. These depend on commercial (F-Secure) ssh/scp, as it supports the -u option to delete the source file after (successful) copying. That is the sole reason we can't run openssh on our 150+ unix boxes. I have attached a patch below, which adds the -u option to delete the source file after copying, provided there were no errors. I would appreciate any feedback on this patch, with an aim to seeing it included in future releases. Adam *** scp.c 2006-01-31 22:11:38.000000000 +1100 --- scp.c.new 2006-05-14 18:11:14.000000000 +1000 *************** *** 99,104 **** --- 99,107 ---- /* This is set to zero if the progressmeter is not desired. */ int showprogress = 1; + /* Delete the source after copying. */ + int delete_source = 0; + /* This is the program to execute for the secured connection. ("ssh" or -S) */ char *ssh_program = _PATH_SSH_PROGRAM; *************** *** 278,284 **** addargs(&args, "-oClearAllForwardings yes"); fflag = tflag = 0; ! while ((ch = getopt(argc, argv, "dfl:prtvBCc:i:P:q1246S:o:F:")) != -1) switch (ch) { /* User-visible flags. */ case '1': --- 281,287 ---- addargs(&args, "-oClearAllForwardings yes"); fflag = tflag = 0; ! while ((ch = getopt(argc, argv, "dfl:prtuvBCc:i:P:q1246S:o:F:")) != -1) switch (ch) { /* User-visible flags. */ case '1': *************** *** 315,320 **** --- 318,326 ---- case 'S': ssh_program = xstrdup(optarg); break; + case 'u': + delete_source = 1; + break; case 'v': addargs(&args, "-v"); verbose_mode = 1; *************** *** 373,381 **** remin = remout = -1; do_cmd_pid = -1; /* Command to be executed on remote system using "ssh". */ ! (void) snprintf(cmd, sizeof cmd, "scp%s%s%s%s", verbose_mode ? " -v" : "", iamrecursive ? " -r" : "", pflag ? " -p" : "", targetshouldbedirectory ? " -d" : ""); (void) signal(SIGPIPE, lostconn); --- 379,388 ---- remin = remout = -1; do_cmd_pid = -1; /* Command to be executed on remote system using "ssh". */ ! (void) snprintf(cmd, sizeof cmd, "scp%s%s%s%s%s", verbose_mode ? " -v" : "", iamrecursive ? " -r" : "", pflag ? " -p" : "", + delete_source ? " -u" : "", targetshouldbedirectory ? " -d" : ""); (void) signal(SIGPIPE, lostconn); *************** *** 651,659 **** haderr = errno; fd = -1; } ! if (!haderr) (void) atomicio(vwrite, remout, "", 1); ! else run_err("%s: %s", name, strerror(haderr)); (void) response(); } --- 658,672 ---- haderr = errno; fd = -1; } ! if (!haderr) { ! if (delete_source) { ! if (verbose_mode) { ! fprintf(stderr, "Deleting source: %s\n", name); ! } ! unlink(name); ! } (void) atomicio(vwrite, remout, "", 1); ! } else run_err("%s: %s", name, strerror(haderr)); (void) response(); } *************** *** 1084,1090 **** usage(void) { (void) fprintf(stderr, ! "usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]\n" " [-l limit] [-o ssh_option] [-P port] [-S program]\n" " [[user@]host1:]file1 [...] [[user@]host2:]file2\n"); exit(1); --- 1097,1103 ---- usage(void) { (void) fprintf(stderr, ! "usage: scp [-1246BCpqruv] [-c cipher] [-F ssh_config] [-i identity_file]\n" " [-l limit] [-o ssh_option] [-P port] [-S program]\n" " [[user@]host1:]file1 [...] [[user@]host2:]file2\n"); exit(1); *** scp.1 2006-01-20 11:31:47.000000000 +1100 --- scp.1.new 2006-05-14 18:59:35.000000000 +1000 *************** *** 20,26 **** .Sh SYNOPSIS .Nm scp .Bk -words ! .Op Fl 1246BCpqrv .Op Fl c Ar cipher .Op Fl F Ar ssh_config .Op Fl i Ar identity_file --- 20,26 ---- .Sh SYNOPSIS .Nm scp .Bk -words ! .Op Fl 1246BCpqruv .Op Fl c Ar cipher .Op Fl F Ar ssh_config .Op Fl i Ar identity_file *************** *** 188,193 **** --- 188,195 ---- The program must understand .Xr ssh 1 options. + .It Fl u + Deletes the source file after copying. .It Fl v Verbose mode. Causes
adam at skullslayer.rod.org
2006-May-16 08:22 UTC
scp patch to delete source files after copy
On Sun, May 14, 2006 at 07:02:04PM +1000, adam at skullslayer.rod.org wrote:> > I have attached a patch below, which adds the -u option to > delete the source file after copying, provided there were no > errors. I would appreciate any feedback on this patch, with > an aim to seeing it included in future releases.After thinking more about my patch, I have decided that this is not the best way to go about it. The commercial scp client is able to delete files on an openssh server, so obviously relying on the -u support on the server end is not correct. I will think about how to do it, then submit a new patch. Adam