spacedrive/mineziper/mineziperd.c
2024-02-26 10:20:50 +01:00

77 lines
No EOL
1.9 KiB
C

#include <netinet/in.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include "libmineziper.h"
#include "libmineziper_crypto.h"
#define PORT 8989
int main()
{
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(PORT);
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *) &server_address, server_len);
// Create a connection queue, ignore child exit details and wait for clients.
// Handle only one connection at a time for now
listen(server_sockfd, 1);
signal(SIGCHLD, SIG_IGN);
while (1)
{
printf("mineziperd waiting for duty\n");
/* Accept connection. */
client_len = sizeof(client_address);
client_sockfd = accept(
server_sockfd, (struct sockaddr *) &client_address, &client_len);
/* Fork to create a process for this client and perform a test to see
whether we're the parent or the child. */
if (fork() == 0)
{
// Get size of buffer
unsigned int read_size;
read(client_sockfd, &read_size, sizeof(int));
char *buffer = malloc(read_size);
if (!buffer)
{
fprintf(
stderr, "[ERROR] Cannot allocate buffer of size %d\n", read_size);
exit(1);
}
unsigned int crc = xcrc32(buffer, read_size, -1);
bool scan_result = scan_zip(buffer, read_size);
write(client_sockfd, &crc, sizeof(crc));
write(client_sockfd, &scan_result, sizeof(scan_result));
close(client_sockfd);
exit(0);
}
// Otherwise, we must be the parent
else
{
close(client_sockfd);
}
}
}