xref: /aosp_15_r20/external/musl/src/legacy/getusershell.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #define _GNU_SOURCE
2*c9945492SAndroid Build Coastguard Worker #include <stdio.h>
3*c9945492SAndroid Build Coastguard Worker #include <unistd.h>
4*c9945492SAndroid Build Coastguard Worker 
5*c9945492SAndroid Build Coastguard Worker static const char defshells[] = "/bin/sh\n/bin/csh\n";
6*c9945492SAndroid Build Coastguard Worker 
7*c9945492SAndroid Build Coastguard Worker static char *line;
8*c9945492SAndroid Build Coastguard Worker static size_t linesize;
9*c9945492SAndroid Build Coastguard Worker static FILE *f;
10*c9945492SAndroid Build Coastguard Worker 
endusershell(void)11*c9945492SAndroid Build Coastguard Worker void endusershell(void)
12*c9945492SAndroid Build Coastguard Worker {
13*c9945492SAndroid Build Coastguard Worker 	if (f) fclose(f);
14*c9945492SAndroid Build Coastguard Worker 	f = 0;
15*c9945492SAndroid Build Coastguard Worker }
16*c9945492SAndroid Build Coastguard Worker 
setusershell(void)17*c9945492SAndroid Build Coastguard Worker void setusershell(void)
18*c9945492SAndroid Build Coastguard Worker {
19*c9945492SAndroid Build Coastguard Worker 	if (!f) f = fopen("/etc/shells", "rbe");
20*c9945492SAndroid Build Coastguard Worker 	if (!f) f = fmemopen((void *)defshells, sizeof defshells - 1, "rb");
21*c9945492SAndroid Build Coastguard Worker }
22*c9945492SAndroid Build Coastguard Worker 
getusershell(void)23*c9945492SAndroid Build Coastguard Worker char *getusershell(void)
24*c9945492SAndroid Build Coastguard Worker {
25*c9945492SAndroid Build Coastguard Worker 	ssize_t l;
26*c9945492SAndroid Build Coastguard Worker 	if (!f) setusershell();
27*c9945492SAndroid Build Coastguard Worker 	if (!f) return 0;
28*c9945492SAndroid Build Coastguard Worker 	do {
29*c9945492SAndroid Build Coastguard Worker 		l = getline(&line, &linesize, f);
30*c9945492SAndroid Build Coastguard Worker 		if (l <= 0) return 0;
31*c9945492SAndroid Build Coastguard Worker 	} while (line[0] == '#' || line[0] == '\n');
32*c9945492SAndroid Build Coastguard Worker 	if (line[l-1]=='\n') line[l-1]=0;
33*c9945492SAndroid Build Coastguard Worker 	return line;
34*c9945492SAndroid Build Coastguard Worker }
35