aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2022-02-08 01:55:13 -0500
committerJesse Luehrs <doy@tozt.net>2022-02-08 01:55:13 -0500
commite0223d8b5031e179462b250a8ab04315057e740a (patch)
tree360e2ffd2be82bc30f8d2ae14afbdbd3df27a10c
parentf3aa73f900fc629325d2d465a7ca30b5f6b9a8e6 (diff)
downloadmbsyncloop-e0223d8b5031e179462b250a8ab04315057e740a.tar.gz
mbsyncloop-e0223d8b5031e179462b250a8ab04315057e740a.zip
improve goimapnotify subprocess handling
-rwxr-xr-xmbsyncloop49
1 files changed, 32 insertions, 17 deletions
diff --git a/mbsyncloop b/mbsyncloop
index 10abc9e..8399d36 100755
--- a/mbsyncloop
+++ b/mbsyncloop
@@ -10,33 +10,48 @@ my $password_command = "rbw get mail.tozt.net doy\@tozt.net";
my $mbsync_config = "$ENV{HOME}/.mbsyncloop";
my $goimapnotify_config = "$ENV{HOME}/.config/imapnotify/tozt.conf";
-my $pw = `$password_command`;
-if ($?) {
- die "failed to fetch password: command returned $?";
-}
-
-open my $goimapnotify, '-|', "sh", "-c", "while true; do goimapnotify --conf '$goimapnotify_config' 2>&1; done" or die "couldn't run goimapnotify: $!";
-
-my ($pw_pipe, $pid);
+my ($pw_pipe, $pw_pid, $goimapnotify_pid);
sub cleanup {
unlink($pw_pipe) if $pw_pipe;
- kill KILL => $pid if $pid;
+ kill KILL => -$pw_pid if $pw_pid;
+ kill KILL => -$goimapnotify_pid if $goimapnotify_pid;
}
$SIG{INT} = $SIG{TERM} = sub { cleanup; exit };
END { cleanup }
-$pw_pipe = make_pw_pipe();
+my $pw = `$password_command`;
+if ($?) {
+ die "failed to fetch password: command returned $?";
+}
+
+pipe(my $goimapnotify_r, my $goimapnotify_w) or die "failed to create unnamed pipe: $!";
+$goimapnotify_pid = fork;
+die "fork failed: $!" unless defined $goimapnotify_pid;
+if (!$goimapnotify_pid) {
+ setpgrp(0, 0);
+ close $goimapnotify_r;
+ while (1) {
+ open my $fh, '-|', 'goimapnotify', '--conf', $goimapnotify_config or die "couldn't run goimapnotify: $!";
+ while (<$fh>) {
+ $goimapnotify_w->print("N\n");
+ $goimapnotify_w->flush;
+ }
+ }
+}
+close $goimapnotify_w;
-$pid = fork;
-die "fork failed: $!" unless defined $pid;
-if (!$pid) {
+$pw_pipe = make_pw_pipe();
+$pw_pid = fork;
+die "fork failed: $!" unless defined $pw_pid;
+if (!$pw_pid) {
$SIG{PIPE} = 'IGNORE';
+ setpgrp(0, 0);
+ open my $fh, '>', $pw_pipe or die "couldn't open $pw_pipe";
while (1) {
- open my $fh, '>', $pw_pipe or die "couldn't open $pw_pipe";
$fh->print("$pw\n");
- close $fh;
+ $fh->flush;
}
}
@@ -67,7 +82,7 @@ sub sync {
sub idle {
my ($max_delay) = @_;
my $rin = '';
- vec($rin, fileno($goimapnotify), 1) = 1;
+ vec($rin, fileno($goimapnotify_r), 1) = 1;
my $ready = select(my $rout = $rin, undef, undef, $max_delay);
die "failed to read goimapnotify output: $!" if $ready == -1;
if ($ready) {
@@ -75,7 +90,7 @@ sub idle {
my $ready = select(my $rout = $rin, undef, undef, 0.01);
die "failed to read goimapnotify output: $!" if $ready == -1;
last unless $ready;
- sysread $goimapnotify, my $data, 4096;
+ sysread $goimapnotify_r, my $data, 4096;
}
return 1;
}