コード例 #1
0
ファイル: cw_type_ipaddress.c プロジェクト: 7u83/actube
static struct cw_KTV *from_str ( struct cw_KTV * data, const char *src )
{
	struct sockaddr_storage addr;
	uint8_t * s, * addrptr;
	int rc,l;
	
	rc = sock_strtoaddr(src,(struct sockaddr*)&addr);
	if (!rc)
		return NULL;
		
	
	switch(((struct sockaddr*)&addr)->sa_family){
		case AF_INET:
			addrptr = (uint8_t*)&(((struct sockaddr_in*)(&addr))->sin_addr);
			l = 4;
			break;
		case AF_INET6:
			addrptr = (uint8_t*)&(((struct sockaddr_in6*)(&addr))->sin6_addr);
			l = 16;
			break;
		default:
			return NULL;
	}
	

	s = bstr_create(addrptr,l);
	if ( s == NULL )
		return NULL;

	data->type = &cw_type_ipaddress;
	data->val.ptr = s;
	return data;
	
}
コード例 #2
0
ファイル: discovery.c プロジェクト: jhbsz/actube
/**
 * Run discovery for on address (eg broadcast 255.255.255.255)
 */
static int cw_run_discovery(struct conn *conn, const char *acaddr)
{

	/* get addr of destination */
	struct addrinfo hints;
	struct addrinfo *res, *res0;
	memset(&hints, 0, sizeof(hints));

	hints.ai_socktype = SOCK_DGRAM;
	hints.ai_family = PF_UNSPEC;

	int rc = getaddrinfo(acaddr, conf_control_port, &hints, &res0);
	if (rc) {
		cw_log(LOG_ERR, "Can't connect to AC %s: %s", acaddr, gai_strerror(rc));
		return 0;
	}

	for (res = res0; res; res = res->ai_next) {

		int sockfd;
		int opt;
		sockfd = socket(res->ai_family, SOCK_DGRAM, 0);
		if (sockfd == -1) {
			cw_log(LOG_ERR, "Can't create socket for %s: %s", acaddr,
			       strerror(errno));
			continue;
		}

		opt = 1;
		if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt)) < 0) {
			cw_log(LOG_ERR, "Can't set broadcast sockopt");
		}
		sock_set_recvtimeout(sockfd, 1);
		sock_set_dontfrag(sockfd, 0);

		sock_copyaddr(&conn->addr, res->ai_addr);

		
		if (conf_ip){		
			struct sockaddr bind_address;
			sock_strtoaddr(conf_ip,&bind_address); 
			int brc = bind(sockfd,&bind_address,sock_addrlen(&bind_address));
			if (brc<0) {
				cw_log(LOG_ERR,"Can't bind to %s",sock_addr2str(&bind_address));
				return 0;
			}
		}


		conn->sock = sockfd;
		conn->readfrom = conn_recvfrom_packet;

		run_discovery(conn);

		conn->readfrom=NULL;
		close(sockfd);


	}

	freeaddrinfo(res0);

	return 0;
}
コード例 #3
0
ファイル: shell.c プロジェクト: 7u83/actube
void * run_shell (void * arg)
{
	struct sockaddr_storage server, client;
	socklen_t client_size;
	char sockstr[SOCK_ADDR_BUFSIZE];
	
	int rc;
	const char * addr = "127.0.0.1:5000";
	int sockfd, clientsock;
	int yes;
while(1){
	

	rc = sock_strtoaddr (addr, (struct sockaddr*) &server);
	
	if (! rc) {
		cw_log (LOG_ERR, "Can't parse address '%s', %s", addr, strerror (errno));
	}
	
	sockfd = socket ( ( (struct sockaddr*) &server)->sa_family, SOCK_STREAM, 0);
	
	yes = 1;
	/* reuse address */
	setsockopt (sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof (yes));
	
	
	/* bind address */
	rc =  bind (sockfd, (struct sockaddr*) &server, sizeof (server));
	
	if (rc) {
		cw_log (LOG_ERR, "Can't bind socket address '%s', %s", addr, strerror (errno));
	}
	
	rc = listen (sockfd, 5);
	
	if (rc) {
		cw_log (LOG_ERR, "Can't listen on address '%s', %s", addr, strerror (errno));
	}
	
	
	client_size = sizeof (client);
	clientsock = accept (sockfd, (struct sockaddr*) &client, &client_size);
	
	if (clientsock > 0) {
		sock_addr2str_p (&client, sockstr);
		cw_dbg (DBG_INFO, "Acceptiong session from %s", sockstr);
		printf("New shell lopp\n");
		shell_loop (fdopen (clientsock, "a+"));
		printf("end shell lopp\n");
		close (clientsock);
		printf("close clsock\n");
	}
	
	
	
	cw_dbg (DBG_INFO,"Accepting shell session %i, %s", rc, strerror (errno));
}	
	
	
	
	return NULL;
}