Use good m_ functions, because it smell like a flower, version 2.
[apps/madmutt.git] / dotlock.c
index c076a4b..8d562c8 100644 (file)
--- 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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include <lib-lib/lib-lib.h>
 
-#include <unistd.h>
-#include <dirent.h>
-#include <sys/file.h>
-#include <sys/stat.h>
 #include <sys/utsname.h>
-#include <errno.h>
-#include <time.h>
-#include <fcntl.h>
-#include <limits.h>
-
-#ifndef _POSIX_PATH_MAX
-#include <posix1_lim.h>
-#endif
-
 #include "dotlock.h"
-#include "config.h"
 
 #ifdef HAVE_GETOPT_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
 
 # 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,8 +68,6 @@ 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])
 
 int main (int argc, char **argv)
@@ -141,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';
@@ -219,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
@@ -267,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. */
@@ -275,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);
 }
 
 
@@ -327,8 +238,6 @@ static void END_PRIVILEGED (void)
 #endif
 }
 
-#ifdef DL_STANDALONE
-
 /*
  * Usage information.
  * 
@@ -338,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 <retries>] file\n", av0);
 
   fputs ("\noptions:"
@@ -353,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.
@@ -427,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 (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);
@@ -470,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)
@@ -488,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);
 }
 
 
@@ -521,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;
 
@@ -543,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;
 }
 
@@ -565,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;
@@ -577,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 ();
@@ -664,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);
@@ -683,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;
 }