Beispiel #1
1
static int bind_src_by_address(int sockfd, char *address)
{
	int rc = 0;
	char port[NI_MAXSERV];
	struct sockaddr_storage saddr;

	memset(&saddr, 0, sizeof(struct sockaddr_storage));
	if (resolve_address(address, port, &saddr)) {
		log_error("Could not bind %s to conn.", address);
		return -1;
	}

	switch (saddr.ss_family) {
	case AF_INET:
		rc = bind(sockfd, (struct sockaddr *)&saddr,
			  sizeof(struct sockaddr_in));
		break;
	case AF_INET6:
		rc = bind(sockfd, (struct sockaddr *)&saddr,
			  sizeof(struct sockaddr_in6));
		break;
	default:
		rc = -1;
	}
	if (rc)
		log_error("Could not bind %s to %d.", address, sockfd);
	else
		log_debug(4, "Bound %s to socket fd %d", address, sockfd);
	return rc;
}
/**
 * Function to call with a binary address
 *
 * @param cls closure
 * @param peer identity of the peer
 * @param address binary address (NULL on disconnect)
 */
static void
process_address (void *cls, const struct GNUNET_PeerIdentity *peer,
                 const struct GNUNET_HELLO_Address *address)
{
  if (peer == NULL)
  {
    /* done */
    address_resolution_in_progress = GNUNET_NO;
    pic = NULL;
    if (GNUNET_SCHEDULER_NO_TASK != end)
      GNUNET_SCHEDULER_cancel (end);
    end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL);
    return;
  }
  if (address == NULL)
  {
    FPRINTF (stdout, _("Peer `%s' disconnected\n"), GNUNET_i2s (peer));
    return;
  }

  if (GNUNET_SCHEDULER_NO_TASK != op_timeout)
  	GNUNET_SCHEDULER_cancel (op_timeout);
  op_timeout = GNUNET_SCHEDULER_add_delayed (OP_TIMEOUT,
                                             &operation_timeout, NULL);

  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received address for peer `%s': %s\n",
  		GNUNET_i2s (peer), address->transport_name);
  resolve_address (address, numeric);
}
Beispiel #3
0
const char *format_host(int af, int len, const void *addr,
			char *buf, int buflen)
{
#ifdef RESOLVE_HOSTNAMES
	if (resolve_hosts) {
		const char *n;

		if (len <= 0) {
			switch (af) {
			case AF_INET:
				len = 4;
				break;
			case AF_INET6:
				len = 16;
				break;
			case AF_IPX:
				len = 10;
				break;
#ifdef AF_DECnet
			/* I see no reasons why gethostbyname
			   may not work for DECnet */
			case AF_DECnet:
				len = 2;
				break;
#endif
			default: ;
			}
		}
		if (len > 0 &&
		    (n = resolve_address(addr, len, af)) != NULL)
			return n;
	}
#endif
	return rt_addr_n2a(af, len, addr, buf, buflen);
}
Beispiel #4
0
	resource_address resource_system::resolve_address_to_directory(
		const char* resource_type_name,
		const char* folder,
		const char* id,
		const char* id_source_description) {

		return resolve_address(false, resource_type_name, folder, "", id, id_source_description);
	}
Beispiel #5
0
	resource_address resource_system::resolve_address_to_file(
		const char* resource_type_name,
		const char* folder,
		const char* extensions,
		const char* id,
		const char* id_source_description) {

		return resolve_address(true, resource_type_name, folder, extensions, id, id_source_description);
	}
static int source_address()
{
  if(resolve_address(source_str, &source, NULL) == 0)
    {
      return 0;
    }

  return 1;
}
Beispiel #7
0
void test_labels(void) {
    init_hash_table();
    Instruction* i = new_instruction_label("test", 1);
    TEST_ASSERT_EQUAL_STRING("test", i->opcode);
    TEST_ASSERT(i->type = I_TYPE_LABEL);
    set_label_address("test", 34);
    Address* a = addr_from_label(strdup("test"));
    resolve_address(a);
    TEST_ASSERT_EQUAL_INT_MESSAGE(34, a->immediate, "Incorrect label address");
    free(a);
    free(i);
}
/* [DEM monitoring] gets adapter request URL */
char* dem_get_adapter_request(context_t* context, char* name, char* args, const char* type, int nrpe)
{
	char		buffer[MAXBUFLEN];
	char*		result = NULL;
	option_list_t	opts   = NULL;

	/* Take adapter query fields from plugin arguments, distinguishing
	   between local executions (host_addr as identifier) and NRPE plugin
	   executions (-H plugin argument as identifier) */
	if (!nrpe) {
		char* addr = host_addr;
		snprintf(buffer, sizeof(buffer)-1, DEM_ADAPTER_REQUEST_FORMAT,
		         adapter_url, name, region_id, addr, type);
		buffer[sizeof(buffer)-1] = '\0';
		result = strdup(buffer);
	} else if ((opts = parse_args(args, ":H:nup:t:c:a:")) == NULL) {
		logging(LOG_WARN, context, "Cannot get NRPE plugin options");
		result = ADAPTER_REQUEST_INVALID;
	} else {
		char        addr[INET_ADDRSTRLEN];
		const char* host = NULL;
		size_t      i;

		for (i = 0; opts[i].opt != -1; i++) {
			switch(opts[i].opt) {
				case 'H': {
					host = opts[i].val;
					break;
				}
			}
		}
		if (host == NULL) {
			logging(LOG_WARN, context, "Missing NRPE plugin options");
			result = ADAPTER_REQUEST_INVALID;
		} else if (resolve_address(host, addr, INET_ADDRSTRLEN) == NEB_ERROR) {
			logging(LOG_WARN, context, "Cannot resolve remote address for %s", host);
			result = ADAPTER_REQUEST_INVALID;
		} else {
			snprintf(buffer, sizeof(buffer)-1, DEM_ADAPTER_REQUEST_FORMAT,
			         adapter_url, name, region_id, addr, type);
			buffer[sizeof(buffer)-1] = '\0';
			result = strdup(buffer);
		}
	}

	free_option_list(opts);
	opts = NULL;
	return result;
}
Beispiel #9
0
const char *format_host(int af, int len, const void *addr,
			char *buf, int buflen)
{
#ifdef RESOLVE_HOSTNAMES
	if (resolve_hosts) {
		const char *n;

		len = len <= 0 ? af_byte_len(af) : len;

		if (len > 0 &&
		    (n = resolve_address(addr, len, af)) != NULL)
			return n;
	}
#endif
	return rt_addr_n2a(af, len, addr, buf, buflen);
}
Beispiel #10
0
void NetworkConnector::do_connect(const std::string &address,
                                  uint16_t port)
{
    std::vector<uvw::Addr> addresses = resolve_address(address, port, m_loop);

    if(addresses.size() == 0) {
        if(m_connect_callback != nullptr)
            m_connect_callback(nullptr);

        return;
    }

    for(auto it = addresses.begin(); it != addresses.end(); ++it) {
        m_socket->connect(*it);
    }
}
Beispiel #11
0
static socklen_t wsck_resolve(const char *str, mrp_sockaddr_t *addr,
                              socklen_t size, const char **typep)
{
    mrp_wsckaddr_t *wa = (mrp_wsckaddr_t *)addr;
    socklen_t       len;

    len = resolve_address(str, wa, size);

    if (len <= 0)
        return 0;
    else {
        if (typep != NULL)
            *typep = WSCKP;

        return len;
    }
}
Beispiel #12
0
static void
process_string (void *cls, const char *address)
{
  struct ResolutionContext *rc = cls;
  struct GNUNET_HELLO_Address *addrcp = rc->addrcp;

  if (address != NULL)
  {
    FPRINTF (stdout, _("Peer `%s': %s %s\n"), GNUNET_i2s (&addrcp->peer), addrcp->transport_name, address);
    rc->printed = GNUNET_YES;
  }
  else
  {
    /* done */
    GNUNET_assert (address_resolutions > 0);
    address_resolutions --;
    if (GNUNET_NO == rc->printed)
    {
    	if (numeric == GNUNET_NO)
    	{
    		resolve_address (rc->addrcp, GNUNET_YES ); /* Failed to resolve address, try numeric lookup */
    	}
    	else
      	FPRINTF (stdout, _("Peer `%s': %s <unable to resolve address>\n"), GNUNET_i2s (&addrcp->peer), addrcp->transport_name);
    }
    GNUNET_free (rc->addrcp);
    GNUNET_CONTAINER_DLL_remove (rc_head, rc_tail, rc);
    GNUNET_free (rc);
    if ((0 == address_resolutions) && (iterate_connections))
    {
        if (GNUNET_SCHEDULER_NO_TASK != end)
        {
          GNUNET_SCHEDULER_cancel (end);
          end = GNUNET_SCHEDULER_NO_TASK;
        }
        if (GNUNET_SCHEDULER_NO_TASK != op_timeout)
        {
        	GNUNET_SCHEDULER_cancel (op_timeout);
        	op_timeout = GNUNET_SCHEDULER_NO_TASK;
        }
        ret = 0;
        end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL);
    }
  }
}
Beispiel #13
0
static struct host_entry *add_host_entry(char *target, struct host_entry *cur)
{
  struct host_entry *host_entry;
  static int         number = 0;
  struct sockaddr   *addr;
  char              *canonname;

