char *getusershell();

Damien Miller djm at mindrot.org
Mon Mar 19 10:06:24 EST 2001


On 18 Mar 2001, Ayamura KIKUCHI wrote:

> Several OS such as IRXI do not have the getusershell(),setusershell()
> and endusershell() functions so we need to introduce those in a file
> "openbsd-compat/getusershell.c".

Can you give this patch a try? You will need to run autoreconf after
applying.

Index: configure.in
===================================================================
RCS file: /var/cvs/openssh/configure.in,v
retrieving revision 1.266
diff -u -u -r1.266 configure.in
--- configure.in	2001/03/17 01:15:38	1.266
+++ configure.in	2001/03/18 23:04:23
@@ -527,7 +527,7 @@
 )

 dnl    Checks for library functions.
-AC_CHECK_FUNCS(arc4random atexit b64_ntop bcopy bindresvport_sa clock fchown fchmod freeaddrinfo futimes gai_strerror getcwd getaddrinfo getgrouplist getnameinfo getrlimit getrusage getttyent glob inet_aton inet_ntoa innetgr login_getcapbool md5_crypt memmove mkdtemp on_exit openpty realpath rresvport_af setdtablesize setenv seteuid setlogin setproctitle setreuid setrlimit setsid sigaction sigvec snprintf strerror strlcat strlcpy strmode strsep strtok_r sysconf tcgetpgrp utimes vsnprintf vhangup vis waitpid _getpty __b64_ntop)
+AC_CHECK_FUNCS(arc4random atexit b64_ntop bcopy bindresvport_sa clock fchown fchmod freeaddrinfo futimes gai_strerror getcwd getaddrinfo getgrouplist getnameinfo getrlimit getrusage getttyent getusershell glob inet_aton inet_ntoa innetgr login_getcapbool md5_crypt memmove mkdtemp on_exit openpty realpath rresvport_af setdtablesize setenv seteuid setlogin setproctitle setreuid setrlimit setsid sigaction sigvec snprintf strerror strlcat strlcpy strmode strsep strtok_r sysconf tcgetpgrp utimes vsnprintf vhangup vis waitpid _getpty __b64_ntop)
 dnl    Checks for time functions
 AC_CHECK_FUNCS(gettimeofday time)
 dnl    Checks for libutil functions
Index: defines.h
===================================================================
RCS file: /var/cvs/openssh/defines.h,v
retrieving revision 1.56
diff -u -u -r1.56 defines.h
--- defines.h	2001/02/24 00:55:05	1.56
+++ defines.h	2001/03/18 23:04:23
@@ -274,6 +274,12 @@
 #ifndef _PATH_BSHELL
 # define _PATH_BSHELL "/bin/sh"
 #endif
+#ifndef _PATH_CSHELL
+# define _PATH_CSHELL "/bin/csh"
+#endif
+#ifndef _PATH_SHELLS
+# define _PATH_SHELLS "/etc/shells"
+#endif

 #ifdef USER_PATH
 # ifdef _PATH_STDPATH
Index: openbsd-compat/Makefile.in
===================================================================
RCS file: /var/cvs/openssh/openbsd-compat/Makefile.in,v
retrieving revision 1.8
diff -u -u -r1.8 Makefile.in
--- openbsd-compat/Makefile.in	2001/03/14 00:39:46	1.8
+++ openbsd-compat/Makefile.in	2001/03/18 23:04:23
@@ -16,7 +16,7 @@
 INSTALL=@INSTALL@
 LDFLAGS=-L. @LDFLAGS@

-OPENBSD=base64.o bindresvport.o daemon.o getcwd.o glob.o getgrouplist.o inet_aton.o inet_ntoa.o mktemp.o realpath.o rresvport.o setenv.o setproctitle.o sigact.o strlcat.o strlcpy.o strmode.o strsep.o strtok.o vis.o
+OPENBSD=base64.o bindresvport.o daemon.o getcwd.o getgrouplist.o getusershell.o glob.o inet_aton.o inet_ntoa.o mktemp.o realpath.o rresvport.o setenv.o setproctitle.o sigact.o strlcat.o strlcpy.o strmode.o strsep.o strtok.o vis.o

 COMPAT=bsd-arc4random.o bsd-cygwin_util.o bsd-misc.o bsd-nextstep.o bsd-snprintf.o bsd-waitpid.o fake-getaddrinfo.o fake-getnameinfo.o

