A library function initgroup(3) is used at src/server.c:switch_to_user().
In FreeBSD, initgroup(3) writes a error message to stderr if failure.
Therefore, cvs client displays `unrecognized auth response from ...'
and quit.
This patch is that stderr is connected to /dev/null during initgroup(3).
Index: server.c
===================================================================
RCS file: /home2/cvsroot/ccvs/src/server.c,v
retrieving revision 1.224
diff -c -r1.224 server.c
*** server.c 2000/02/18 22:35:08 1.224
--- server.c 2000/03/03 10:41:42
***************
*** 5061,5071 ****
--- 5061,5102 ----
#if defined (HAVE_KERBEROS) || defined (AUTH_SERVER_SUPPORT) || defined (HAVE_GSSAPI)
static void switch_to_user PROTO((const char *));
+ struct discard_stderr
+ {
+ int saved_stderr;
+ int devnull;
+ };
+
+ void
+ begin_discard_stderr(struct discard_stderr *disc)
+ {
+ if ((disc->saved_stderr = dup (2)) < 0)
+ error_exit ();
+ if ((disc->devnull = open (DEVNULL, O_WRONLY)) < 0)
+ error_exit ();
+ if (dup2 (disc->devnull, 2) < 0)
+ error_exit ();
+ }
+
+ void
+ end_discard_stderr(struct discard_stderr *disc)
+ {
+ if (dup2 (disc->saved_stderr, 2) < 0)
+ error_exit ();
+ if (close (disc->devnull) < 0)
+ error_exit ();
+ if (close (disc->saved_stderr) < 0)
+ error_exit ();
+ }
+
static void
switch_to_user (username)
const char *username;
{
struct passwd *pw;
+ #ifdef __FreeBSD__
+ struct discard_stderr disc;
+ #endif
pw = getpwnam (username);
if (pw == NULL)
***************
*** 5080,5085 ****
--- 5111,5119 ----
}
#if HAVE_INITGROUPS
+ # ifdef __FreeBSD__
+ begin_discard_stderr(&disc);
+ # endif
if (initgroups (pw->pw_name, pw->pw_gid) < 0
# ifdef EPERM
/* At least on the system I tried, initgroups() only works as root.
***************
*** 5097,5102 ****
--- 5131,5139 ----
/* Don't worry about server_cleanup; server_active isn't set yet. */
error_exit ();
}
+ # ifdef __FreeBSD__
+ end_discard_stderr(&disc);
+ # endif
#endif /* HAVE_INITGROUPS */
#ifdef SETXID_SUPPORT
--
KOIE Hidetaka <[EMAIL PROTECTED]>