Exemple #1
0
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;
}
Exemple #2
0
/*
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;
}