X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=dotlock.c;h=8d562c8a50f8499aa7de3463276fad0907355769;hp=eb761ad32f6f552a5e6ec064064e05852003bacb;hb=f3cbb9f51357972f6e74244494236a41dc4d84cd;hpb=96d53ff49c308769efbf708e1e65819077cb7af6 diff --git a/dotlock.c b/dotlock.c index eb761ad..8d562c8 100644 --- a/dotlock.c +++ b/dotlock.c @@ -8,55 +8,20 @@ * please see the file GPL in the top level source directory. */ -/* - * 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. - */ - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include +#include -#include -#include -#include -#include #include -#include -#include -#include -#include - -#ifndef _POSIX_PATH_MAX -#include -#endif - #include "dotlock.h" -#include "config.h" #ifdef HAVE_GETOPT_H #include #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 @@ -70,27 +35,10 @@ # endif -# ifndef HAVE_SNPRINTF -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 */ - static int DotlockFlags; static int Retry = MAXLOCKATTEMPT; -#ifdef DL_STANDALONE static char *Hostname; -#endif #ifdef USE_SETGID static gid_t UserGid; @@ -98,14 +46,12 @@ static gid_t MailGid; #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); @@ -122,14 +68,8 @@ static int dotlock_unlink (const char *); static int dotlock_lock (const char *); -#ifdef DL_STANDALONE - #define check_flags(a) if (a & DL_FL_ACTIONS) usage (argv[0]) -size_t mutt_strlen (const char* s) { - return (s ? strlen (s) : 0); -} - int main (int argc, char **argv) { int i; @@ -145,7 +85,7 @@ int main (int argc, char **argv) /* determine the system's host name */ uname (&utsname); - if (!(Hostname = strdup (utsname.nodename))) /* __MEM_CHECKED__ */ + if (!(Hostname = strdup(utsname.nodename))) return DL_EX_ERROR; if ((p = strchr (Hostname, '.'))) *p = '\0'; @@ -223,42 +163,9 @@ static int dotlock_init_privs (void) } -#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 @@ -271,7 +178,7 @@ static int dotlock_dispatch (const char *f, int fd) * 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. */ @@ -279,11 +186,11 @@ static int dotlock_dispatch (const char *f, int fd) 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); } @@ -331,8 +238,6 @@ static void END_PRIVILEGED (void) #endif } -#ifdef DL_STANDALONE - /* * Usage information. * @@ -342,7 +247,7 @@ static void END_PRIVILEGED (void) static void usage (const char *av0) { - fprintf (stderr, "dotlock [Mutt-ng %s (%s)]\n", VERSION, ReleaseDate); + fprintf (stderr, "dotlock [Madmutt %s]\n", VERSION); fprintf (stderr, "usage: %s [-t|-f|-u|-d] [-p] [-r ] file\n", av0); fputs ("\noptions:" @@ -357,8 +262,6 @@ static void usage (const char *av0) 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. @@ -431,39 +334,39 @@ static int dotlock_check_stats (struct stat *fsb, struct stat *lsb) 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 (mutt_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); @@ -474,7 +377,7 @@ static int dotlock_prepare (char *bn, size_t l, const char *f, int _fd) if (r == -1) return -1; - if (lstat (basename, &lsb) == -1) + if (lstat (fbasename, &lsb) == -1) return -1; if (dotlock_check_stats (&fsb, &lsb) == -1) @@ -492,26 +395,26 @@ static int dotlock_prepare (char *bn, size_t l, const char *f, int _fd) */ 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); } @@ -525,7 +428,7 @@ dotlock_expand_link (char *newpath, const char *path, const char *link) 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; @@ -547,14 +450,14 @@ static int dotlock_deference_symlink (char *d, size_t l, const char *path) 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; } @@ -569,11 +472,11 @@ static int dotlock_deference_symlink (char *d, size_t l, const char *path) #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]; - size_t prev_size = 0; + ssize_t prev_size = 0; int fd; int count = 0; int hard_count = 0; @@ -581,8 +484,8 @@ static int dotlock_lock (const char *realpath) 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 (); @@ -668,12 +571,12 @@ static int dotlock_lock (const char *realpath) * */ -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); @@ -687,18 +590,18 @@ static int dotlock_unlock (const char *realpath) /* 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; }