+
+static void
+usage(int lock_method)
+{
+ printf ("Usage: movemail [-rvxkh] [-l lines ] [-m method ] [-i] inbox [-o] destfile [[-p] POP-password]\n");
+ printf("where method is one of: dot");
+#ifdef HAVE_LOCKF
+ printf(", lockf");
+#endif
+#ifdef HAVE_FLOCK
+ printf(", flock");
+#endif
+#ifdef HAVE_MMDF
+ printf(", mmdf");
+#endif
+#ifdef HAVE_LOCKING
+ printf(", locking");
+#endif
+ printf("\nDefault is: %s\n", unparse_lock_method(lock_method));
+
+}
+
+static char *
+unparse_lock_method(int lock_method)
+{
+ switch (lock_method)
+ {
+ case DOTLOCKING: return "dot";
+ case FLOCKING: return "flock";
+ case LOCKFING: return "lockf";
+ case LOCKING: return "locking";
+ case MMDF: return "mmdf";
+ default: abort();return 0;
+ }
+}
+
+static int
+parse_lock_method(char *method_name)
+{
+ if (!strcmp("dot", method_name) || !strcmp("file", method_name))
+ return DOTLOCKING;
+#ifdef HAVE_LOCKF
+ else if (!strcmp("lockf", method_name))
+ return LOCKFING;
+#endif
+#ifdef HAVE_FLOCK
+ else if (!strcmp("flock", method_name))
+ return FLOCKING;
+#endif
+#ifdef HAVE_MMDF
+ else if (!strcmp("mmdf", method_name))
+ return MMDF;
+#endif
+#ifdef HAVE_LOCKING
+ else if (!strcmp("locking", method_name))
+ return LOCKING;
+#endif
+ else
+ fatal("invalid lock method: %s", method_name);
+ return 0; /* unreached */
+}
+
+static char *
+dot_filename(char *filename)
+{
+ return concat (filename, ".lock", "");
+}
+
+static char *dotlock_filename = NULL;
+
+#ifndef DISABLE_DIRECT_ACCESS
+static void
+lock_dot(char *filename)
+{
+ struct stat st;
+ long now;
+ int tem;
+ char *lockname, *p;
+ char *tempname;
+ int desc;
+
+ dotlock_filename = (char *) xmalloc(strlen(filename) + 1);
+
+ /* Use a lock file named after our first argument with .lock appended:
+ If it exists, the mail file is locked. */
+
+ lockname = dot_filename(filename);
+ tempname = (char *) xmalloc (strlen (filename) + strlen ("EXXXXXX") + 1);
+ strcpy (tempname, filename);
+ p = tempname + strlen (tempname);
+ while (p != tempname && !IS_DIRECTORY_SEP (p[-1]))
+ p--;
+ *p = 0;
+ strcpy (p, "EXXXXXX");
+ mktemp (tempname);
+ unlink (tempname);
+
+ for (;;)
+ {
+ /* Create the lock file, but not under the lock file name. */
+ /* Give up if cannot do that. */
+ desc = open (tempname, O_WRONLY | O_CREAT | O_EXCL, 0666);
+ if (desc < 0)
+ {
+ char *message = (char *) xmalloc (strlen (tempname) + 50);
+ sprintf (message, "%s--see source file lib-src/movemail.c",
+ tempname);
+ pfatal_with_name (message);
+ }
+ close (desc);
+
+ tem = link (tempname, lockname);
+ unlink (tempname);
+ if (tem >= 0)
+ break;
+ sleep (1);
+
+ /* If lock file is five minutes old, unlock it.
+ Five minutes should be good enough to cope with crashes
+ and wedgitude, and long enough to avoid being fooled
+ by time differences between machines. */
+ if (stat (lockname, &st) >= 0)
+ {
+ now = time (0);
+ if (st.st_ctime < now - 300)
+ unlink (lockname);
+ }
+ }
+ strcpy(dotlock_filename, filename);
+}
+#endif /* not DISABLE_DIRECT_ACCESS */
+
+static void
+unlock_dot(char *filename)
+{
+ unlink(dot_filename(filename));
+}
+
+static void
+maybe_unlock_dot(void)
+{
+ if (dotlock_filename)
+ unlock_dot(dotlock_filename);
+}
+