#include "utils.h" /* socket() */ #include #include #include /* getaddrinfo() */ #include #include /* inet_ntop() */ #include #define GET_SOCK_IN_ADDR(sa) (((struct sockaddr*)sa)->sa_family == AF_INET)?(void *)&(((struct sockaddr_in*)sa)->sin_addr):(void *)&(((struct sockaddr_in6*)sa)->sin6_addr) #include /* memset(), strncmp() */ #include /* perror(), fprintf(), snprintf(), sscanf() */ #include /* malloc(), free() */ #include /* close() */ #include /* EAGAIN... */ int tcp_client_init(char host[], char port[], int *sockfd) { int rv, flag=1; char s[INET6_ADDRSTRLEN]; struct addrinfo hints, *servinfo, *p; memset(&hints,0,sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if ((rv = getaddrinfo(host, port, &hints, &servinfo)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); return 1; } // loop through all the results and connect to the first we can for(p = servinfo; p != NULL; p = p->ai_next) { if ((*sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { //perror("client: socket"); continue; } if ( setsockopt(*sockfd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(flag)) != 0 ) { perror("client: setsockopt TCP_NODELAY"); } if (connect(*sockfd, p->ai_addr, p->ai_addrlen) == -1) { close(*sockfd); //perror("client: connect"); continue; } break; } freeaddrinfo(servinfo); if (p == NULL) { fprintf(stderr, "client: failed to connect\n"); return 2; } inet_ntop(p->ai_family, GET_SOCK_IN_ADDR(p->ai_addr), s, sizeof s); printf("client: connecting to %s\n", s); return 0; } void flatten(char *seg_off) { unsigned int seg=0, off=0, flat; sscanf(seg_off, "%4x", &seg); sscanf(seg_off+5, "%4x", &off); flat= (seg<<4) + off; snprintf(seg_off, 9, "%x", flat); } int hexascii2bin(char src[], void *dst, int maxlen) { int i; unsigned char offset; for (i=0; i= '0' && src[i] <= '9' ) offset='0'; else if ( src[i] >= 'a' && src[i] <= 'f' ) offset='a' - 10; else if ( src[i] >= 'A' && src[i] <= 'F' ) offset='A' - 10; else break; if ( i % 2 == 0 ) { ((unsigned char *)dst)[i/2] = (src[i]-offset) << 4; } else { ((unsigned char *)dst)[i/2] += (src[i]-offset); } } return i/2; } // Indicate the position of the bit that is on // If multiple bits activated, returns -2 // If no bits activated, return -1 int bit_position(uint16_t flags) { int i, pos; pos=-1; // Not found yet for (i=0;i<16;i++) { if ( (flags >> i) & 0x0001 ) { if ( pos == -1 ) { pos=i; } else { return -2; } } } return pos; }