/*
+ * Copyright notice from original mutt:
* Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
* Copyright (C) 1998-2000 Thomas Roessler <roessler@does-not-exist.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
- */
-
-/*
- * This module either be compiled into Mutt, or it can be
- * built as a separate program. For building it
- * separately, define the DL_STANDALONE preprocessor
- * macro.
+ *
+ * This file is part of mutt-ng, see http://www.muttng.org/.
+ * It's licensed under the GNU General Public License,
+ * please see the file GPL in the top level source directory.
*/
#if HAVE_CONFIG_H
#include <getopt.h>
#endif
-#ifdef DL_STANDALONE
-# include "reldate.h"
-#endif
-
#define MAXLINKS 1024 /* maximum link depth */
-#ifdef DL_STANDALONE
-
# define LONG_STRING 1024
# define MAXLOCKATTEMPT 5
-# define strfcpy(A,B,C) strncpy (A,B,C), *(A+(C)-1)=0
-
# ifdef USE_SETGID
# ifdef HAVE_SETEGID
extern int snprintf (char *, size_t, const char *, ...);
# endif
-#else /* DL_STANDALONE */
-
-# ifdef USE_SETGID
-# error Do not try to compile dotlock as a mutt module when requiring egid switching!
-# endif
-
-# include "mutt.h"
-# include "mx.h"
-
-#endif /* DL_STANDALONE */
+#include <lib-lib/str.h>
static int DotlockFlags;
static int Retry = MAXLOCKATTEMPT;
-#ifdef DL_STANDALONE
static char *Hostname;
-#endif
#ifdef USE_SETGID
static gid_t UserGid;
#endif
static int dotlock_deference_symlink (char *, size_t, const char *);
-static int dotlock_prepare (char *, size_t, const char *, int fd);
+static int dotlock_prepare (char *, ssize_t, const char *, int fd);
static int dotlock_check_stats (struct stat *, struct stat *);
static int dotlock_dispatch (const char *, int fd);
-#ifdef DL_STANDALONE
static int dotlock_init_privs (void);
static void usage (const char *);
-#endif
static void dotlock_expand_link (char *, const char *, const char *);
static void BEGIN_PRIVILEGED (void);
static int dotlock_lock (const char *);
-#ifdef DL_STANDALONE
-
#define check_flags(a) if (a & DL_FL_ACTIONS) usage (argv[0])
int main (int argc, char **argv)
}
-#else /* DL_STANDALONE */
-
-/*
- * This function is intended to be invoked from within
- * mutt instead of mx.c's invoke_dotlock ().
- */
-
-int dotlock_invoke (const char *path, int fd, int flags, int retry)
-{
- int currdir;
- int r;
-
- DotlockFlags = flags;
-
- if ((currdir = open (".", O_RDONLY)) == -1)
- return DL_EX_ERROR;
-
- if (!(DotlockFlags & DL_FL_RETRY) || retry)
- Retry = MAXLOCKATTEMPT;
- else
- Retry = 0;
-
- r = dotlock_dispatch (path, fd);
-
- fchdir (currdir);
- close (currdir);
-
- return r;
-}
-
-#endif /* DL_STANDALONE */
-
-
static int dotlock_dispatch (const char *f, int fd)
{
- char realpath[_POSIX_PATH_MAX];
+ char frealpath[_POSIX_PATH_MAX];
/* If dotlock_prepare () succeeds [return value == 0],
* realpath contains the basename of f, and we have
* lengthy comment below.
*/
- if (dotlock_prepare (realpath, sizeof (realpath), f, fd) != 0)
+ if (dotlock_prepare (frealpath, sizeof (frealpath), f, fd) != 0)
return DL_EX_ERROR;
/* Actually perform the locking operation. */
if (DotlockFlags & DL_FL_TRY)
return dotlock_try ();
else if (DotlockFlags & DL_FL_UNLOCK)
- return dotlock_unlock (realpath);
+ return dotlock_unlock (frealpath);
else if (DotlockFlags & DL_FL_UNLINK)
- return dotlock_unlink (realpath);
+ return dotlock_unlink (frealpath);
else /* lock */
- return dotlock_lock (realpath);
+ return dotlock_lock (frealpath);
}
#endif
}
-#ifdef DL_STANDALONE
-
/*
* Usage information.
*
static void usage (const char *av0)
{
- fprintf (stderr, "dotlock [Mutt-ng %s (%s)]\n", VERSION, ReleaseDate);
+ fprintf (stderr, "dotlock [Mutt-ng %s]\n", VERSION);
fprintf (stderr, "usage: %s [-t|-f|-u|-d] [-p] [-r <retries>] file\n", av0);
fputs ("\noptions:"
exit (DL_EX_ERROR);
}
-#endif
-
/*
* Access checking: Let's avoid to lock other users' mail
* spool files if we aren't permitted to read them.
return 0;
}
-static int dotlock_prepare (char *bn, size_t l, const char *f, int _fd)
+static int dotlock_prepare (char *bn, ssize_t l, const char *f, int _fd)
{
struct stat fsb, lsb;
- char realpath[_POSIX_PATH_MAX];
- char *basename, *dirname;
+ char frealpath[_POSIX_PATH_MAX];
+ char *fbasename, *dirname;
char *p;
int fd;
int r;
- if (dotlock_deference_symlink (realpath, sizeof (realpath), f) == -1)
+ if (dotlock_deference_symlink (frealpath, sizeof (frealpath), f) == -1)
return -1;
- if ((p = strrchr (realpath, '/'))) {
+ if ((p = strrchr (frealpath, '/'))) {
*p = '\0';
- basename = p + 1;
- dirname = realpath;
+ fbasename = p + 1;
+ dirname = frealpath;
}
else {
- basename = realpath;
- dirname = ".";
+ fbasename = frealpath;
+ dirname = m_strdup(".");
}
- if (strlen (basename) + 1 > l)
+ if (m_strlen(fbasename) + 1 > l)
return -1;
- strfcpy (bn, basename, l);
+ m_strcpy(bn, l, fbasename);
if (chdir (dirname) == -1)
return -1;
if (_fd != -1)
fd = _fd;
- else if ((fd = open (basename, O_RDONLY)) == -1)
+ else if ((fd = open (fbasename, O_RDONLY)) == -1)
return -1;
r = fstat (fd, &fsb);
if (r == -1)
return -1;
- if (lstat (basename, &lsb) == -1)
+ if (lstat (fbasename, &lsb) == -1)
return -1;
if (dotlock_check_stats (&fsb, &lsb) == -1)
*/
static void
-dotlock_expand_link (char *newpath, const char *path, const char *link)
+dotlock_expand_link (char *newpath, const char *path, const char *flink)
{
const char *lb = NULL;
size_t len;
/* link is full path */
- if (*link == '/') {
- strfcpy (newpath, link, _POSIX_PATH_MAX);
+ if (*flink == '/') {
+ m_strcpy(newpath, _POSIX_PATH_MAX, flink);
return;
}
if ((lb = strrchr (path, '/')) == NULL) {
/* no path in link */
- strfcpy (newpath, link, _POSIX_PATH_MAX);
+ m_strcpy(newpath, _POSIX_PATH_MAX, flink);
return;
}
len = lb - path + 1;
memcpy (newpath, path, len);
- strfcpy (newpath + len, link, _POSIX_PATH_MAX - len);
+ m_strcpy(newpath + len, _POSIX_PATH_MAX - len, flink);
}
static int dotlock_deference_symlink (char *d, size_t l, const char *path)
{
struct stat sb;
- char realpath[_POSIX_PATH_MAX];
+ char frealpath[_POSIX_PATH_MAX];
const char *pathptr = path;
int count = 0;
linkfile[len] = '\0';
dotlock_expand_link (linkpath, pathptr, linkfile);
- strfcpy (realpath, linkpath, sizeof (realpath));
- pathptr = realpath;
+ m_strcpy(frealpath, sizeof(frealpath), linkpath);
+ pathptr = frealpath;
}
else
break;
}
- strfcpy (d, pathptr, l);
+ m_strcpy(d, l, pathptr);
return 0;
}
#define HARDMAXATTEMPTS 10
-static int dotlock_lock (const char *realpath)
+static int dotlock_lock (const char *frealpath)
{
char lockfile[_POSIX_PATH_MAX + LONG_STRING];
char nfslockfile[_POSIX_PATH_MAX + LONG_STRING];
time_t t;
snprintf (nfslockfile, sizeof (nfslockfile), "%s.%s.%d",
- realpath, Hostname, (int) getpid ());
- snprintf (lockfile, sizeof (lockfile), "%s.lock", realpath);
+ frealpath, Hostname, (int) getpid ());
+ snprintf (lockfile, sizeof (lockfile), "%s.lock", frealpath);
BEGIN_PRIVILEGED ();
*
*/
-static int dotlock_unlock (const char *realpath)
+static int dotlock_unlock (const char *frealpath)
{
char lockfile[_POSIX_PATH_MAX + LONG_STRING];
int i;
- snprintf (lockfile, sizeof (lockfile), "%s.lock", realpath);
+ snprintf (lockfile, sizeof (lockfile), "%s.lock", frealpath);
BEGIN_PRIVILEGED ();
i = unlink (lockfile);
/* remove an empty file */
-static int dotlock_unlink (const char *realpath)
+static int dotlock_unlink (const char *frealpath)
{
struct stat lsb;
int i = -1;
- if (dotlock_lock (realpath) != DL_EX_OK)
+ if (dotlock_lock (frealpath) != DL_EX_OK)
return DL_EX_ERROR;
- if ((i = lstat (realpath, &lsb)) == 0 && lsb.st_size == 0)
- unlink (realpath);
+ if ((i = lstat (frealpath, &lsb)) == 0 && lsb.st_size == 0)
+ unlink (frealpath);
- dotlock_unlock (realpath);
+ dotlock_unlock (frealpath);
return (i == 0) ? DL_EX_OK : DL_EX_ERROR;
}