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 Workervoid 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 Workervoid 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 Workerchar *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