summaryrefslogtreecommitdiff
path: root/dotlock
diff options
context:
space:
mode:
authorSam Roberts <sroberts@uniserve.com>2002-03-25 03:09:35 +0000
committerSam Roberts <sroberts@uniserve.com>2002-03-25 03:09:35 +0000
commit46f1d7b9c07df8a5c331e61521114e08b43c7dec (patch)
tree96204bf59e9d6e9e6f3d83340e5a09754ec226eb /dotlock
parent5d3c07d1b7c118e8dc4591b008256bc3cb76219e (diff)
downloadmailutils-46f1d7b9c07df8a5c331e61521114e08b43c7dec.tar.gz
mailutils-46f1d7b9c07df8a5c331e61521114e08b43c7dec.tar.bz2
Added lock mode MU_LOCK_EXTERNAL which calls an external program to do
the locking. Default is "dotlock", which is setgid mail so can lock in a mailspool that users may not have write permissions to.
Diffstat (limited to 'dotlock')
-rw-r--r--dotlock/dotlock.c45
1 files changed, 39 insertions, 6 deletions
diff --git a/dotlock/dotlock.c b/dotlock/dotlock.c
index 7a17cc456..62a22a76c 100644
--- a/dotlock/dotlock.c
+++ b/dotlock/dotlock.c
@@ -20,16 +20,16 @@
#endif
#include <stdlib.h>
+#ifdef __EXT_QNX
+# undef __EXT_QNX
+#endif
+#include <unistd.h>
#include <argp.h>
#include <mailutils/errno.h>
#include <mailutils/locker.h>
-#define MU_DL_EX_OK 0
-#define MU_DL_EX_ERROR 1
-#define MU_DL_EX_EXIST 3
-
const char *argp_program_version = "GNU dotlock (" PACKAGE ") " VERSION;
const char *argp_program_bug_address = "<bug-mailutils@gnu.org>";
static char doc[] =
@@ -54,6 +54,9 @@ static struct argp_option options[] = {
{"debug", 'd', NULL, 0,
"Print details of failure reasons to stderr", 0},
+ {"test", 'T', "PROGRAM", OPTION_HIDDEN,
+ "Test external dotlocker", 0},
+
{NULL, 0, NULL, 0, NULL, 0}
};
@@ -72,6 +75,7 @@ static int flags;
static int retries;
static int force;
static int debug;
+static const char *program;
static error_t
parse_opt (int key, char *arg, struct argp_state *state)
@@ -86,11 +90,18 @@ parse_opt (int key, char *arg, struct argp_state *state)
unlock = 1;
break;
+ case 'T':
+ /* This options exists only to test whether internal and external
+ locking work correctly/the same. */
+ flags |= MU_LOCKER_EXTERNAL;
+ program = arg;
+ break;
+
case 'r':
if (arg)
{
retries = atoi (arg);
- if (retries == 0)
+ if (retries <= 0)
argp_error (state, "RETRIES must be greater than 0");
}
flags |= MU_LOCKER_RETRY;
@@ -100,7 +111,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
if (arg)
{
force = atoi (arg);
- if (force == 0)
+ if (force <= 0)
argp_error (state, "MINUTES must be greater than 0");
force *= 60;
}
@@ -127,6 +138,13 @@ main (int argc, char *argv[])
{
locker_t locker = 0;
int err = 0;
+ pid_t usergid = getgid();
+ pid_t mailgid = getegid();
+
+ /* Drop permissions during argument parsing. */
+
+ if(setegid(usergid) < 0)
+ return MU_DL_EX_ERROR;
argp_parse (&argp, argc, argv, 0, NULL, NULL);
@@ -145,11 +163,19 @@ main (int argc, char *argv[])
if (retries != 0)
locker_set_retries (locker, retries);
+ if (program != 0)
+ locker_set_external (locker, program);
+
+ if(setegid(mailgid) < 0)
+ return MU_DL_EX_ERROR;
+
if (unlock)
err = locker_remove_lock (locker);
else
err = locker_lock (locker);
+ setegid(usergid);
+
locker_destroy (&locker);
if (debug && err)
@@ -161,6 +187,12 @@ main (int argc, char *argv[])
case 0:
err = MU_DL_EX_OK;
break;
+ case EPERM:
+ err = MU_DL_EX_PERM;
+ break;
+ case MU_ERR_LOCK_NOT_HELD:
+ err = MU_DL_EX_NEXIST;
+ break;
case MU_ERR_LOCK_CONFLICT:
err = MU_DL_EX_EXIST;
break;
@@ -171,3 +203,4 @@ main (int argc, char *argv[])
return err;
}
+

Return to:

Send suggestions and report system problems to the System administrator.