aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cerberus.c26
-rw-r--r--src/security.c4
2 files changed, 29 insertions, 1 deletions
diff --git a/src/cerberus.c b/src/cerberus.c
index 418ec8a..3a7b9af 100644
--- a/src/cerberus.c
+++ b/src/cerberus.c
@@ -20,6 +20,8 @@
#include <string.h>
#include <unistd.h>
+#include <signal.h>
+#include <errno.h>
#define HOOK_LOGIN 0
@@ -28,6 +30,9 @@
#define HOOK_VERIFY 3
+#define close(fd) while (((close)(fd) < 0) && (errno == EINTR))
+
+
#ifdef USE_TTY_GROUP
/**
@@ -60,6 +65,25 @@ char* passphrase = NULL;
/**
+ * Sleep without letting the user stop it
+ *
+ * @param s The number of seconds to sleep
+ */
+static void xsleep(unsigned int s)
+{
+ sigset_t sigset;
+
+ sigfillset(&sigset);
+ sigprocmask(SIG_BLOCK, &sigset, NULL);
+
+ while ((s = sleep(s)));
+
+ sigemptyset(&sigset);
+ sigprocmask(SIG_BLOCK, &sigset, NULL);
+}
+
+
+/**
* Mane method
*
* @param argc The number of command line arguments
@@ -356,7 +380,7 @@ void do_login(int argc, char** argv)
{
preexit();
fork_exec_wait_hook(HOOK_DENIED, argc, argv);
- sleep(FAILURE_SLEEP);
+ xsleep(FAILURE_SLEEP);
_exit(1);
}
diff --git a/src/security.c b/src/security.c
index 180e2f3..ff67d95 100644
--- a/src/security.c
+++ b/src/security.c
@@ -23,6 +23,7 @@
#include <fcntl.h>
#include <signal.h>
#include <stropts.h>
+#include <errno.h>
#if defined(OWN_VCSA) || defined(OWN_VCS)
#include <string.h>
#include <linux/vt.h>
@@ -33,6 +34,9 @@
#include "security.h"
+#define close(fd) while (((close)(fd) < 0) && (errno == EINTR))
+
+
static void fail(const char* str)
{
perror(str);