| #define _GNU_SOURCE |
| #include <stdio.h> |
| #include <unistd.h> |
| |
| static const char defshells[] = "/bin/sh\n/bin/csh\n"; |
| |
| static char *line; |
| static size_t linesize; |
| static FILE *f; |
| |
| void endusershell(void) |
| { |
| if (f) fclose(f); |
| f = 0; |
| } |
| |
| void setusershell(void) |
| { |
| if (!f) f = fopen("/etc/shells", "rbe"); |
| if (!f) f = fmemopen((void *)defshells, sizeof defshells - 1, "rb"); |
| } |
| |
| char *getusershell(void) |
| { |
| ssize_t l; |
| if (!f) setusershell(); |
| if (!f) return 0; |
| l = getline(&line, &linesize, f); |
| if (l <= 0) return 0; |
| if (line[l-1]=='\n') line[l-1]=0; |
| return line; |
| } |