#include #include #include #include #include #include #include extern int h_errno; #include #define ALIGN(idx) { \ if (idx % sizeof(void*)) \ idx += (sizeof(void*) - idx % sizeof(void*)); /* Align on 32 bit boundary */ \ } enum nss_status _nss_vdn_gethostbyname2_r( const char *name, int af, struct hostent * result, char *buffer, size_t buflen, int *errnop, int *h_errnop) { //fprintf(stderr, "vdn_gethostbyname2_r : %s\n", name); FILE *fp; char line[80]; int s; size_t idx=0; if(af != AF_INET) { *errnop = EAFNOSUPPORT; *h_errnop = HOST_NOT_FOUND; return NSS_STATUS_UNAVAIL; } char cmd[200]="/etc/vdn/allocators/resolv"; if (access(cmd, F_OK) != 0) strcpy(cmd, "/home/davalan/vdn-bullseye/allocators/resolv"); if (access(cmd, F_OK) != 0) { perror("access"); *errnop = EAFNOSUPPORT; *h_errnop = HOST_NOT_FOUND; return NSS_STATUS_UNAVAIL; } strcat(cmd, " "); strcat(cmd, name); if((fp = popen(cmd , "r")) == NULL) { perror("open"); exit(1); } if(fgets(line, sizeof line, fp) == NULL) { *errnop = EAFNOSUPPORT; *h_errnop = HOST_NOT_FOUND; return NSS_STATUS_UNAVAIL; } line[strlen(line)-1]=0; //fprintf(stderr,"line:%s\n", line); pclose(fp); //char *bufStart=buffer; strcpy(buffer+idx, name); result->h_name=buffer; idx+=strlen(name)+1; ALIGN(idx); result->h_addrtype=AF_INET; result->h_length=4; //fprintf(stderr, "name ok\n"); s = inet_pton(AF_INET, line, buffer+idx); if (s <= 0) { if (s == 0) { *errnop = EAFNOSUPPORT; *h_errnop = HOST_NOT_FOUND; return NSS_STATUS_UNAVAIL; } else { perror("inet_pton"); exit(1); } } result->h_addr_list=(char **)buffer+idx; result->h_addr_list[0]=buffer+idx; result->h_addr_list[1]=NULL; idx+=2*sizeof(char *); result->h_aliases=(char **)buffer+idx; result->h_aliases[0]=NULL; *errnop = 0; *h_errnop = 0; return NSS_STATUS_SUCCESS; }