int main(int argc, char **argv) { char *call = NULL; char *filename = NULL; FILE *input = NULL; int ret; int c; while ((c = getopt(argc, argv, "c:f:")) != -1) { switch (c) { case 'c': call = optarg; break; case 'f': filename = optarg; break; } } if (call == NULL || filename == NULL) { usage(argv[0]); return 1; } input = fopen(filename, "r"); if (input == NULL) { fprintf(stderr, "failed to open %s\n", filename); return 255; } ret = nss_lookup(call, input); fclose(input); return ret; }
/* listen for local connection */ void* nss_loop( void* _ ) { ssize_t rc; struct addrinfo hints, *servinfo, *p; struct timeval tv; int sockfd; IP clientaddr, sockaddr; char hostname[256]; UCHAR host_id[SHA_DIGEST_LENGTH]; char addrbuf[FULL_ADDSTRLEN+1]; socklen_t addr_len = sizeof(IP); memset( &hints, 0, sizeof(hints) ); hints.ai_flags = AI_PASSIVE; hints.ai_family = AF_INET6; hints.ai_socktype = SOCK_DGRAM; if( (rc = getaddrinfo( "::1", NULL, &hints, &servinfo )) == 0 ) { for( p = servinfo; p != NULL; p = p->ai_next ) { memset( &sockaddr, 0, sizeof(IP) ); sockaddr = *((IP*) p->ai_addr); sockaddr.sin6_port = htons( MASALA_NSS_PORT ); freeaddrinfo( servinfo ); break; } } else { log_err( "NSS: getaddrinfo failed: %s", gai_strerror( rc ) ); return NULL; } sockfd = socket( PF_INET6, SOCK_DGRAM, IPPROTO_UDP ); if( sockfd < 0 ) { log_err( "NSS: Failed to create socket: %s", strerror( errno ) ); return NULL; } /* Set receive timeout */ tv.tv_sec = 1; tv.tv_usec = 0; rc = setsockopt( sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv) ); if( rc < 0 ) { log_err( "NSS: Failed to set socket option: %s", strerror( errno ) ); return NULL; } rc = bind( sockfd, (struct sockaddr*) &sockaddr, sizeof(IP) ); if( rc < 0 ) { log_err( "NSS: Failed to bind socket to address: %s", strerror( errno ) ); return NULL; } log_info( "NSS: Bind socket to %s.", addr_str( &sockaddr, addrbuf ) ); while( _main->status == MAIN_ONLINE ) { rc = recvfrom( sockfd, hostname, sizeof( hostname ), 0, (struct sockaddr *) &clientaddr, &addr_len ); if( rc <= 0 || rc >= sizeof( hostname ) ) { continue; } hostname[rc] = '\0'; /* Validate hostname */ if ( !str_isValidHostname( (char*) hostname, strlen( hostname ) ) ) { log_warn( "NSS: Invalid hostname for lookup: '%s'", hostname ); continue; } /* That is the lookup key */ p2p_compute_id( host_id, hostname ); nss_lookup( sockfd, &clientaddr, host_id ); } return NULL; }