#include "logging.h"
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "structures.h"
#include "utils.h"
void
log_client_data(struct sockaddr_storage client_addr, char* log_file,
int debug_flag, REQUEST* request)
{
FILE* log_file_read = fopen(log_file, "a");
if (log_file_read == NULL)
{
fprintf(stderr, "%s: unable to open log file: fopen: %s\n",
getprogname(), strerror(errno));
exit(EXIT_FAILURE);
}
char client_ip[INET6_ADDRSTRLEN]; // This is large enough for both IPv4 and
// IPv6
// This changes request->request_passedin but we dont care since we dont use
// it again
char* formatted_request_passedin =
strtok(request->request_passedin, "\r\n");
if (formatted_request_passedin == NULL)
{
fprintf(stderr, "%s: unable to format request->request_passedin",
getprogname());
exit(EXIT_FAILURE);
}
if (client_addr.ss_family == AF_INET)
{
struct sockaddr_in* ipv4_client = (struct sockaddr_in*)&client_addr;
inet_ntop(AF_INET, &ipv4_client->sin_addr, client_ip,
sizeof(client_ip));
if (debug_flag)
{
printf("[Debug] %s:%d %s \"%s\" %d %zu\n", client_ip,
ntohs(ipv4_client->sin_port), request->request_time,
formatted_request_passedin, request->status,
request->response_size);
}
else
{
fprintf(log_file_read, "%s:%d %s \"%s\" %d %zu\n", client_ip,
ntohs(ipv4_client->sin_port), request->request_time,
formatted_request_passedin, request->status,
request->response_size);
}
}
else if (client_addr.ss_family == AF_INET6)
{
struct sockaddr_in6* ipv6_client = (struct sockaddr_in6*)&client_addr;
inet_ntop(AF_INET6, &ipv6_client->sin6_addr, client_ip,
sizeof(client_ip));
if (debug_flag)
{
printf("[Debug] %s:%d %s \"%s\" %d %zu\n", client_ip,
ntohs(ipv6_client->sin6_port), request->request_time,
formatted_request_passedin, request->status,
request->response_size);
}
else
{
fprintf(log_file_read, "%s:%d %s \"%s\" %d %zu\n", client_ip,
ntohs(ipv6_client->sin6_port), request->request_time,
formatted_request_passedin, request->status,
request->response_size);
}
}
fclose(log_file_read);
}