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