--- maildirlock.c 2008-08-04 14:03:11.000000000 -0500 +++ maildirlock-new.c 2008-08-04 14:02:55.000000000 -0500 @@ -46,6 +46,7 @@ int main(int argc, const char *argv[]) struct dotlock *dotlock; unsigned int timeout; pid_t pid, parent_pid; + int trigger[2]; if (argc != 3) { fprintf(stderr, "Usage: maildirlock \n" @@ -53,6 +54,10 @@ int main(int argc, const char *argv[]) return 1; } parent_pid = getpid(); + if (pipe(trigger) != 0) { + fprintf(stderr, "pipe() failed: %m"); + return 1; + } pid = fork(); if (pid == (pid_t)-1) { @@ -69,10 +74,11 @@ int main(int argc, const char *argv[]) lib_signals_set_handler(SIGCHLD, TRUE, sig_die, NULL); if (pid != 0) { - /* master - wait for the child process to finish locking */ - io_loop_run(ioloop); - if (!success) + char junk; + if (read(trigger[0], &junk, 1) != 1) { + fprintf(stderr, "read() failed: %m"); return 1; + } printf("%s", dec2str(pid)); return 0; } @@ -85,9 +91,9 @@ int main(int argc, const char *argv[]) if (maildir_lock(argv[1], timeout, &dotlock) <= 0) return 1; - /* locked - send a */ - if (kill(parent_pid, SIGTERM) < 0) - i_fatal("kill(parent, SIGTERM) failed: %m"); + /* locked - send a byte */ + write(trigger[1], "", 1); + io_loop_run(ioloop); file_dotlock_delete(&dotlock);