getusershell.c raw

   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  }
  33