summaryrefslogtreecommitdiff
path: root/contrib/opie/libmissing/getusershell.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/opie/libmissing/getusershell.c')
-rw-r--r--contrib/opie/libmissing/getusershell.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/contrib/opie/libmissing/getusershell.c b/contrib/opie/libmissing/getusershell.c
new file mode 100644
index 000000000000..885aa04ffa5f
--- /dev/null
+++ b/contrib/opie/libmissing/getusershell.c
@@ -0,0 +1,67 @@
+/* getusershell.c: minimal implementation of the getusershell() and
+ endusershell() library routines for systems that don't have them.
+
+%%% portions-copyright-cmetz
+Portions of this software are Copyright 1996 by Craig Metz, All Rights
+Reserved. The Inner Net License Version 2 applies to these portions of
+the software.
+You should have received a copy of the license with this software. If
+you didn't get a copy, you may request one from <license@inner.net>.
+
+Portions of this software are Copyright 1995 by Randall Atkinson and Dan
+McDonald, All Rights Reserved. All Rights under this copyright are assigned
+to the U.S. Naval Research Laboratory (NRL). The NRL Copyright Notice and
+License Agreement applies to this software.
+
+ History:
+
+ Modified by cmetz for OPIE 2.2. Use FUNCTION declaration et al.
+ Modified at NRL for OPIE 2.1. Remove trailing newlines from
+ /etc/shells entries. Fixed infinite loop. Fixed a bug
+ where second invocation on would fail.
+ Written at NRL for OPIE 2.0.
+*/
+#include "opie_cfg.h"
+#include <stdio.h>
+#if HAVE_STRING_H
+#include <string.h>
+#endif /* HAVE_STRING_H */
+#include "opie.h"
+
+static FILE *fh = NULL;
+static char *internal[] = {"/bin/sh", "/bin/csh", NULL};
+static int i = 0;
+static char buffer[1024];
+
+char *getusershell FUNCTION_NOARGS
+{
+ char *c;
+
+ if (!fh)
+ fh = fopen("/etc/shells", "r");
+
+ if (fh) {
+ if (fgets(buffer, sizeof(buffer), fh)) {
+ if (c = strchr(buffer, '\n'))
+ *c = 0;
+ return buffer;
+ } else {
+ fclose(fh);
+ return NULL;
+ }
+ } else {
+ if (internal[i])
+ return internal[i++];
+ else
+ return NULL;
+ }
+}
+
+VOIDRET endusershell FUNCTION_NOARGS
+{
+ if (fh) {
+ fclose(fh);
+ fh = NULL;
+ }
+ i = 0;
+}