diff --git a/y_socket_t/Makefile b/y_socket_t/Makefile index d136246..adc682d 100644 --- a/y_socket_t/Makefile +++ b/y_socket_t/Makefile @@ -6,8 +6,10 @@ SOCDIR=$(PWD) #$(wildcard $(PWD)/**/include) YLISTDIR=$(PWD)/../list_t +YWORKDIR=$(PWD)/../y_worker_t -INCLUDE=-I$(INCLUDE_DIRS) -I$(YLISTDIR)/src + +INCLUDE=-I$(INCLUDE_DIRS) -I$(YLISTDIR)/src -I$(YWORKDIR)/include CFLAGS=-g -lpthread -Wall -Werror -fpic $(INCLUDE) #"-D DEBUG=1" #LDFLAGS= @@ -21,13 +23,15 @@ YNODESRC_O=$(YNODESRC:.c=.o) YLISTSRC=$(YLISTDIR)/src/list_t/list_t.c YLISTSRC_O=$(YLISTSRC:.c=.o) +WORKSRC_0=$(YWORKDIR)/src/y_worker_t/y_worker_t.o +YTASKSRC_0=$(YWORKDIR)/src/y_worker_t/y_task_t.o TOPTARGETS := all clean -DEPS=$(YLISTDIR) +DEPS=$(YLISTDIR) $(YWORKDIR) -OBJ=$(YSOCKSRC_O) $(YNODESRC_O) $(YLISTSRC_O) +OBJ=$(YSOCKSRC_O) $(YNODESRC_O) $(YLISTSRC_O) $(WORKSRC_0) $(YTASKSRC_0) $(TOPTARGETS): $(DEPS) diff --git a/y_socket_t/include/y_socket_t/y_node_t.h b/y_socket_t/include/y_socket_t/y_node_t.h index e05a672..a4b7b68 100644 --- a/y_socket_t/include/y_socket_t/y_node_t.h +++ b/y_socket_t/include/y_socket_t/y_node_t.h @@ -26,6 +26,6 @@ int y_NODE_T_cmp(y_NODE_T nodeA, y_NODE_T nodeB); struct list_y_NODE_T * search_node_in_list_y_NODE_T(struct main_list_y_NODE_T *listNodes, y_NODE_T node); int set_addr_y_NODE_T(y_NODE_T *node, char * addrStr); - +void set_port_y_NODE_T(y_NODE_T *node, int port); #endif /* __Y_NODE_T_H__C */ diff --git a/y_socket_t/src/y_socket_t/y_node_t.c b/y_socket_t/src/y_socket_t/y_node_t.c index 40fc72e..3cc15ed 100644 --- a/y_socket_t/src/y_socket_t/y_node_t.c +++ b/y_socket_t/src/y_socket_t/y_node_t.c @@ -74,3 +74,13 @@ int set_addr_y_NODE_T(y_NODE_T *node, char * addrStr){ } +void set_port_y_NODE_T(y_NODE_T *node, int port){ + int af = node->addr.ss_family; + if(af==AF_INET) + ((struct sockaddr_in*)(&(node->addr)))->sin_port = port; + else if(af == AF_INET6) + ((struct sockaddr_in6*)(&(node->addr)))->sin6_port = port; + +} + + diff --git a/y_socket_t/src/y_socket_t/y_socket_t.c b/y_socket_t/src/y_socket_t/y_socket_t.c index f0839fa..2a2573b 100644 --- a/y_socket_t/src/y_socket_t/y_socket_t.c +++ b/y_socket_t/src/y_socket_t/y_socket_t.c @@ -99,10 +99,100 @@ int get_fds_with_getaddrinfo(char *port /*service */, char * node, struct pollfd } +struct get_fds_arg{ + struct pollfd *fds; + //int size_fds; + char * port ;/*service */ + char * addrDistant; +}; + +void *y_get_fds_func(void *arg){ + struct get_fds_arg * argSock = (struct get_fds_arg*)arg; + struct pollfd *fds = argSock->fds; + fds[v4].fd=-1; fds[v4].events = POLLIN; + fds[v6].fd=-1; fds[v6].events = POLLIN; + + struct addrinfo hints, *result, *rp; + int status; +// ssize_t nread; +// char buf[BUF_SIZE]; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_UNSPEC; // Allow all IPv4 and IPv6 + hints.ai_socktype = SOCK_DGRAM; // udp + hints.ai_flags = AI_PASSIVE; // anyIP + // + hints.ai_protocol = 0; + hints.ai_canonname = NULL; + hints.ai_addr = NULL; + hints.ai_next = NULL; + + //status = getaddrinfo(NULL, argSock->port, &hints, &result); + status = getaddrinfo(argSock->addrDistant, argSock->port, &hints, &result); + if(status != 0){ + fprintf(stderr, "getaddrinfo :%s\n", gai_strerror(status)); + return NULL; + } + int af, optValueV6 = 1; + + for(rp = result; rp != NULL; rp=rp->ai_next){ + for(af=v4; af<=v6; ++af){ + if((rp->ai_family == af_array[af]) && (fds[af].fd ==-1)){ + fds[af].fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + if(fds[af].fd == -1) + continue; +// android +#ifdef IPV6_V6ONLY + if(af == v6){ + if(setsockopt(fds[af].fd, IPPROTO_IPV6, IPV6_V6ONLY, + &optValueV6, sizeof(optValueV6)) == -1){ + perror("error setsockopt v6 :"); + close(fds[af].fd); + fds[af].fd = -1; + continue; + } + } +#endif + if(bind(fds[af].fd, rp->ai_addr, rp->ai_addrlen)==-1){ + close(fds[af].fd); + fds[af].fd=-1; + } + } + } + } + + freeaddrinfo(result); + +// ssize_t nread; +// char buf[BUF_SIZE]; + +// int status, af; +// status = get_fds_with_getaddrinfo(argSock->port, NULL, fds); + +// if(status != 0) + /* + if(status == 1) + fprintf(stderr, " v4 or v6 not listening, we leave!"); + else + fprintf(stderr, " not enough allocatation for fds, we leave!"); + */ + + /* + if((fds[v4].fd==-1) || (fds[v6].fd==-1)){ + fprintf(stderr, " v4 or v6 not listening, we leave!"); + return NULL; + }*/ + + return fds; + +} + void *y_pollSocketsFunc(void *arg){ struct y_socket_t * argSock = (struct y_socket_t*)arg; struct pollfd *fds = argSock->fds; - fds[v4].fd=-1; fds[v4].events = POLLIN; + +/* + fds[v4].fd=-1; fds[v4].events = POLLIN; fds[v6].fd=-1; fds[v6].events = POLLIN; struct addrinfo hints, *result, *rp; @@ -155,6 +245,8 @@ void *y_pollSocketsFunc(void *arg){ freeaddrinfo(result); +*/ + // ssize_t nread; // char buf[BUF_SIZE]; @@ -169,6 +261,14 @@ void *y_pollSocketsFunc(void *arg){ fprintf(stderr, " not enough allocatation for fds, we leave!"); */ + struct get_fds_arg argGET_addr, *arg_get;//=malloc(sizeof(struct get_fds_arg) ); + arg_get = &argGET_addr; + arg_get->fds = fds; + arg_get->addrDistant = NULL; + arg_get->port = argSock->port; + + fds = (struct pollfd*) y_get_fds_func(arg_get); + if((fds[v4].fd==-1) || (fds[v6].fd==-1)){ fprintf(stderr, " v4 or v6 not listening, we leave!"); return NULL; @@ -182,6 +282,9 @@ void *y_pollSocketsFunc(void *arg){ char buf_send[BUF_SIZE]; int fd_file; int retread; + int af, status; + ssize_t nread; + char buf[BUF_SIZE]; // char msgRet[BUF_SIZE + NI_MAXHOST + NI_MAXSERV + 100]; // int len_msgRet; for(;;){ diff --git a/y_socket_t/test/is_good.c b/y_socket_t/test/is_good.c index a9dd927..feba98e 100644 --- a/y_socket_t/test/is_good.c +++ b/y_socket_t/test/is_good.c @@ -59,7 +59,11 @@ TEST(equalNode){ nA.addr.ss_family=AF_INET; nB.addr.ss_family=AF_INET; - + + //((struct sockaddr_in*)(&(nA.addr)))->sin_port = 22; + //((struct sockaddr_in*)(&(nB.addr)))->sin_port = 22; + set_port_y_NODE_T(&nA, 22); + set_port_y_NODE_T(&nB, 22); //((struct sockaddr_in*)&(nA.addr))->sin_addr.s_addr = inet_addr("192.168.1.2"); //((struct sockaddr_in*)&(nB.addr))->sin_addr.s_addr = inet_addr("192.168.1.2"); @@ -82,6 +86,11 @@ TEST(equalNode6){ nA.addr.ss_family=AF_INET6; nB.addr.ss_family=AF_INET6; + + set_port_y_NODE_T(&nA, 22); + set_port_y_NODE_T(&nB, 22); + //((struct sockaddr_in6*)(&(nA.addr)))->sin6_port = 22; + //((struct sockaddr_in6*)(&(nB.addr)))->sin6_port = 22; //((struct sockaddr_in*)&(nA.addr))->sin_addr.s_addr = inet_addr("192.168.1.2"); //((struct sockaddr_in*)&(nB.addr))->sin_addr.s_addr = inet_addr("192.168.1.2"); @@ -107,7 +116,12 @@ TEST(searchNode){ nA.addr.ss_family=AF_INET; nB.addr.ss_family=AF_INET; - //((struct sockaddr_in*)&(nA.addr))->sin_addr.s_addr = inet_addr("192.168.1.2"); + set_port_y_NODE_T(&nA, 22); + set_port_y_NODE_T(&nB, 22); + //((struct sockaddr_in*)(&(nA.addr)))->sin_port = 22; + //((struct sockaddr_in*)(&(nB.addr)))->sin_port = 22; + + //((struct sockaddr_in*)&(nA.addr))->sin_addr.s_addr = inet_addr("192.168.1.2"); //((struct sockaddr_in*)&(nB.addr))->sin_addr.s_addr = inet_addr("192.168.1.2"); GET_IN_type_ADDR(&(nA.addr),) = inet_addr("1.1.1.1"); @@ -132,7 +146,9 @@ TEST(searchNode){ EXPECT_FALSE(NULL == search_node_in_list_y_NODE_T(listNodes, nA)); //inet_pton(AF_INET6, "::1", GET_IN_type_ADDR(&(nB.addr),6)); + //((struct sockaddr_in6*)(&(nB.addr)))->sin6_port = 22; ret = set_addr_y_NODE_T(&nB, "::1"); + set_port_y_NODE_T(&nB, 22); LOG("return of set =%d\n", ret); push_back_list_y_NODE_T(listNodes, nB); diff --git a/ytest_t/libytest.so b/ytest_t/libytest.so index 14cf38a..c323b6d 100755 Binary files a/ytest_t/libytest.so and b/ytest_t/libytest.so differ diff --git a/ytest_t/yftest/src/ftest/ftest.c b/ytest_t/yftest/src/ftest/ftest.c index edf86ff..a6cf316 100644 --- a/ytest_t/yftest/src/ftest/ftest.c +++ b/ytest_t/yftest/src/ftest/ftest.c @@ -1014,9 +1014,9 @@ bool is_in_array_##type(type *array, type val){\ for(size_t i = 0; i < cur_array_##type; ++i){\ char * strarr = type##_TO_STR(array[i]), *strval = type##_TO_STR(val);\ PRINT_DEBUG("compare |%s| in array and val: |%s|\n",strarr, strval);\ - free(strarr);free(strval);\ + if(strcmp(#type, "TYPE_STRING" ) != 0 ){ free(strarr);free(strval); }\ /*PRINT_DEBUG("compare |%s| in array and val: |%s|\n",type##_TO_STR(array[i]), type##_TO_STR(val));*/\ - if(COMPARE_N_##type((void*)(array[i]),(void*)val ) == 0 ){\ + if(COMPARE_N_##type((void*)(&array[i]),(void*)&val ) == 0 ){\ found = true;\ break;\ }\ @@ -1025,6 +1025,7 @@ bool is_in_array_##type(type *array, type val){\ return found;\ }\ +// no need anymore, combined with above!! #define GEN_IS_IN_ARRAY_NUM(type)\ bool is_in_array_##type(type *array, type val){\ bool found = false;\ @@ -1044,7 +1045,7 @@ bool is_in_array_##type(type *array, type val){\ GEN_IS_IN_ARRAY_PTR(TYPE_STRING) -GEN_IS_IN_ARRAY_NUM(TYPE_SIZE_T) +GEN_IS_IN_ARRAY_PTR(TYPE_SIZE_T) /* * extract name test between () because the syntax is TEST(name_test)