]> git.g-eek.se Git - interimap.git/commitdiff
Exit gracefully when catching a SIGHUP.
authorGuilhem Moulin <guilhem@fripost.org>
Fri, 24 Jul 2015 14:55:21 +0000 (16:55 +0200)
committerGuilhem Moulin <guilhem@fripost.org>
Fri, 24 Jul 2015 15:35:16 +0000 (17:35 +0200)
imapsync
lib/Net/IMAP/Sync.pm

index f80106d608ed5b557c13e4694d6333fd9754affc..ea6c4e88ce0c34143b2e138ee1a92125be0d5f21 100755 (executable)
--- a/imapsync
+++ b/imapsync
@@ -69,17 +69,16 @@ my ($DBFILE, $LOCKFILE);
 
     $LOCKFILE = $DBFILE =~ s/([^\/]+)\z/.$1.lck/r;
 }
-my ($DBH, $IMAP);
-
+my $DBH;
 
 # Clean after us
-sub clean() {
-    print STDERR "Cleaning...\n" if $CONFIG{debug};
+sub cleanup() {
+    print STDERR "Cleaning up...\n" if $CONFIG{debug};
     unlink $LOCKFILE if defined $LOCKFILE and -f $LOCKFILE;
-    undef $_ foreach grep defined, map {$IMAP->{$_}->{client}} keys %$IMAP;
     $DBH->disconnect() if defined $DBH;
 }
-$SIG{$_} = sub { clean(); die "$!\n"; } foreach qw/INT TERM/;
+$SIG{$_} = sub { cleanup(); print STDERR "$!\n"; exit 1; } foreach qw/INT TERM/;
+$SIG{$_} = sub { cleanup(); print STDERR "$!\n"; exit 0; } foreach qw/HUP/;
 
 
 #############################################################################
@@ -176,6 +175,7 @@ sub msg($@) {
 #############################################################################
 # Connect to the local and remote IMAP servers
 
+my $IMAP;
 foreach my $name (qw/local remote/) {
     my %config = %{$CONF->{$name}};
     $config{$_} = $CONFIG{$_} foreach keys %CONFIG;
@@ -934,8 +934,11 @@ while(1) {
         }
     }
     # clean state!
-    exit 0 if $CONFIG{oneshot} or $CONFIG{check};
+    if ($CONFIG{oneshot} or $CONFIG{check}) {
+        cleanup();
+        exit 0;
+    }
     wait_notifications(900);
 }
 
-END { clean (); }
+END { cleanup(); }
index bb99dcbe15c9a1f9920ea235d31269f141285aa0..b864db86475b593b36af48f7047d83f86a848bdb 100644 (file)
@@ -387,8 +387,9 @@ sub new($%) {
 # Close handles when the Net::IMAP::Sync object is destroyed.
 sub DESTROY($) {
     my $self = shift;
-    foreach (qw/STDIN STDOUT/) {
-        $self->{$_}->close() if defined $self->{$_} and $self->{$_}->opened();
+    if (defined $self->{STDIN}  and $self->{STDIN}->opened() and
+        defined $self->{STDOUT} and $self->{STDOUT}->opened()) {
+        $self->logout();
     }
     $self->{STDERR}->close() if defined $self->{STDERR} and $self->{STDERR}->opened()
                                 and $self->{STDERR} ne \*STDERR;
@@ -1394,6 +1395,9 @@ sub _resp($$;$$$) {
 
     if (s/\A\* //) {
         if (s/\ABYE //) {
+            foreach (qw/STDIN STDOUT/) {
+                $self->{$_}->close() if defined $self->{$_} and $self->{$_}->opened();
+            }
             exit 0;
         }
         elsif (s/\A(?:OK|NO|BAD) //) {