  if(target == NULL)
    {
      return NULL;
    }

  if(resolve_address(target, &addr, &canonname) == 0)
    {
      return NULL;
    }

  host_entry = malloc(sizeof(struct host_entry));
  if(host_entry == NULL)
    {
      return NULL;
    }

  host_entry->name     = strdup(target);
  host_entry->i        = number; number++;
  host_entry->dns_name = canonname;
  host_entry->addr     = addr;
  host_entry->rx       = 0;
  host_entry->tx       = 0;
  host_entry->next     = NULL;

  /*
   * if we have resolved a DNS name associated with the IP address we print
   * that.  otherwise, we identify this host entry (to the user) with the
   * ip address supplied
   */
  if(host_entry->dns_name != NULL) host_entry->printed = host_entry->dns_name;
  else                             host_entry->printed = host_entry->name;

  /* merge this item into the linked list ... */
  if(cur != NULL) cur->next = host_entry;
  else            head      = host_entry;

  return host_entry;
}
Beispiel #14
0
int main( int argc, char *argv[] )
{
   int ip;
   char *address;

   if( argc != 2 )
   {
      printf( "unknown.host\r\n" );
      exit( 0 );
   }

   ip = atoi( argv[1] );

   address = resolve_address( ip );

   printf( "%s\r\n", address );
   exit( 0 );
}
Beispiel #15
0
Datei: util.c Projekt: atomd/tcpr
int connect_to_tcpr(void)
{
	char *tmp;
	char *host;
	char *port;
	struct sockaddr_in addr;
	int s;
	int err;

	tmp = getenv("TCPR_HOST");
	if (!tmp)
		return -1;
	host = strdup(tmp);
	if (!host)
		return -1;

	tmp = getenv("TCPR_PORT");
	if (!tmp) {
		free(host);
		return -1;
	}
	port = strdup(tmp);
	if (!port) {
		free(host);
		return -1;
	}

	err = resolve_address(&addr, host, port);
	free(host);
	free(port);
	if (err)
		return -1;

	s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (s < 0)
		return -1;

	if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
		close(s);
		return -1;
	}

	return s;
}
Beispiel #16
0
void EventLogger::bind(const std::string &addr)
{
    // We have to make sure our bind happens within the context of the main thread.
    assert(std::this_thread::get_id() == g_main_thread_id);

    m_log.info() << "Opening UDP socket..." << std::endl;
    auto addresses = resolve_address(addr, 7197, g_loop);

    if(addresses.size() == 0) {
        m_log.fatal() << "Failed to bind to EventLogger address " << addr << "\n";
        exit(1);
    }

    m_local = addresses.front();

    m_socket = g_loop->resource<uvw::UDPHandle>();
    m_socket->bind(m_local);
    start_receive();
}
Beispiel #17
0
int client_create(Client *client, EventHandle socket,
                  struct sockaddr_in *address, socklen_t length) {
	log_debug("Creating client from socket (handle: %d)", socket);

	client->socket = socket;
	client->packet_used = 0;

	// create pending request array
	if (array_create(&client->pending_requests, 32,
	                 sizeof(PacketHeader), 1) < 0) {
		log_error("Could not create pending request array: %s (%d)",
		          get_errno_name(errno), errno);

		return -1;
	}

	// get peer name
	client->peer = resolve_address(address, length);

	if (client->peer == NULL) {
		log_warn("Could not get peer name of client (socket: %d): %s (%d)",
		         socket, get_errno_name(errno), errno);

		client->peer = (char *)_unknown_peer_name;
	}

	// add socket as event source
	if (event_add_source(client->socket, EVENT_SOURCE_TYPE_GENERIC, EVENT_READ,
	                     client_handle_receive, client) < 0) {
		if (client->peer != _unknown_peer_name) {
			free(client->peer);
		}

		array_destroy(&client->pending_requests, NULL);

		return -1;
	}

	return 0;
}
Beispiel #18
0
void main( int argc, char *argv[] )
{
    sh_int local, remote;
    int ip;
    char *address, *user;
    
    if ( argc!=4 )
    {
    	printf( "unknown.host\n\r" );
    	exit( 0 );
    }
    
    local  = atoi( argv[1] );
    ip     = atoi( argv[2] );
    remote = atoi( argv[3] );
    
    address=resolve_address( ip );
    user=resolve_username( ip, local, remote );
    
    printf( "%s %s\n\r", address, user );
    
    exit( 0 );
}
Beispiel #19
0
int 
main(int argc, char **argv) {
  dtls_context_t *dtls_context = NULL;
  fd_set rfds, wfds;
  struct timeval timeout;
  unsigned short port = DEFAULT_PORT;
  char port_str[NI_MAXSERV] = "0";
  log_t log_level = LOG_WARN;
  int fd, result;
  int on = 1;
  int opt, res;
  session_t dst;

  dtls_init();
  snprintf(port_str, sizeof(port_str), "%d", port);

  while ((opt = getopt(argc, argv, "p:o:v:")) != -1) {
    switch (opt) {
    case 'p' :
      strncpy(port_str, optarg, NI_MAXSERV-1);
      port_str[NI_MAXSERV - 1] = '\0';
      break;
    case 'o' :
      output_file.length = strlen(optarg);
      output_file.s = (unsigned char *)malloc(output_file.length + 1);
      
      if (!output_file.s) {
	dsrv_log(LOG_CRIT, "cannot set output file: insufficient memory\n");
	exit(-1);
      } else {
	/* copy filename including trailing zero */
	memcpy(output_file.s, optarg, output_file.length + 1);
      }
      break;
    case 'v' :
      log_level = strtol(optarg, NULL, 10);
      break;
    default:
      usage(argv[0], PACKAGE_VERSION);
      exit(1);
    }
  }

  set_log_level(log_level);
  
  if (argc <= optind) {
    usage(argv[0], PACKAGE_VERSION);
    exit(1);
  }
  
  memset(&dst, 0, sizeof(session_t));
  /* resolve destination address where server should be sent */
  res = resolve_address(argv[optind++], &dst.addr.sa);
  if (res < 0) {
    dsrv_log(LOG_EMERG, "failed to resolve address\n");
    exit(-1);
  }
  dst.size = res;

  /* use port number from command line when specified or the listen
     port, otherwise */
  dst.addr.sin.sin_port = htons(atoi(optind < argc ? argv[optind++] : port_str));

  
  /* init socket and set it to non-blocking */
  fd = socket(dst.addr.sa.sa_family, SOCK_DGRAM, 0);

  if (fd < 0) {
    dsrv_log(LOG_ALERT, "socket: %s\n", strerror(errno));
    return 0;
  }

  if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ) < 0) {
    dsrv_log(LOG_ALERT, "setsockopt SO_REUSEADDR: %s\n", strerror(errno));
  }
