diff options
Diffstat (limited to 'reverse-engineering/dosbox_snif/utils.c')
-rw-r--r-- | reverse-engineering/dosbox_snif/utils.c | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/reverse-engineering/dosbox_snif/utils.c b/reverse-engineering/dosbox_snif/utils.c new file mode 100644 index 0000000..8e26d46 --- /dev/null +++ b/reverse-engineering/dosbox_snif/utils.c @@ -0,0 +1,112 @@ +#include "utils.h" + +/* socket() */ +#include <sys/socket.h> +#include <netinet/in.h> +#include <netinet/tcp.h> +/* getaddrinfo() */ +#include <sys/types.h> +#include <netdb.h> +/* inet_ntop() */ +#include <arpa/inet.h> +#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 <string.h> /* memset(), strncmp() */ +#include <stdio.h> /* perror(), fprintf(), snprintf(), sscanf() */ +#include <stdlib.h> /* malloc(), free() */ +#include <unistd.h> /* close() */ +#include <errno.h> /* 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<maxlen*2; i++) { + //if ( src[i] == '\0') return i; + if ( src[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; +} |