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; }
/** * 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; }
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; }