Index: openbsd-compat/getusershell.c
===================================================================
RCS file: getusershell.c
diff -N getusershell.c
--- /dev/null	Wed May  6 06:32:27 1998
+++ getusershell.c	Mon Mar 19 10:04:23 2001
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 1985, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "includes.h"
+#include "getusershell.h"
+
+#ifndef HAVE_GETUSERSHELL
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char rcsid[] = "$OpenBSD: getusershell.c,v 1.2 1996/08/19 08:24:15 tholo Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/file.h>
+#include <ctype.h>
+
+/*
+ * Local shells should NOT be added here.  They should be added in
+ * /etc/shells.
+ */
+
+static char *okshells[] = { _PATH_BSHELL, _PATH_CSHELL, NULL };
+static char **curshell, **shells, *strings;
+static char **initshells __P((void));
+
+/*
+ * Get a list of shells from _PATH_SHELLS, if it exists.
+ */
+char *
+getusershell()
+{
+	char *ret;
+
+	if (curshell == NULL)
+		curshell = initshells();
+	ret = *curshell;
+	if (ret != NULL)
+		curshell++;
+	return (ret);
+}
+
+void
+endusershell()
+{
+
+	if (shells != NULL)
+		free(shells);
+	shells = NULL;
+	if (strings != NULL)
+		free(strings);
+	strings = NULL;
+	curshell = NULL;
+}
+
+void
+setusershell()
+{
+
+	curshell = initshells();
+}
+
+static char **
+initshells()
+{
+	register char **sp, *cp;
+	register FILE *fp;
+	struct stat statb;
+
+	if (shells != NULL)
+		free(shells);
+	shells = NULL;
+	if (strings != NULL)
+		free(strings);
+	strings = NULL;
+	if ((fp = fopen(_PATH_SHELLS, "r")) == NULL)
+		return (okshells);
+	if (fstat(fileno(fp), &statb) == -1) {
+		(void)fclose(fp);
+		return (okshells);
+	}
+	if ((strings = malloc((u_int)statb.st_size)) == NULL) {
+		(void)fclose(fp);
+		return (okshells);
+	}
+	shells = calloc((unsigned)statb.st_size / 3, sizeof (char *));
+	if (shells == NULL) {
+		(void)fclose(fp);
+		free(strings);
+		strings = NULL;
+		return (okshells);
+	}
+	sp = shells;
+	cp = strings;
+	while (fgets(cp, MAXPATHLEN + 1, fp) != NULL) {
+		while (*cp != '#' && *cp != '/' && *cp != '\0')
+			cp++;
+		if (*cp == '#' || *cp == '\0')
+			continue;
+		*sp++ = cp;
+		while (!isspace(*cp) && *cp != '#' && *cp != '\0')
+			cp++;
+		*cp++ = '\0';
+	}
+	*sp = NULL;
+	(void)fclose(fp);
+	return (shells);
+}
+
+#endif /* HAVE_GETUSERSHELL */
Index: openbsd-compat/getusershell.h
===================================================================
RCS file: getusershell.h
diff -N getusershell.h
--- /dev/null	Wed May  6 06:32:27 1998
+++ getusershell.h	Mon Mar 19 10:04:23 2001
@@ -0,0 +1,16 @@
+/* $Id$ */
+
+#ifndef _GETUSERSHELL_H
+#define _GETUSERSHELL_H
+
+#include "config.h"
+
+#ifndef HAVE_GETUSERSHELL
+
+char *getusershell(void);
+void setusershell(void);
+void endusershell(void);
+
+#endif /* HAVE_GETUSERSHELL */
+
+#endif /* _GETUSERSHELL_H */
Index: openbsd-compat/openbsd-compat.h
===================================================================
RCS file: /var/cvs/openssh/openbsd-compat/openbsd-compat.h,v
retrieving revision 1.4
diff -u -u -r1.4 openbsd-compat.h
--- openbsd-compat/openbsd-compat.h	2001/03/14 00:39:46	1.4
+++ openbsd-compat/openbsd-compat.h	2001/03/18 23:04:23
@@ -25,6 +25,7 @@
 #include "setproctitle.h"
 #include "getgrouplist.h"
 #include "glob.h"
+#include "getusershell.h"

 /* Home grown routines */
 #include "bsd-arc4random.h"


-- 
| Damien Miller <djm at mindrot.org> \ ``E-mail attachments are the poor man's
| http://www.mindrot.org          /   distributed filesystem'' - Dan Geer






More information about the openssh-unix-dev mailing list