diff options
Diffstat (limited to 'maildir/loginexec.c')
| -rw-r--r-- | maildir/loginexec.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/maildir/loginexec.c b/maildir/loginexec.c new file mode 100644 index 0000000..d3e2391 --- /dev/null +++ b/maildir/loginexec.c @@ -0,0 +1,43 @@ +#include "loginexec.h" +#include <sys/types.h> +#if HAVE_SYS_STAT_H +#include <sys/stat.h> +#endif +#include <string.h> +#include <stdio.h> +#if HAVE_UNISTD_H +#include <unistd.h> +#endif +#if HAVE_SYS_WAIT_H +#include <sys/wait.h> +#endif +#include <stdlib.h> + +#define LOGINEXEC_FILE "loginexec" + +void maildir_loginexec(void) +{ +#ifdef LOGINEXEC_FILE +struct stat buf; +pid_t pid; +int waitstat; + + if (stat(LOGINEXEC_FILE, &buf) != 0 || (buf.st_mode & S_IXUSR) == 0) + return; + + while ((pid=fork()) == -1) + { + sleep(5); + } + if (pid == 0) + { + execl("./" LOGINEXEC_FILE, LOGINEXEC_FILE, (char *)0); + perror("Failed to exec " LOGINEXEC_FILE); + exit(1); + } + while (wait(&waitstat) != pid) + ; + if (WIFEXITED(waitstat) && WEXITSTATUS(waitstat) == 0) + unlink(LOGINEXEC_FILE); +#endif +} |
