+++ /dev/null
-diff -up rcs-5.8/man/co.1in.sameuserlocks rcs-5.8/man/co.1in
---- rcs-5.8/man/co.1in.sameuserlocks 2011-01-07 13:27:18.000000000 +0100
-+++ rcs-5.8/man/co.1in 2011-09-08 11:41:09.545810466 +0200
-@@ -318,6 +318,10 @@ Use this option with care; it can confus
- retrieves the latest revision on the selected branch whose state is set to
- .IR state .
- .TP
-+.BI \-S
-+Turns on same user locks. When this is enabled the user cannot check out
-+the same file twice.
-+.TP
- .B \-T
- Preserve the modification time on the \*o
- even if the \*o changes because a lock is added or removed.
-diff -up rcs-5.8/src/b-excwho.c.sameuserlocks rcs-5.8/src/b-excwho.c
---- rcs-5.8/src/b-excwho.c.sameuserlocks 2011-01-07 13:27:18.000000000 +0100
-+++ rcs-5.8/src/b-excwho.c 2011-09-08 11:41:09.546810466 +0200
-@@ -205,9 +205,9 @@ getcaller (void)
- }
-
- bool
--caller_login_p (char const *login)
-+caller_login_p (char const *login, int sameuserlocks)
- {
-- return STR_SAME (getcaller (), login);
-+ return STR_SAME (getcaller (), login) && !sameuserlocks;
- }
-
- struct link *
-@@ -255,7 +255,7 @@ lock_drop (struct link *box, struct link
- }
-
- int
--addlock (struct delta *delta, bool verbose)
-+addlock (struct delta *delta, bool verbose, int sameuserlocks)
- /* Add a lock held by caller to ‘delta’ and return 1 if successful.
- Print an error message if ‘verbose’ and return -1 if no lock is
- added because ‘delta’ is locked by somebody other than caller.
-@@ -266,7 +266,7 @@ addlock (struct delta *delta, bool verbo
-
- if (was)
- {
-- if (caller_login_p (was->login))
-+ if (caller_login_p (was->login, sameuserlocks))
- return 0;
- if (verbose)
- RERR ("Revision %s is already locked by %s.", delta->num, was->login);
-diff -up rcs-5.8/src/b-excwho.h.sameuserlocks rcs-5.8/src/b-excwho.h
---- rcs-5.8/src/b-excwho.h.sameuserlocks 2011-01-07 13:27:18.000000000 +0100
-+++ rcs-5.8/src/b-excwho.h 2011-09-08 11:43:06.424809351 +0200
-@@ -27,11 +27,11 @@ extern void seteid (void);
- extern void setrid (void);
- extern char const *getusername (bool suspicious);
- extern char const *getcaller (void);
--extern bool caller_login_p (char const *login);
-+extern bool caller_login_p (char const *login, int sameuserlocks);
- extern struct link *lock_memq (struct link *ls, bool loginp, void const *x);
- extern struct rcslock const *lock_on (struct delta const *delta);
- extern void lock_drop (struct link *box, struct link *tp);
--extern int addlock (struct delta *delta, bool verbose);
-+extern int addlock (struct delta *delta, bool verbose, int sameuserlocks);
-
- /* Idioms. */
-
-diff -up rcs-5.8/src/ci.c.sameuserlocks rcs-5.8/src/ci.c
---- rcs-5.8/src/ci.c.sameuserlocks 2011-08-08 14:00:25.000000000 +0200
-+++ rcs-5.8/src/ci.c 2011-09-08 11:41:09.585810465 +0200
-@@ -153,7 +153,7 @@ removelock (struct delta *delta)
- return -1;
- }
- rl = tp->next->entry;
-- if (! caller_login_p (rl->login))
-+ if (! caller_login_p (rl->login, false))
- {
- RERR ("revision %s locked by %s", num, rl->login);
- return -1;
-@@ -260,7 +260,7 @@ addbranch (struct delta *branchpoint, st
- newbranch.entry = &newdelta;
- newdelta.ilk = NULL;
- if (branchpoint->lockedby)
-- if (caller_login_p (branchpoint->lockedby))
-+ if (caller_login_p (branchpoint->lockedby, false))
- return removelock (branchpoint); /* This returns 1. */
- return removedlock;
- }
-@@ -1006,7 +1006,7 @@ main (int argc, char **argv)
- continue;
- }
-
-- if (lockflag && addlock (&newdelta, true) < 0)
-+ if (lockflag && addlock (&newdelta, true, false) < 0)
- continue;
-
- if (keepflag && (pv = PREV (name)))
-diff -up rcs-5.8/src/co.c.sameuserlocks rcs-5.8/src/co.c
---- rcs-5.8/src/co.c.sameuserlocks 2011-08-08 14:00:25.000000000 +0200
-+++ rcs-5.8/src/co.c 2011-09-08 11:41:09.587810465 +0200
-@@ -135,7 +135,7 @@ rmlock (struct delta const *delta)
- /* No lock on ‘delta’. */
- return 0;
- rl = tp->next->entry;
-- if (!caller_login_p (rl->login))
-+ if (!caller_login_p (rl->login, false))
- /* Found a lock on ‘delta’ by someone else. */
- {
- RERR ("revision %s locked by %s; use co -r or rcs -u",
-@@ -441,6 +441,7 @@ main (int argc, char **argv)
- int changelock;
- int expmode, r, workstatstat;
- bool tostdout, Ttimeflag;
-+ int sameuserlocks;
- char finaldate[datesize];
- #if OPEN_O_BINARY
- int stdout_mode = 0;
-@@ -464,6 +465,7 @@ main (int argc, char **argv)
- BE (pe) = X_DEFAULT;
- tostdout = false;
- Ttimeflag = false;
-+ sameuserlocks = false;
-
- argc = getRCSINIT (argc, argv, &newargv);
- argv = newargv;
-@@ -543,6 +545,14 @@ main (int argc, char **argv)
- }
- break;
-
-+ case 'S':
-+ /*
-+ * Enable strict locks (i.e. even the same user cannot
-+ * re-check out a file with a lock that he owns.
-+ */
-+ sameuserlocks = true;
-+ break;
-+
- case 'T':
- if (*a)
- goto unknown;
-@@ -699,7 +709,7 @@ main (int argc, char **argv)
- /* Check reservations. */
- changelock = lockflag < 0
- ? rmlock (targetdelta)
-- : lockflag == 0 ? 0 : addlock (targetdelta, true);
-+ : lockflag == 0 ? 0 : addlock (targetdelta, true, sameuserlocks);
-
- if (changelock < 0
- || (changelock && !checkaccesslist ())
-diff -up rcs-5.8/src/rcsclean.c.sameuserlocks rcs-5.8/src/rcsclean.c
---- rcs-5.8/src/rcsclean.c.sameuserlocks 2011-08-08 14:00:25.000000000 +0200
-+++ rcs-5.8/src/rcsclean.c 2011-09-08 11:41:09.588810465 +0200
-@@ -66,7 +66,7 @@ unlock (struct delta *delta)
- struct link box, *tp;
-
- if (delta && delta->lockedby
-- && caller_login_p (delta->lockedby)
-+ && caller_login_p (delta->lockedby, false)
- && (box.next = GROK (locks))
- && (tp = lock_delta_memq (&box, delta)))
- {
-diff -up rcs-5.8/src/rcs.c.sameuserlocks rcs-5.8/src/rcs.c
---- rcs-5.8/src/rcs.c.sameuserlocks 2011-08-08 13:58:59.000000000 +0200
-+++ rcs-5.8/src/rcs.c 2011-09-08 11:41:09.590810465 +0200
-@@ -495,7 +495,7 @@ breaklock (struct delta const *delta)
- }
- rl = tp->next->entry;
- before = rl->login;
-- if (!caller_login_p (before)
-+ if (!caller_login_p (before, false)
- && !sendmail (num, before))
- {
- RERR ("revision %s still locked by %s", num, before);
-@@ -794,8 +794,8 @@ setlock (char const *rev, struct wlink *
- RERR ("can't lock nonexisting revision %s", numrev.string);
- else
- {
-- if ((r = addlock (target, false)) < 0 && breaklock (target))
-- r = addlock (target, true);
-+ if ((r = addlock (target, false, false)) < 0 && breaklock (target))
-+ r = addlock (target, true, false);
- if (0 <= r)
- {
- if (r)
-diff -up rcs-5.8/src/rcsedit.c.sameuserlocks rcs-5.8/src/rcsedit.c
---- rcs-5.8/src/rcsedit.c.sameuserlocks 2011-08-08 14:00:25.000000000 +0200
-+++ rcs-5.8/src/rcsedit.c 2011-09-08 11:41:09.591810465 +0200
-@@ -1086,11 +1086,11 @@ checkaccesslist (void)
- {
- struct link *ls = GROK (access);
-
-- if (!ls || stat_mine_p (&REPO (stat)) || caller_login_p ("root"))
-+ if (!ls || stat_mine_p (&REPO (stat)) || caller_login_p ("root", false))
- return true;
-
- for (; ls; ls = ls->next)
-- if (caller_login_p (ls->entry))
-+ if (caller_login_p (ls->entry, false))
- return true;
-
- RERR ("user %s not on the access list", getcaller ());