| #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; |
| } |