+sub send_file($$$) {
+ my ($self, $fh, $size) = @_;
+ my $sk = $self->{"sk"};
+ local $SIG{'PIPE'} = 'ignore';
+ while ($size) {
+ my $l = ($size < 4096 ? $size : 4096);
+ my $buf = "";
+ if ($fh->read($buf, $l) != $l) {
+ $self->err("File shrunk during upload");
+ return undef;
+ }
+ $sk->write($buf, $l);
+ if ($sk->error) {
+ $self->err("Connection broken");
+ return undef;
+ }
+ $size -= $l;
+ }
+ return $self->reply;
+}
+
+sub write_history($$$$$) {
+ my ($self, $task, $part, $ext, $filename) = @_;
+ my $hist = $self->{"History"};
+ -d $hist or mkdir $hist or return "Unable to create $hist: $!";
+ my $now = POSIX::strftime("%H:%M:%S", localtime(time));
+ my $maybe_part = ($part eq $task) ? "" : ":$part";
+ my $name = "$hist/$now-$task$maybe_part.$ext";
+ $self->log("Backing up to $name");
+ `cp "$filename" "$name"`;
+ return "Unable to back up $filename as $name" if $?;
+ return undef;
+}
+