#if 0
  flags = fcntl(fd, F_GETFL, 0);
  if (flags < 0 || fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0) {
    dsrv_log(LOG_ALERT, "fcntl: %s\n", strerror(errno));
    goto error;
  }
#endif
  on = 1;
#ifdef IPV6_RECVPKTINFO
  if (setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on, sizeof(on) ) < 0) {
#else /* IPV6_RECVPKTINFO */
  if (setsockopt(fd, IPPROTO_IPV6, IPV6_PKTINFO, &on, sizeof(on) ) < 0) {
#endif /* IPV6_RECVPKTINFO */
    dsrv_log(LOG_ALERT, "setsockopt IPV6_PKTINFO: %s\n", strerror(errno));
  }

  dtls_context = dtls_new_context(&fd);
  if (!dtls_context) {
    dsrv_log(LOG_EMERG, "cannot create context\n");
    exit(-1);
  }

  dtls_set_handler(dtls_context, &cb);

  dtls_connect(dtls_context, &dst);

  while (1) {
    FD_ZERO(&rfds);
    FD_ZERO(&wfds);

    FD_SET(fileno(stdin), &rfds);
    FD_SET(fd, &rfds);
    /* FD_SET(fd, &wfds); */
    
    timeout.tv_sec = 5;
    timeout.tv_usec = 0;
    
    result = select(fd+1, &rfds, &wfds, 0, &timeout);
    
    if (result < 0) {		/* error */
      if (errno != EINTR)
	perror("select");
    } else if (result == 0) {	/* timeout */
    } else {			/* ok */
      if (FD_ISSET(fd, &wfds))
	/* FIXME */;
      else if (FD_ISSET(fd, &rfds))
	dtls_handle_read(dtls_context);
      else if (FD_ISSET(fileno(stdin), &rfds))
	handle_stdin();
    }

    if (len)
      try_send(dtls_context, &dst);
  }
  
  dtls_free_context(dtls_context);
  exit(0);
}
Beispiel #20
0
static BOOL send_udp_multicast_of_type(const char *data, int length, ULONG family)
{
    IP_ADAPTER_ADDRESSES *adapter_addresses = NULL, *adapter_addr;
    static const struct in6_addr i_addr_zero;
    struct addrinfo *multi_address;
    ULONG bufferSize = 0;
    LPSOCKADDR sockaddr;
    BOOL ret = FALSE;
    const char ttl = 8;
    ULONG retval;
    SOCKET s;

   /* Resolve the multicast address */
    if (family == AF_INET6)
        multi_address = resolve_address(SEND_ADDRESS_IPV6, SEND_PORT, AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
    else
        multi_address = resolve_address(SEND_ADDRESS_IPV4, SEND_PORT, AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    if (multi_address == NULL)
        return FALSE;

    /* Get size of buffer for adapters */
    retval = GetAdaptersAddresses(family, 0, NULL, NULL, &bufferSize);
    if (retval != ERROR_BUFFER_OVERFLOW) goto cleanup;

    adapter_addresses = (IP_ADAPTER_ADDRESSES *) heap_alloc(bufferSize);
    if (adapter_addresses == NULL) goto cleanup;

    /* Get list of adapters */
    retval = GetAdaptersAddresses(family, 0, NULL, adapter_addresses, &bufferSize);
    if (retval != ERROR_SUCCESS) goto cleanup;

    for (adapter_addr = adapter_addresses; adapter_addr != NULL; adapter_addr = adapter_addr->Next)
    {
        if (adapter_addr->FirstUnicastAddress == NULL) continue;

        sockaddr = adapter_addr->FirstUnicastAddress->Address.lpSockaddr;

        /* Create a socket and bind to the adapter address */
        s = socket(family, SOCK_DGRAM, IPPROTO_UDP);
        if (s == INVALID_SOCKET) continue;

        if (bind(s, sockaddr, adapter_addr->FirstUnicastAddress->Address.iSockaddrLength) == SOCKET_ERROR)
        {
            closesocket(s);
            continue;
        }

        /* Set the multicast interface and TTL value */
        setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, (char *) &i_addr_zero,
            (family == AF_INET6) ? sizeof(struct in6_addr) : sizeof(struct in_addr));
        setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));

        sendto(s, data, length, 0, (SOCKADDR *) multi_address->ai_addr, multi_address->ai_addrlen);
        closesocket(s);
    }

    ret = TRUE;

cleanup:
    freeaddrinfo(multi_address);
    heap_free(adapter_addresses);
    return ret;
}
Beispiel #21
0
static void start_listening(messageStorage *msgStorage, const char *multicastAddress, const char *bindAddress)
{
    struct addrinfo *multicastAddr = NULL, *bindAddr = NULL, *interfaceAddr = NULL;
    listenerThreadParams *parameter = NULL;
    const DWORD receiveTimeout = 500;
    const UINT reuseAddr = 1;
    HANDLE hThread;
    SOCKET s = 0;

    /* Resolve the multicast address */
    multicastAddr = resolve_address(multicastAddress, SEND_PORT, AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP);
    if (multicastAddr == NULL) goto cleanup;

    /* Resolve the binding address */
    bindAddr = resolve_address(bindAddress, SEND_PORT, multicastAddr->ai_family, multicastAddr->ai_socktype, multicastAddr->ai_protocol);
    if (bindAddr == NULL) goto cleanup;

    /* Resolve the multicast interface */
    interfaceAddr = resolve_address(bindAddress, "0", multicastAddr->ai_family, multicastAddr->ai_socktype, multicastAddr->ai_protocol);
    if (interfaceAddr == NULL) goto cleanup;

    /* Create the socket */
    s = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, multicastAddr->ai_protocol);
    if (s == INVALID_SOCKET) goto cleanup;

    /* Ensure the socket can be reused */
    if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuseAddr, sizeof(reuseAddr)) == SOCKET_ERROR) goto cleanup;

    /* Bind the socket to the local interface so we can receive data */
    if (bind(s, bindAddr->ai_addr, bindAddr->ai_addrlen) == SOCKET_ERROR) goto cleanup;

    /* Join the multicast group */
    if (join_multicast_group(s, multicastAddr, interfaceAddr) == SOCKET_ERROR) goto cleanup;

    /* Set the outgoing interface */
    if (set_send_interface(s, interfaceAddr) == SOCKET_ERROR) goto cleanup;

    /* For IPv6, ensure the scope ID is zero */
    if (multicastAddr->ai_family == AF_INET6)
        ((SOCKADDR_IN6 *)multicastAddr->ai_addr)->sin6_scope_id = 0;

    /* Set a 500ms receive timeout */
    if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char *)&receiveTimeout, sizeof(receiveTimeout)) == SOCKET_ERROR) goto cleanup;

    /* Allocate memory for thread parameters */
    parameter = heap_alloc(sizeof(listenerThreadParams));

    parameter->msgStorage = msgStorage;
    parameter->listeningSocket = s;

    hThread = CreateThread(NULL, 0, listening_thread, parameter, 0, NULL);
    if (hThread == NULL) goto cleanup;

    msgStorage->threadHandles[msgStorage->numThreadHandles] = hThread;
    msgStorage->numThreadHandles++;

    goto cleanup_addresses;

