#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>

char *uid2name(int uid)
/* returns the account name corresponding to uid; the name is valid
   until the next call to uid2name */
{
  static char *line = NULL;
  static size_t linesize = 0;
  FILE *passwd = fopen("./passwd","r");

  if (passwd == NULL) {
    fprintf(stderr, "could not open passwd\n");
    exit(1);
  }
  while (getline(&line, &linesize, passwd) != -1) {
    char *lname = strtok(line, ":");
    char *luids;
    strtok(NULL, ":"); /* passwd field */
    luids = strtok(NULL, ":");
    if (strtol(luids, NULL, 10) == uid) {
      fclose(passwd);
      return lname;
    }
  }
  fclose(passwd);
  return "uid not found";
}

int main()
{
  char *uids = NULL;
  size_t uidsize = 0;
  struct mallinfo m;
  
  while (getline(&uids, &uidsize, stdin) != -1) {
    printf("%s\n", uid2name(strtol(uids, NULL, 10)));
  }
  /* Folgendes gibt nur den von malloc() verbrauchten Speicher aus.
     Wenn Ihr Programm nennenswerte Mengen an statisch allokiertem
     Speicher verwendet oder z.B. mit mmap einen Speicherbereich
     allokiert, in den es hineinschreibt (z.B. bei Verwendung von
     strtok), zaehlen Sie die entsprechenden Groessen bitte dazu und
     geben Sie die Summe aus. */
  m = mallinfo();
  fprintf(stderr,"%d\n",m.uordblks + m.hblkhd);
  exit(0);
}
