#define _GNU_SOURCE
#include <dlfcn.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int getaddrinfo(const char *node,const char *service,const struct addrinfo *hints,struct addrinfo **res){
  static int (*real)(const char*,const char*,const struct addrinfo*,struct addrinfo**);
  if(!real) real=dlsym(RTLD_NEXT,"getaddrinfo");
  const char *order=getenv("FIXTURE_ADDRS");
  if(!node || strcmp(node,"fixture.invalid") || !order) return real(node,service,hints,res);
  char *copy=strdup(order),*save=0,*part=strtok_r(copy,",",&save);
  struct addrinfo *head=0,*tail=0;
  while(part){
    struct addrinfo *item=0; struct addrinfo h={0};
    if(hints) h=*hints; h.ai_flags|=AI_NUMERICHOST; h.ai_family=AF_INET;
    int r=real(part,service,&h,&item); if(r){free(copy);return r;}
    fprintf(stderr,"FIXTURE resolver ordered address: %s\n",part);
    if(tail) tail->ai_next=item; else head=item;
    tail=item; while(tail->ai_next)tail=tail->ai_next;
    part=strtok_r(NULL,",",&save);
  }
  free(copy); *res=head; return 0;
}