cleanup:
    closesocket(s);
    heap_free(parameter);

cleanup_addresses:
    freeaddrinfo(multicastAddr);
    freeaddrinfo(bindAddr);
    freeaddrinfo(interfaceAddr);
}
Beispiel #22
0
int main(int argc, char *argv[])
{
    int opt;
    str destination_hostname = {.length = 0, .s = NULL};
    uint16_t server_port = 8080, destination_port = COAP_DEFAULT_PORT;
    char *endptr;
    struct stat s;

    while((opt = getopt(argc, argv, "D:P:p:f:h")) != EOF) {
        switch(opt) {
            case 'D':
                destination_hostname.s = (unsigned char *)optarg;
                destination_hostname.length = strlen(optarg);
                resolve_address(&destination_hostname, (struct sockaddr *)&destination);
                break;
            case 'P':
                destination_port = (uint16_t)strtoul(optarg, &endptr, 10);
                if(*endptr != '\0') {
                    fprintf(stderr, "error: invalid port number: %s\n", optarg);
                    return EXIT_FAILURE;
                }
                break;
            case 'p':
                server_port = (uint16_t)strtoul(optarg, &endptr, 10);
                if(*endptr != '\0') {
                    fprintf(stderr, "error: invalid port number: %s\n", optarg);
                    return EXIT_FAILURE;
                }
                break;
            case 'f':
                if(stat(optarg, &s) == -1) {
                    if(ENOENT == errno) {
                        /* does not exist */
                        fprintf(stderr, "error: %s: %s\n", optarg, strerror(errno));
                        return EXIT_FAILURE;
                    }
                    else {
                        perror("stat");
                        return EXIT_FAILURE;
                    }
                } else {
                    if(S_ISDIR(s.st_mode)) {
                        /* it's a dir */
                        strncpy(static_files_path, optarg, 63);
                        static_files_path[63] = '\0';
                        fprintf(stderr, "Will serve static files of directory '%s'\n", static_files_path);
                    }
                    else {
                        /* exists but is no dir */
                        fprintf(stderr, "error: %s is not a directory\n", optarg);
                        return EXIT_FAILURE;
                    }
                }
                break;
            case 'h':
                fprintf(stderr, "usage: %s -D coap_host [-P coap_port] [-p HTTP_server_port] [-f static_files_dir]\n",
                        basename(argv[0]));
                return EXIT_SUCCESS;
            default:
                return EXIT_FAILURE;
        }
    }

    if(destination_hostname.s == NULL) {
        fprintf(stderr, "error: please specify the target coap host of the proxy with the -D option\n");
        return EXIT_FAILURE;
    }

    destination.sin_port = htons(destination_port);

    // Register the clean function for when the program exists
    if(atexit(cleanup) != 0) {
        perror("atexit");
        return EXIT_FAILURE;
    }
    // Also call it where a SIGINT is received
    struct sigaction action;
    memset(&action, 0, sizeof(action));
    action.sa_handler = &signal_handler;
    if(sigaction(SIGINT, &action, &old_action) != 0) {
        perror("sigaction");
        return EXIT_FAILURE;
    }

    start_http_server(server_port);
    if(http_daemon == NULL) {
        fprintf(stderr, "error: HTTP server failed to start: %s\n", strerror(errno));
        return EXIT_FAILURE;
    }

    fprintf(stderr, "HTTP server is listening on port %u (using libmicrohttpd %s)\n", server_port, MHD_get_version());

    // Create the CoAP context
    coap_set_log_level(LOG_DEBUG);
    coap_context = coap_create_context("0.0.0.0", NULL);
    coap_register_response_handler(coap_context, coap_response_handler);

    // Now let microhttpd accept HTTP requests and wait for a signal
    pause();

    return EXIT_SUCCESS;
}
Beispiel #23
0
//--    main()              ///{{{1///////////////////////////////////////////
int main( int argc, char* argv[] )
{
	size_t numClients = 1;
	size_t numRepeats = 1;

	const char* serverPort = 0;
	const char* serverAddress = 0;

	// get program arguments (server address and port)
	if( argc < 4 || argc > 6 )
	{
		fprintf( stderr, "Error %s arguments\n", 
			argc < 4 ? "insufficient":"too many" 
		);
		fprintf( stderr, "  synopsis: %s <server> <port> <#num> [<#rep>] [<msg>]\n", 
			argv[0] 
		);
		fprintf( stderr, "    - <#num> -- number of clients to be emulated\n" );
		fprintf( stderr, "    - <#rep> -- number of times message is sent\n" );
		fprintf( stderr, "    - <msg> -- message sent by clients (see below)\n" );
		fprintf( stderr, "\n" );
		fprintf( stderr, "If the client message includes a `%%d' place holder, it\n" );
		fprintf( stderr, "is replaced by an unique client id (0 < cid < #clients)\n" );
		fprintf( stderr, "before the message is sent to the server.\n" );
		fprintf( stderr, "The default message is `%s'\n", g_clientMessage );
		return 1;
	}

	serverPort = argv[2];
	serverAddress = argv[1];

	numClients = atol(argv[3]);

	if( argc >= 5 ) numRepeats = atol(argv[4]);
	if( argc >= 6 ) g_clientMessage = argv[5];

	// print short status
	printf( "Simulating %zu clients.\n", numClients );

	// initialize timer(s)
#	if MEASURE_ROUND_TRIP_TIME
	initialize_timer();
#	endif

	// resolve address of server once
	sockaddr_in servAddr;
	if( !resolve_address( servAddr, serverAddress, serverPort ) )
		return 1;

	// establish N connections (async)
	printf( "Establishing %zu connections... \n", numClients );

	size_t connErrors = 0;
	ConnectionData* connections = new ConnectionData[numClients];

	for( size_t i = 0; i < numClients; ++i )
	{
#		if MEASURE_CONNECT_TIME
		connections[i].connectEnd = connections[i].connectStart = -1.0;
		connections[i].connectStart = get_time_stamp();
#		endif

		connections[i].sock = connect_to_server_nonblock( servAddr );
		connections[i].state = eConnStateConnecting;

		// initialize client aux. data
		connections[i].repeatsLeft = numRepeats-1;
	
#		if MEASURE_ROUND_TRIP_TIME
		connections[i].roundTripEnd = connections[i].roundTripStart = -1.0;
#		endif

		// on error: mark client as dead
		if( -1 == connections[i].sock )
		{
			connections[i].state = eConnStateDead;
			++connErrors;
		}
	}

	if( connErrors > 0 )
	{
		printf( "  %zu errors while establishing connections\n", connErrors );

		if( connErrors == numClients )
		{
			printf( "All clients errored. Bye\n" );
			return 1;
		}
	}

	printf( "  successfully initiated %zu connection attempts!\n", 
		numClients-connErrors );

	// event handling loop
	size_t clientsAlive = numClients - connErrors;

	while( clientsAlive > 0 )
	{
		int maxfd = 0;
		fd_set rset, wset;

		FD_ZERO( &rset ); 
		FD_ZERO( &wset );

		// put active clients into their respective sets
		for( size_t i = 0; i < numClients; ++i )
		{
			switch( connections[i].state )
			{
				case eConnStateSending:
				case eConnStateConnecting:
					FD_SET( connections[i].sock, &wset );
					break;

				case eConnStateReceiving:
					FD_SET( connections[i].sock, &rset );
					break;

				case eConnStateDead: break;
			}

			maxfd = std::max( connections[i].sock, maxfd );
		}

		// wait for any event
		int ret = select( maxfd+1, &rset, &wset, 0, 0 );

		if( 0 == ret )
		{
			continue;
		}

		if( -1 == ret )
		{
			perror( "select()" );
			return 1;
		}

		// handle events
		size_t finishedClients = 0;

		for( size_t i = 0; i < numClients; ++i )
		{
			if( connections[i].state == eConnStateDead ) continue;

			bool keep = true;
			if( FD_ISSET( connections[i].sock, &wset ) )
			{
				keep = client_process_send( i, connections[i] );
			}
			else if( FD_ISSET( connections[i].sock, &rset ) )
			{
				keep = client_process_recv( i, connections[i] );
			}

			if( !keep )
			{
				close( connections[i].sock );

				connections[i].sock = -1;
				connections[i].state = eConnStateDead;

				++finishedClients;
			}
		}

		clientsAlive -= finishedClients;
	}

	// gather and display some statistics
#	if MEASURE_CONNECT_TIME
	{
		double avgTime = 0.0;
		double maxTime = 0.0;
		double minTime = std::numeric_limits<double>::infinity();
		size_t timedItems = 0, erroredItems = 0;

		for( size_t i = 0; i < numClients; ++i )
		{
			if( connections[i].connectEnd < 0.0 )
			{
				++erroredItems;
				continue;
			}
			
			double delta = connections[i].connectEnd - connections[i].connectStart;

			minTime = std::min( delta, minTime );
			maxTime = std::max( delta, maxTime );
			avgTime += delta;
			++timedItems;

#		if VERBOSE
			printf( "  - conn %zu : connect time = %f ms\n", 
				i, delta*1e3 );
#		endif
		}

		avgTime /= timedItems;

		printf( "Connect timing results for %zu successful connections\n",
			timedItems );
		printf( "  - min time: %f ms\n", minTime*1e3 );
		printf( "  - max time: %f ms\n", maxTime*1e3 );
		printf( "  - average time: %f ms\n", avgTime*1e3 );
		printf( " (%zu connections failed!)\n", erroredItems );
	}
#	endif
#	if MEASURE_ROUND_TRIP_TIME
	{
		double avgTime = 0.0;
		double maxTime = 0.0;
		double minTime = std::numeric_limits<double>::infinity();
		size_t timedItems = 0;

		for( size_t i = 0; i < numClients; ++i )
		{
			if( connections[i].roundTripEnd < 0.0 ) continue;
			
			double delta = connections[i].roundTripEnd - connections[i].roundTripStart;

			minTime = std::min( delta, minTime );
			maxTime = std::max( delta, maxTime );
			avgTime += delta;
			++timedItems;

#		if VERBOSE
			printf( "  - conn %zu : round trip time = %f ms for %zu round trips\n", 
				i, delta*1e3, numRepeats );
#		endif
		}

		avgTime /= timedItems;

		printf( "Roundtrip timing results for %zu connections for %zu round trips\n",
			timedItems, numRepeats );
		printf( "  - min time: %f ms\n", minTime*1e3 );
		printf( "  - max time: %f ms\n", maxTime*1e3 );
		printf( "  - average time: %f ms\n", avgTime*1e3 );
	}
#	endif
	
	// clean up
	for( size_t i = 0; i < numClients; ++i )
		close( connections[i].sock );

	delete [] connections;
	
	return 0;
}
Beispiel #24
0
char *resolve_address(char *hostname, nameserver **nameservers, int ns_count) {
    // The hostname we'll be looking up in any recursive call
    char *newhostname = hostname;

    // Stuff we'll use after getting ahold of a nameserver
    uint8_t answerbuf[1500];

    // Build a socket with a timeout
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    if(sock < 0) {
	perror("Creating socket failed: ");
	exit(1);
    }
    struct timeval timeout;
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;
    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));

    // Loop to contact a nameserver
    int chosen_server = rand()%ns_count;
    // The nameserver we'll be using to do the query
    nameserver *active_ns;
    // Number of times left to try contacting a nameserver
    int attempts_left = MAX_ATTEMPTS * ns_count;
    while ( attempts_left-- > 0 ) {
	// Try a nameserver
	active_ns = nameservers[chosen_server];
	in_addr_t nameserver_addr=inet_addr(active_ns->server_addr);

	// construct the query message
	uint8_t query[1500];
	int query_len=construct_query(query,1500,hostname);

	struct sockaddr_in addr;	// internet socket address data structure
	addr.sin_family = AF_INET;
	addr.sin_port = htons(53);	// port 53 for DNS
	addr.sin_addr.s_addr = nameserver_addr; // destination address (any local for now)

	if (debug) {
	    printf("How about nameserver %s?\n", active_ns->server_addr);
	}

	int send_count = sendto(sock, query, query_len, 0,
				(struct sockaddr*)&addr,sizeof(addr));
	if(send_count<0) {
	    perror("Send failed");
	    exit(1);
	}

	// Await the response
	int rec_count = recv(sock,answerbuf,1500,0);

	// Check for errors while receiving
	if ((rec_count < 1) && ((errno == EAGAIN) || (errno == EWOULDBLOCK))) {
	    if (debug) {
		printf("Timed out while waiting for nameserver %s.\n", active_ns->server_addr);
	    }
	    // Try choosing another nameserver randomly
	    chosen_server = rand()%ns_count;
	} else {
	    break;
	}
    }
    if ( attempts_left <= 0 ) {
	fprintf(stderr, "Could not contact any nameservers.\n");
	exit(1);
    }

    if (debug) {
	printf("Resolving %s using server %s out of %d\n",
	       hostname, active_ns->server_addr, ns_count);
    }

    // parse the response to get our answer
    struct dns_hdr *ans_hdr=(struct dns_hdr*)answerbuf;
    uint8_t *answer_ptr = answerbuf + sizeof(struct dns_hdr);

    // now answer_ptr points at the first question.
    int question_count = ntohs(ans_hdr->q_count);
    int answer_count = ntohs(ans_hdr->a_count);
    int auth_count = ntohs(ans_hdr->auth_count);
    int other_count = ntohs(ans_hdr->other_count);

    if (debug) {
	int resource_count = question_count + answer_count + auth_count + other_count;
	printf("%d questions, %d answers, %d authoritative records, and %d others = %d resource records total\n",
	       question_count, answer_count, auth_count, other_count, resource_count);
    }

    // skip past all questions
    int q;
    for(q=0;q<question_count;q++) {
	char string_name[255];
	memset(string_name,0,255);
	int size=from_dns_style(answerbuf,answer_ptr,string_name);
	answer_ptr+=size;
	answer_ptr+=4; //2 for type, 2 for class
    }

    int a;
    int got_answer=0;

    // now answer_ptr points at the first answer. loop through
    // all answers in all sections
    nameserver *new_nameservers[100];
    int ns_index = 0;
    for(a=0;a<answer_count+auth_count+other_count;a++) {
	// first the name this answer is referring to
	char string_name[255];
	int dnsnamelen=from_dns_style(answerbuf,answer_ptr,string_name);
	answer_ptr += dnsnamelen;

	// then fixed part of the RR record
	struct dns_rr* rr = (struct dns_rr*)answer_ptr;
	answer_ptr+=sizeof(struct dns_rr);

	const uint8_t RECTYPE_A=1;
	const uint8_t RECTYPE_NS=2;
	const uint8_t RECTYPE_CNAME=5;
	const uint8_t RECTYPE_SOA=6;
	const uint8_t RECTYPE_PTR=12;
	const uint8_t RECTYPE_AAAA=28;

	if(htons(rr->type)==RECTYPE_A) {
	    char *ip_addr = inet_ntoa(*((struct in_addr *)answer_ptr));

	    if (debug)
		printf("The name %s resolves to IP addr: %s\n",
		       string_name,
		       ip_addr);

	    got_answer=1;

	    // Are we done?
	    if ( !strcasecmp(string_name, newhostname) ) {
		delete_nameservers(new_nameservers, ns_index);
		if (newhostname != hostname)
		    free(newhostname);
		return strdup(ip_addr);
	    }

	    // Try to match some IPs up with symbolic hostnames for nameservers
	    int i;
	    for ( i=0; i<ns_index; i++ ) {
		nameserver *new_ns = new_nameservers[i];
		if ( !strcasecmp(string_name,new_ns->server) ) {
		    new_ns->server_addr = strdup(ip_addr);
		    break;
		}
	    }
	}
	// NS record
	else if(htons(rr->type)==RECTYPE_NS) {
	    char ns_string[255];
	    int ns_len=from_dns_style(answerbuf,answer_ptr,ns_string);
	    if(debug)
		printf("The name %s can be resolved by NS: %s\n",
		       string_name, ns_string);

	    // Keep maximum number of nameservers
	    if ( ns_index < MAX_NAMESERVERS ) {
		nameserver *new_ns = nameserver_create(ns_string, NULL);
		new_nameservers[ns_index++] = new_ns;
	    }

	    got_answer=1;
	}
	// CNAME record
	else if(htons(rr->type)==RECTYPE_CNAME) {
	    char ns_string[255];
	    int ns_len=from_dns_style(answerbuf,answer_ptr,ns_string);

	    if(debug) {
		printf("The name %s is also known as %s.\n",
		       string_name, ns_string);
	    }

	    if ( !strcasecmp(string_name,newhostname) ) {
		if ( newhostname != hostname )
		    free(newhostname);
		newhostname = strdup(ns_string);
	    }

	    got_answer=1;
	}
	// PTR record
	else if(htons(rr->type)==RECTYPE_PTR) {
	    char ns_string[255];
	    int ns_len=from_dns_style(answerbuf,answer_ptr,ns_string);

	    if (debug) {
		printf("The host at %s is also known as %s.\n",
		       string_name, ns_string);
	    }

	    got_answer=1;

	    delete_nameservers(new_nameservers, ns_index);
	    if (newhostname != hostname)
		free(newhostname);
	    return strdup(ns_string);
	}
	// SOA record
	else if(htons(rr->type)==RECTYPE_SOA) {
	    if(debug) {
		printf("Ignoring SOA record\n");
	    }
	}
	// AAAA record
	else if(htons(rr->type)==RECTYPE_AAAA)  {
	    if(debug) {
		printf("Ignoring IPv6 record\n");
	    }
	}
	else {
	    if(debug) {
		printf("got unknown record type %hu\n",htons(rr->type));
	    }
	}

	answer_ptr+=htons(rr->datalen);
    }

    shutdown(sock,SHUT_RDWR);
    close(sock);

    if ( ns_index > 0 ) {
	int i;
	for ( i=0; i<ns_index; i++ ) {
	    nameserver *ns = new_nameservers[i];
	    // Make sure we have the IP address of this nameserver
	    if ( !ns->server_addr ) {
		if (debug) {
		    printf("Need to resolve IP address of nameserver %s\n", ns->server);
		}

		ns->server_addr = resolve_address(ns->server, root_servers, num_root_servers);

		if ( !ns->server_addr && debug ) {
		    printf("Failed to retrieve IP address for %s.\n", ns->server);
		}
	    }
	}

	if (debug) {
	    printf("now resolving the hostname %s...\n", newhostname);
	}

	// Free old nameservers array
	char *result = resolve_address(newhostname, new_nameservers, ns_index);
	if (newhostname != hostname)
	    free(newhostname);
	delete_nameservers(new_nameservers, ns_index);
	return result;
    }

    if (newhostname != hostname)
	free(newhostname);
    delete_nameservers(new_nameservers, ns_index);

    return NULL;
}
int
scan_metadata_icy(char *url, struct media_file_info *mfi)
{
  struct evhttp_connection *evcon;
  struct evhttp_request *req;
  struct icy_ctx *ctx;
  int ret;
  int i;

  status = ICY_INIT;

  /* We can set this straight away */
  mfi->url = strdup(url);

  ctx = (struct icy_ctx *)malloc(sizeof(struct icy_ctx));
  if (!ctx)
    {
      DPRINTF(E_LOG, L_SCAN, "Out of memory for ICY metadata context\n");

      goto no_icy;
    }
  memset(ctx, 0, sizeof(struct icy_ctx));

  ctx->url = evhttp_encode_uri(url);

  /* TODO https */
  av_url_split(NULL, 0, NULL, 0, ctx->hostname, sizeof(ctx->hostname), &ctx->port, ctx->path, sizeof(ctx->path), ctx->url);
  if (ctx->port < 0)
    ctx->port = 80;

  /* Resolve IP address */
  ret = resolve_address(ctx->hostname, ctx->address, sizeof(ctx->address));
  if (ret < 0)
    {
      DPRINTF(E_LOG, L_SCAN, "Could not find IP address of %s\n", ctx->hostname);

      return -1;
    }

  DPRINTF(E_DBG, L_SCAN, "URL %s converted to hostname %s, port %d, path %s, IP %s\n", ctx->url, ctx->hostname, ctx->port, ctx->path, ctx->address);

  /* Set up connection */
  evcon = evhttp_connection_new(ctx->address, (unsigned short)ctx->port);
  if (!evcon)
    {
      DPRINTF(E_LOG, L_SCAN, "Could not create connection to %s\n", ctx->hostname);

      goto no_icy;
    }
  evhttp_connection_set_base(evcon, evbase_main);
  evhttp_connection_set_timeout(evcon, ICY_TIMEOUT);
  
  /* Set up request */
  req = evhttp_request_new(scan_icy_request_cb, mfi);
  if (!req)
    {
      DPRINTF(E_LOG, L_SCAN, "Could not create request to %s\n", ctx->hostname);

      evhttp_connection_free(evcon);
      goto no_icy;
    }
  req->header_cb = scan_icy_header_cb;
  evhttp_add_header(req->output_headers, "Host", ctx->hostname);
  evhttp_add_header(req->output_headers, "Icy-MetaData", "1");

  /* Make request */
  status = ICY_WAITING;
  ret = evhttp_make_request(evcon, req, EVHTTP_REQ_GET, ctx->path);
  if (ret < 0)
    {
      DPRINTF(E_LOG, L_SCAN, "Could not make request to %s\n", ctx->hostname);

      status = ICY_DONE;
      evhttp_connection_free(evcon);
      goto no_icy;
    }
  DPRINTF(E_INFO, L_SCAN, "Making request to %s asking for ICY (Shoutcast) metadata\n", url);

  /* Can't count on server support for ICY metadata, so
   * while waiting for a reply make a parallel call to scan_metadata_ffmpeg.
   * This call will also determine final return value.
   */
 no_icy:
  ret = scan_metadata_ffmpeg(url, mfi);

  /* Wait till ICY request completes or we reach timeout */
  for (i = 0; (status == ICY_WAITING) && (i <= ICY_TIMEOUT); i++)
    sleep(1);

  free_icy(ctx);

  DPRINTF(E_DBG, L_SCAN, "scan_metadata_icy exiting with status %d after waiting %d sec\n", status, i);

  return ret;
}
Beispiel #26
0
int send_data(lo_address a, lo_server from, char *data, const size_t data_len)
{
    int ret=0;
    int sock=-1;

#ifdef WIN32
    if(!initWSock()) return -1;
#endif

    if (data_len > LO_MAX_MSG_SIZE) {
	a->errnum = 99;
	a->errstr = "Attempted to send message in excess of maximum "
		    "message size";
	return -1;
    }
    
    // Resolve the destination address, if not done already
    if (!a->ai) {
	ret = resolve_address( a );
	if (ret) return ret;
    }

    // Re-use existing socket?
    if (from) {
	sock = from->sockets[0].fd;
    } else if (a->protocol == LO_UDP && lo_client_sockets.udp!=-1) {
	sock = lo_client_sockets.udp;
    } else {
	if (a->socket==-1) {
	    ret = create_socket( a );
	    if (ret) return ret;
    	}
	sock = a->socket;
    }



    // Send Length of the following data
    if (a->protocol == LO_TCP) {
	int32_t size = htonl(data_len); 
	ret = send(sock, &size, sizeof(size), MSG_NOSIGNAL); 
    }
    
    // Send the data
    if (a->protocol == LO_UDP) {
        if (a->ttl >= 0) {
            unsigned char ttl = (unsigned char)a->ttl;
            setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl));
        }
        ret = sendto(sock, data, data_len, MSG_NOSIGNAL,
                     a->ai->ai_addr, a->ai->ai_addrlen);
    } else {
		ret = send(sock, data, data_len, MSG_NOSIGNAL);
    }

    if (a->protocol == LO_TCP && ret == -1) {
        close(a->socket);
        a->socket=-1;
    }
	
    if (ret == -1) {
		a->errnum = geterror();
		a->errstr = NULL;
    } else {
		a->errnum = 0;
		a->errstr = NULL;
    }

    return ret;
}
Beispiel #27
0
int main(int argc, char** argv)
{
    if(argc<2) usage();

    char *hostname=0;
    char *given_ns=0;

    char *optString = "-d-n:-i:";
    int opt = getopt( argc, argv, optString );

    while( opt != -1 ) {
	switch( opt ) {
	case 'd':
	    debug = 1;
	    break;
	case 'n':
	    given_ns = optarg;
	    break;
	case 'i':
	    hostname = optarg;
	    break;
	case '?':
	    usage();
	    exit(1);
	default:
	    usage();
	    exit(1);
	}
	opt = getopt( argc, argv, optString );
    }

    /* initialize root servers list */
    if (!given_ns) {
    	// Use root-servers.txt
	num_root_servers = 0;
    	FILE *servers_in = fopen("root-servers.txt","r");
    	if (!servers_in) {
    	    perror("fopen");
    	    exit(1);
    	}

    	char root_addr[256];
	for ( num_root_servers=0; num_root_servers<MAX_NAMESERVERS; num_root_servers++ ) {
	    if (EOF != fscanf(servers_in, "%s\n", &root_addr[0])) {
		nameserver *ns = nameserver_create(NULL, root_addr);
		root_servers[num_root_servers] = ns;
	    } else {
		fclose(servers_in);
		break;
	    }
	}

    } else {
	nameserver *ns = nameserver_create(NULL, given_ns);
	root_servers[0] = ns;
	num_root_servers = 1;
    }

    if (!hostname) {
	usage();
	exit(1);
    }

    // Setup random number generation
    srand(time(NULL));

    // Try to resolve the given servername or ip address
    char *result = resolve_address(hostname, root_servers, num_root_servers);
    if ( result ) {
	printf("%s resolves to %s\n", hostname, result);
    } else {
	printf("Could not resolve the name %s\n", hostname);
    }

    // Cleanup
    free(result);
    delete_nameservers(root_servers, num_root_servers);

    return 0;
}
Beispiel #28
0
int main(int argc, char **argv) {
	void		*tabpoll;
	dia_context_t	*dia;
	int result;
	char addr_str[200] = "::1";
	char port_str[10] = "5683";
	int opt;
	int log_level = 0;
	int count = 1, i;
	int group = 1;
	char loss = 0;

	while ((opt = getopt(argc, argv, "A:p:v:m:f:n:g:R:l")) != -1) {
		switch (opt) {
		case 'A' :
			strncpy(addr_str, optarg, 200-1);
			addr_str[200 - 1] = '\0';
			break;
		case 'p' :
			strncpy(port_str, optarg, 10-1);
			port_str[10 - 1] = '\0';
			break;
		case 'm' :
			strcpy (method, optarg);
			break;
		case 'R' :
			strcpy (reqEntity, optarg);
			break;
		case 'l' :
			loss = 1;
			break;
		case 'f' :
			strcpy (file, optarg);
			break;
		case 'n' :
			count = atoi(optarg);
			break;
		case 'g' :
			group = atoi(optarg);
			break;
		case 'v' :
			log_level = strtol(optarg, NULL, 10);
			break;
		default:
			usage();
			exit( 1 );
		}
	}

	if (optind == argc) {
		fprintf (stderr, "You must specify a targetID\n");
		usage();
		exit (1);
	}

	char *targetID	= argv[optind];

	dia = dia_createContext(&callbacks);
	if (!dia) {
		fprintf (stderr, "dia_createContext failed\n");
		usage();
		exit (1);
	}

	dia_withLoss (dia, loss);

	tabpoll = rtl_pollInit ();

	sock	= resolve_address(addr_str, &addr);
	addr.addr.sin.sin_port = htons(atoi(port_str));

	rtl_pollAdd (tabpoll, sock, network_input, network_request, dia, NULL);

	signal(SIGINT, handle_sigint);

	for	(i=0; i<count; i++) {
		if	(!strcmp(method, "create"))
			do_create (dia, targetID, group);
		else if	(!strcmp(method, "retrieve"))
			do_retrieve (dia, targetID, group);
		else if	(!strcmp(method, "update"))
			do_update (dia, targetID, group);
		else if	(!strcmp(method, "delete"))
			do_delete (dia, targetID, group);
		else {
			usage ();
			exit (1);
		}

		dIa_status (dia);

		while ( more ) {
			struct dia_timeval tv;
			dIa_nextTimer (dia, &tv);
			result = rtl_poll(tabpoll, (tv.tv_sec*1000) + (tv.tv_usec/1000));
		}

		dIa_status (dia);

		if	(quit)
			break;
	}

	return 0;
}
Beispiel #29
0
int main(int argc, char **argv)
{
	struct sockaddr_in pulladdr;
	struct sockaddr_in pushaddr;
	int pullsock;
	int pushsock;
	int err;
	int recovering = 0;
	struct arguments args;
	struct log *log = NULL;
#ifdef TCPR
	int tcprsock;
	struct tcpr_ip4 state;
#endif

	//OpenSSL
	SSL_load_error_strings();
	ERR_load_BIO_strings();
	ERR_load_SSL_strings();
	SSL_library_init();
	OpenSSL_add_all_algorithms();
	/////////

	memset(&args, 0, sizeof(args));
	parse_arguments(&args, argc, argv);

	err = resolve_address(&pulladdr, args.pullhost, args.pullport);
	if (err) {
		fprintf(stderr, "%s:%s: %s\n", args.pullhost, args.pullport,
			gai_strerror(err));
		exit(EXIT_FAILURE);
	}

	err = resolve_address(&pushaddr, args.pushhost, args.pushport);
	if (err) {
		fprintf(stderr, "%s:%s: %s\n", args.pushhost, args.pushport,
			gai_strerror(err));
		exit(EXIT_FAILURE);
	}

	if (!args.port)
		args.port = 10000;

#ifdef TCPR
	printf("Connecting to TCPR.\n");
	tcprsock = connect_to_tcpr(&pulladdr);
	if (tcprsock < 0) {
		perror("Connecting to TCPR");
		exit(EXIT_FAILURE);
	}
	
	pulladdr1 = pulladdr;
	port1 = args.port;
	tcpr_sock = tcprsock;
	
	printf("Waiting for existing master, if any.\n");
	if (get_tcpr_state(&state, tcprsock, &pulladdr, args.port) < 0) {
		perror("Getting TCPR state");
		exit(EXIT_FAILURE);
	}
	
	recovering = wait_for_master(&state);
	if (recovering) {
		printf("Recovering from failed master.\n");
		if (claim_tcpr_state(&state, tcprsock, &pulladdr, args.port) < 0) {
			perror("Claiming TCPR state");
			exit(EXIT_FAILURE);
		}
	} else {
		printf("Creating fresh connection.\n");
	}

	handle_slaves();
#endif /* TCPR */
			
	printf("Connecting to data source.\n");
	pullsock = connect_to_peer(&pulladdr, args.port);
	if (pullsock < 0) {
		perror("Connecting to data source");
		exit(EXIT_FAILURE);
	}

	printf("Connecting to data sink.\n");
	pushsock = connect_to_peer(&pushaddr, 0);
	if (pushsock < 0) {
		perror("Connecting to data sink");
		exit(EXIT_FAILURE);
	}
	
	if (args.logprefix) {
		printf("Opening log.\n");
		log = log_start(args.logprefix, args.logbytes, args.logcount);
	}

#ifdef TCPR
	if (get_tcpr_state(&state, tcprsock, &pulladdr, args.port) < 0) {
		perror("Getting TCPR state");
		exit(EXIT_FAILURE);
	}
#endif

	if (!recovering) {
		printf("Sending ID to data source.\n");
		if (send(pullsock, args.id, strlen(args.id), 0) < 0) {
			perror("Sending session ID");
			exit(EXIT_FAILURE);
		}
	}
	
	get_tcpr_state(&state1, tcpr_sock, &pulladdr1, port1);
	get_tcpr_state(&state, tcpr_sock, &pulladdr, args.port);
	
	//BIO_set_callback(sbio,test_write);
	//BIO_set_callback(sbio1,test_write);
	printf("Copying data from source to sink.\n");
#ifdef TCPR
	if (copy_data(&state, log, pullsock, pushsock, tcprsock) < 0) {
#else
	if (copy_data(log, pullsock, pushsock) < 0) {
#endif
		perror("Copying data");
		exit(EXIT_FAILURE);
	}

	printf("Done.\n");
#ifdef TCPR
	close(tcprsock);
#endif
	close(pullsock);
	close(pushsock);
	return EXIT_SUCCESS;
}
Beispiel #30
0
int 
main(int argc, char **argv) {
  dtls_context_t *the_context = NULL;
  log_t log_level = DTLS_LOG_WARN;
  fd_set rfds, wfds;
  struct timeval timeout;
  int fd, opt, result;
  int on = 1;
  int ecdh_anon_enalbe = DTLS_CIPHER_DISABLE;
  struct sockaddr_in6 listen_addr;

  memset(&listen_addr, 0, sizeof(struct sockaddr_in6));

  /* fill extra field for 4.4BSD-based systems (see RFC 3493, section 3.4) */
#if defined(SIN6_LEN) || defined(HAVE_SOCKADDR_IN6_SIN6_LEN)
  listen_addr.sin6_len = sizeof(struct sockaddr_in6);
#endif

  listen_addr.sin6_family = AF_INET6;
  listen_addr.sin6_port = htons(DEFAULT_PORT);
  listen_addr.sin6_addr = in6addr_any;

  while ((opt = getopt(argc, argv, "A:p:v:a:")) != -1) {
    switch (opt) {
    case 'A' :
      if (resolve_address(optarg, (struct sockaddr *)&listen_addr) < 0) {
	fprintf(stderr, "cannot resolve address\n");
	exit(-1);
      }
      break;
    case 'p' :
      listen_addr.sin6_port = htons(atoi(optarg));
      break;
    case 'v' :
      log_level = strtol(optarg, NULL, 10);
      break;
    case 'a':
      if( strcmp(optarg, "enable") == 0)
          ecdh_anon_enalbe = DTLS_CIPHER_ENABLE;
      break;
    default:
      usage(argv[0], dtls_package_version());
      exit(1);
    }
  }

  dtls_set_log_level(log_level);

  /* init socket and set it to non-blocking */
  fd = socket(listen_addr.sin6_family, SOCK_DGRAM, 0);

  if (fd < 0) {
    dtls_alert("socket: %s\n", strerror(errno));
    return 0;
  }

  if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ) < 0) {
    dtls_alert("setsockopt SO_REUSEADDR: %s\n", strerror(errno));
  }
