132 lines
3.1 KiB
C
132 lines
3.1 KiB
C
#include <errno.h>
|
|
#include <netdb.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <arpa/inet.h>
|
|
#include <sys/socket.h>
|
|
#include <netinet/in.h>
|
|
|
|
//#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;
|
|
}
|