github.com/afumu/libc@v0.0.6/musl/src/legacy/getusershell.c (about) 1 #define _GNU_SOURCE 2 #include <stdio.h> 3 #include <unistd.h> 4 5 static const char defshells[] = "/bin/sh\n/bin/csh\n"; 6 7 static char *line; 8 static size_t linesize; 9 static FILE *f; 10 11 void endusershell(void) 12 { 13 if (f) fclose(f); 14 f = 0; 15 } 16 17 void setusershell(void) 18 { 19 if (!f) f = fopen("/etc/shells", "rbe"); 20 if (!f) f = fmemopen((void *)defshells, sizeof defshells - 1, "rb"); 21 } 22 23 char *getusershell(void) 24 { 25 ssize_t l; 26 if (!f) setusershell(); 27 if (!f) return 0; 28 l = getline(&line, &linesize, f); 29 if (l <= 0) return 0; 30 if (line[l-1]=='\n') line[l-1]=0; 31 return line; 32 }