OAuth2Lib/main.c.old

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;
}