前にこんなの書いたなぁ。
ファイルから一行取得する関数。

ファイルの一行目に何文字あろうと、
全部がんばってとってきてヒープに格納するやつ

char* fstralloc( FILE* istream ){return __fstralloc( istream, 0 );}
char* __fstralloc( FILE* istream, int readsize )
{
  int i = 0;
  char linebuf[BUFSIZ+1];
  do{
    linebuf[i] = (char)fgetc( istream );
    if( linebuf[i]==EOF || linebuf[i]=='\n' ){
      linebuf[i]='\0';
      return strcpy( &(((char*)malloc( (readsize+i+1)*sizeof(char) ))[readsize]), linebuf ) - readsize;
    }
  }while(BUFSIZ>++i);
  return memcpy( &__fstralloc( istream, readsize+BUFSIZ )[readsize], linebuf, BUFSIZ ) - readsize;
}

あんま、再帰をうまく利用してるって感じはしないけど。
しかし、今見るとなにやってるかぜんぜんわからん(藁