#include #include #include #include #include #include #include #include #include //#include "dns.h" #define WEB_ADDR "www.onedrive.com" struct socket_data_chunk { char data[4096]; struct socket_data_chunk *next; }; void free_socketdata(struct socket_data_chunk* data_chunk) { for (struct socket_data_chunk *iter = data_chunk; iter != NULL; ) { struct socket_data_chunk *data = iter; iter = iter->next; free(data); } } int strncmp_end(const char *str, size_t max_strlen, const char *suffix, size_t max_suffix_len) { if (!str || !suffix) return 0; size_t lenstr = strnlen(str, max_strlen); size_t lensuffix = strnlen(suffix, max_suffix_len); if (lensuffix > lenstr) return 0; return strncmp(str + lenstr - lensuffix, suffix, lensuffix); } int main() { //oauth2_dns_resolve("onedrive.com"); struct addrinfo resolve_hints = { .ai_family = AF_INET, //AF_UNSPEC, // IPv4 or IPv6 .ai_socktype = SOCK_STREAM, .ai_flags = 0, .ai_protocol = 0 }; struct addrinfo *resolve_result; int get_addr_res = getaddrinfo(WEB_ADDR, NULL, &resolve_hints, &resolve_result); if (get_addr_res != 0) { printf("getaddrinfo failed: %d\n", get_addr_res); exit(-1); } char ip_addr[50]; printf("IP address: %s\n", inet_ntop(AF_INET, &((struct sockaddr_in*) resolve_result->ai_addr)->sin_addr, ip_addr, sizeof(ip_addr))); printf("Port: %d\n", ntohs(((struct sockaddr_in*)resolve_result->ai_addr)->sin_port)); ((struct sockaddr_in*)resolve_result->ai_addr)->sin_port = htons(80); int sock_desc = socket(AF_INET, SOCK_STREAM, 0); if (sock_desc == -1) { printf("Socket creation failed. Errno: %d\n", errno); exit(-1); } printf("created socket\n"); struct sockaddr_in server_addr = *(struct sockaddr_in *)resolve_result->ai_addr; // struct sockaddr_in server_addr = { // .sin_family = AF_INET, // .sin_addr = inet_addr("127.0.0.1"), // .sin_port = htons(8080) // }; if (connect(sock_desc, (struct sockaddr*)&server_addr, sizeof(server_addr)) != 0) { printf("Socket connection failed. Errno: %d\n", errno); exit(-1); close(sock_desc); } printf("Connected to address\n"); const char *msg = "GET / HTTP/1.1\r\n" "Host: " WEB_ADDR "\r\n" "\r\n"; write(sock_desc, msg, strlen(msg)); printf("sent: \n%s\n", msg); struct socket_data_chunk *data = NULL; struct socket_data_chunk **it = &data; do { struct socket_data_chunk *nit = calloc(1, sizeof(struct socket_data_chunk)); if (!nit) { printf("failed to allocate data for receive\n"); exit(-1); } if (*it) { (*it)->next = nit; } else { *it = nit; } it = &nit; ssize_t bytes_read = recv(sock_desc, &nit->data, sizeof(nit->data), 0); if (bytes_read == -1) { printf("Failed to recieve data. Errno: %d", errno); exit(-1); } printf("received (%ld) bytes:\n%s\n", bytes_read, nit->data); //} while (!strstr((*it)->data, "\r\n\r\n")); } while(strncmp_end(data->data, sizeof((*it)->data), "\r\n\r\n", 5)); printf("Finishing\n"); close(sock_desc); freeaddrinfo(resolve_result); free_socketdata(data); return 0; }