1 /*	$NetBSD: mbox_conf.c,v 1.1.1.1 2009/06/23 10:08:47 tron Exp $	*/
2 
3 /*++
4 /* NAME
5 /*	mbox_conf 3
6 /* SUMMARY
7 /*	mailbox lock configuration
8 /* SYNOPSIS
9 /*	#include <mbox_conf.h>
10 /*
11 /*	int	mbox_lock_mask(string)
12 /*	const char *string;
13 /*
14 /*	ARGV	*mbox_lock_names()
15 /* DESCRIPTION
16 /*	The functions in this module translate between external
17 /*	mailbox locking method names and internal representations.
18 /*
19 /*	mbox_lock_mask() translates a string with locking method names
20 /*	into a bit mask. Names are separated by comma or whitespace.
21 /*	The following gives the method names and corresponding bit
22 /*	mask value:
23 /* .IP "flock (MBOX_FLOCK_LOCK)"
24 /*	Use flock() style lock after opening the file. This is the mailbox
25 /*	locking method traditionally used on BSD-ish systems (including
26 /*	Ultrix and SunOS). It is not suitable for remote file systems.
27 /* .IP "fcntl (MBOX_FCNTL_LOCK)"
28 /*	Use fcntl() style lock after opening the file. This is the mailbox
29 /*	locking method on System-V-ish systems (Solaris, AIX, IRIX, HP-UX).
30 /*	This method is supposed to work for remote systems, but often
31 /*	has problems.
32 /* .IP "dotlock (MBOX_DOT_LOCK)"
33 /*	Create a lock file with the name \fIfilename\fB.lock\fR. This
34 /*	method pre-dates kernel locks. This works with remote file systems,
35 /*	modulo cache coherency problems.
36 /* .PP
37 /*	mbox_lock_names() returns an array with the names of available
38 /*	mailbox locking methods. The result should be given to argv_free().
39 /* DIAGNOSTICS
40 /*	Fatal errors: undefined locking method name.
41 /* LICENSE
42 /* .ad
43 /* .fi
44 /*	The Secure Mailer license must be distributed with this software.
45 /* AUTHOR(S)
46 /*	Wietse Venema
47 /*	IBM T.J. Watson Research
48 /*	P.O. Box 704
49 /*	Yorktown Heights, NY 10598, USA
50 /*--*/
51 
52 /* System library. */
53 
54 #include <sys_defs.h>
55 
56 /* Utility library. */
57 
58 #include <name_mask.h>
59 #include <argv.h>
60 
61 /* Global library. */
62 
63 #include <mail_params.h>
64 #include <mbox_conf.h>
65 
66  /*
67   * The table with available mailbox locking methods. Some systems have
68   * flock() locks; all POSIX-compatible systems have fcntl() locks. Even
69   * though some systems do not use dotlock files by default (4.4BSD), such
70   * locks can be necessary when accessing mailbox files over NFS.
71   */
72 static const NAME_MASK mbox_mask[] = {
73 #ifdef HAS_FLOCK_LOCK
74     "flock", MBOX_FLOCK_LOCK,
75 #endif
76 #ifdef HAS_FCNTL_LOCK
77     "fcntl", MBOX_FCNTL_LOCK,
78 #endif
79     "dotlock", MBOX_DOT_LOCK,
80     0,
81 };
82 
83 /* mbox_lock_mask - translate mailbox lock names to bit mask */
84 
85 int     mbox_lock_mask(const char *string)
86 {
87     return (name_mask(VAR_MAILBOX_LOCK, mbox_mask, string));
88 }
89 
90 /* mbox_lock_names - return available mailbox lock method names */
91 
92 ARGV   *mbox_lock_names(void)
93 {
94     const NAME_MASK *np;
95     ARGV   *argv;
96 
97     argv = argv_alloc(2);
98     for (np = mbox_mask; np->name != 0; np++)
99 	argv_add(argv, np->name, ARGV_END);
100     argv_terminate(argv);
101     return (argv);
102 }
103