+ my $file_to_close = 3;
+ my $smbclient_stdout_src = Amanda::MainLoop::fd_source($smbclient_rdr,
+ $G_IO_IN|$G_IO_HUP|$G_IO_ERR);
+ my $smbclient_stderr_src = Amanda::MainLoop::fd_source($smbclient_err,
+ $G_IO_IN|$G_IO_HUP|$G_IO_ERR);
+ my $index_tar_stdout_src = Amanda::MainLoop::fd_source($index_rdr,
+ $G_IO_IN|$G_IO_HUP|$G_IO_ERR);
+
+ my $smbclient_stdout_done = 0;
+ my $smbclient_stderr_done = 0;
+ my $data_size = 0;
+ my $nb_files = 0;
+ $smbclient_stdout_src->set_callback(sub {
+ my $buf;
+ my $blocksize = -1;
+ $blocksize = sysread($smbclient_rdr, $buf, 32768);
+ if (!$blocksize) {
+ $file_to_close--;
+ $smbclient_stdout_src->remove();
+ $smbclient_stdout_done = 1;
+ if ($smbclient_stderr_done) {
+ if ($data_size == 0 and $nb_files == 0 and $size == 0) {
+ $self->send_empty_tar_file(*STDOUT, $index_wtr);
+ }
+ close($index_wtr);
+ close(STDOUT);
+ }
+ close($smbclient_rdr);
+ Amanda::MainLoop::quit() if $file_to_close == 0;
+ return;
+ }
+ $data_size += $blocksize;
+ syswrite(STDOUT, $buf, $blocksize);
+ syswrite($index_wtr, $buf, $blocksize);
+ });
+
+ $smbclient_stderr_src->set_callback(sub {
+ my $line = <$smbclient_err>;
+ if (!defined $line) {
+ $file_to_close--;
+ $smbclient_stderr_src->remove();
+ $smbclient_stderr_done = 1;
+ if ($smbclient_stdout_done) {
+ if ($data_size == 0 and $nb_files == 0 and $size == 0) {
+ $self->send_empty_tar_file(*STDOUT, $index_wtr);
+ }
+ close($index_wtr);
+ close(STDOUT);
+ }
+ close ($smbclient_err);
+ Amanda::MainLoop::quit() if $file_to_close == 0;
+ return;
+ }
+ chomp $line;
+ debug("stderr: " . $line);
+ return if $line =~ /^Domain=/;
+ return if $line =~ /^tarmode is now /;
+ if ($line =~ /dumped (\d+) files and directories/) {
+ $nb_files = $1;
+ return;
+ }