]> diplodocus.org Git - nmh/blobdiff - uip/inc.c
Fixed typo in man page.
[nmh] / uip / inc.c
index 1ea618db44204ed355d6fe804411980abe613552..41e785ff3a80f94c439fff881e1b3fe6d3dbae0a 100644 (file)
--- a/uip/inc.c
+++ b/uip/inc.c
@@ -8,7 +8,13 @@
  */
 
 #ifdef MAILGROUP
-/* Revised: Sat Apr 14 17:08:17 PDT 1990 (marvit@hplabs)
+/*
+ * Thu Feb 12 21:00 CST 2015            Marcin Cieslak <saper@saper.info>
+ *    Replaced setgid() calls with setegid() so that it works with dot
+ *    locking on FreeBSD.  setegid() should be supported on modern POSIX
+ *    systems.
+ *
+ * Revised: Sat Apr 14 17:08:17 PDT 1990 (marvit@hplabs)
  *    Added hpux hacks to set and reset gid to be "mail" as needed. The reset
  *    is necessary so inc'ed mail is the group of the inc'er, rather than
  *    "mail". We setgid to egid only when [un]locking the mail file. This
@@ -127,10 +133,16 @@ static FILE *pf = NULL;
  * For setting and returning to "mail" gid
  */
 #ifdef MAILGROUP
-static int return_gid;
+static gid_t return_gid;
 #define TRYDROPGROUPPRIVS() DROPGROUPPRIVS()
-#define DROPGROUPPRIVS() setgid(getgid())
-#define GETGROUPPRIVS() setgid(return_gid)
+#define DROPGROUPPRIVS() \
+    if (setegid(getgid()) != 0) { \
+        adios ("setegid", "unable to restore group to %ld", (long) getgid()); \
+    }
+#define GETGROUPPRIVS() \
+    if (setegid(return_gid) != 0) { \
+        adios ("setegid", "unable to set group to %ld", (long) return_gid); \
+    }
 #define SAVEGROUPPRIVS() return_gid = getegid()
 #else
 /* define *GROUPPRIVS() as null; this avoids having lots of "#ifdef MAILGROUP"s */
@@ -572,7 +584,7 @@ go_to_it:
                if (errno != ENOENT)
                    adios (packfile, "error on file");
                cp = concat ("Create file \"", packfile, "\"? ", NULL);
-               if (noisy && !getanswer (cp))
+               if (noisy && !read_yes_or_no_if_tty (cp))
                    done (1);
                free (cp);
            }
@@ -594,7 +606,9 @@ go_to_it:
                fseek (pf, 0L, SEEK_CUR);
                pos = ftell (pf);
                size = 0;
-               fwrite (mmdlm1, 1, strlen (mmdlm1), pf);
+               if (fwrite (mmdlm1, 1, strlen (mmdlm1), pf) < strlen (mmdlm1)) {
+                   advise (mmdlm1, "fwrite");
+               }
                start = ftell (pf);
 
                if (pop_retr (i, pop_pack) == NOTOK)
@@ -649,7 +663,9 @@ go_to_it:
 
            if (packfile) {
                fseek (pf, stop, SEEK_SET);
-               fwrite (mmdlm2, 1, strlen (mmdlm2), pf);
+               if (fwrite (mmdlm2, 1, strlen (mmdlm2), pf) < strlen (mmdlm1)) {
+                   advise (mmdlm2, "fwrite");
+               }
                if (fflush (pf) || ferror (pf)) {
                    int e = errno;
                    pop_quit ();
@@ -943,6 +959,7 @@ skip:
 static void
 inc_done (int status)
 {
+    done = exit;
     if (packfile && pd != NOTOK)
        mbx_close (packfile, pd);
     if (locked)