#define _GNU_SOURCE #include #include #include 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) { if (!f) setusershell(); if (!f) return 0; do { ssize_t l = getline(&line, &linesize, f); if (l <= 0) return 0; } while (line[0] != '/'); line[strcspn(line, "#\n")] = 0; return line; }