#if 0
  flags = fcntl(fd, F_GETFL, 0);
  if (flags < 0 || fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0) {
    dtls_alert("fcntl: %s\n", strerror(errno));
    goto error;
  }
#endif
  on = 1;
#ifdef IPV6_RECVPKTINFO
  if (setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on, sizeof(on) ) < 0) {
#else /* IPV6_RECVPKTINFO */
  if (setsockopt(fd, IPPROTO_IPV6, IPV6_PKTINFO, &on, sizeof(on) ) < 0) {
#endif /* IPV6_RECVPKTINFO */
    dtls_alert("setsockopt IPV6_PKTINFO: %s\n", strerror(errno));
  }

  if (bind(fd, (struct sockaddr *)&listen_addr, sizeof(listen_addr)) < 0) {
    dtls_alert("bind: %s\n", strerror(errno));
    goto error;
  }

  dtls_init();

  the_context = dtls_new_context(&fd);

  /* enable/disable tls_ecdh_anon_with_aes_128_cbc_sha */
  dtls_enables_anon_ecdh(the_context, ecdh_anon_enalbe);

  dtls_set_handler(the_context, &cb);

  while (1) {
    FD_ZERO(&rfds);
    FD_ZERO(&wfds);

    FD_SET(fd, &rfds);
    /* FD_SET(fd, &wfds); */
    
    timeout.tv_sec = 5;
    timeout.tv_usec = 0;
    
    result = select( fd+1, &rfds, &wfds, 0, &timeout);
    
    if (result < 0) {		/* error */
      if (errno != EINTR)
	perror("select");
    } else if (result == 0) {	/* timeout */
    } else {			/* ok */
      if (FD_ISSET(fd, &wfds))
	;
      else if (FD_ISSET(fd, &rfds)) {
	dtls_handle_read(the_context);
      }
    }
  }
  
 error:
  dtls_free_context(the_context);
  exit(0);
}