summaryrefslogtreecommitdiffstats
path: root/maildir/loginexec.c
diff options
context:
space:
mode:
Diffstat (limited to 'maildir/loginexec.c')
-rw-r--r--maildir/loginexec.c43
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
+}