djumbai_client_receiver done?

This commit is contained in:
Afonso Franco 2024-05-12 11:57:10 +01:00
parent 897c8150a5
commit 7d554c6ee2
Signed by: afonso
SSH key fingerprint: SHA256:PQTRDHPH3yALEGtHXnXBp3Orfcn21pK20t0tS1kHg54
3 changed files with 60 additions and 45 deletions

View file

@ -8,7 +8,7 @@ int new_message(message *m, unsigned int sender, unsigned int isgroup, unsigned
m->header.sender = sender; m->header.sender = sender;
m->header.isgroup = isgroup; m->header.isgroup = isgroup;
m->header.receiver = receiver; m->header.receiver = receiver;
time(&m->header.timestamp); gettimeofday(&m->header.timestamp,NULL);
strncpy(m->content, content, MAX_CONTENT_SIZE); strncpy(m->content, content, MAX_CONTENT_SIZE);
return 0; return 0;
} }

View file

@ -4,7 +4,7 @@
#include <limits.h> #include <limits.h>
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include <time.h> #include <sys/time.h>
#define VERSION 1 #define VERSION 1
#define MAX_CONTENT_SIZE (PIPE_BUF - sizeof(struct MessageHeader)) #define MAX_CONTENT_SIZE (PIPE_BUF - sizeof(struct MessageHeader))
@ -20,7 +20,7 @@ typedef struct MessageHeader {
// The receiver is either a user or a group // The receiver is either a user or a group
unsigned int receiver; unsigned int receiver;
// The message was sent at this timestamp // The message was sent at this timestamp
time_t timestamp; struct timeval timestamp;
} message_header; } message_header;
typedef struct Message { typedef struct Message {

View file

@ -1,11 +1,39 @@
#include "../../libs/communication/communication.h" #include "../../libs/communication/communication.h"
#include "../../libs/protocol/protocol.h" #include "../../libs/protocol/protocol.h"
#include <errno.h> #include <errno.h>
#include <fcntl.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/time.h>
#include <unistd.h> #include <unistd.h>
void create_directory(const char *path, mode_t mode) {
struct stat st = {0};
if (stat(path, &st) == -1) {
if (mkdir(path, mode) == -1) {
fprintf(stderr, "Error creating directory %s: %s\n", path, strerror(errno));
exit(EXIT_FAILURE);
}
}
}
void write_message_to_file(const char *directory, const char *filename, mode_t mode,
unsigned char *msg) {
char filepath[PATH_MAX];
snprintf(filepath, sizeof(filepath), "%s/%s", directory, filename);
int fd = open(filepath, O_WRONLY | O_CREAT | O_EXCL, mode);
if (fd == -1) {
fprintf(stderr, "Error creating file %s: %s\n", filepath, strerror(errno));
exit(EXIT_FAILURE);
}
if (write(fd, msg, MESSAGE_SIZE) == -1) {
fprintf(stderr, "Error writing to file %s: %s\n", filepath, strerror(errno));
exit(EXIT_FAILURE);
}
close(fd);
}
int main() { int main() {
unsigned char buffer[MESSAGE_SIZE]; unsigned char buffer[MESSAGE_SIZE];
@ -14,49 +42,36 @@ int main() {
deserialize_message(buffer, MESSAGE_SIZE, &msg); deserialize_message(buffer, MESSAGE_SIZE, &msg);
if (msg.header.isgroup) { if (msg.header.isgroup) {
const char *directory_format = "/opt/djumbai/group/%d/"; const char *directory_format = "/opt/djumbai/group/%d/message_box";
char group_path[50]; char directory[PATH_MAX];
sprintf(group_path, directory_format, msg.header.receiver); snprintf(directory, sizeof(directory), directory_format, msg.header.receiver);
char message_box_path[70];
sprintf(message_box_path, group_path, "message_box/"); // Ensure that the directory structure exists
create_directory(directory, 0070);
// Write the message to a file inside the sender's folder
char timestamp_str[21];
unsigned long long timestamp =
msg.header.timestamp.tv_sec * 1000 + msg.header.timestamp.tv_usec / 1000;
snprintf(timestamp_str, sizeof(timestamp_str), "%lld", timestamp);
write_message_to_file(directory, timestamp_str, 0020, buffer);
struct stat st;
if (stat(group_path, &st) == -1) {
// Directory doesn't exist, so create it
if (mkdir(group_path, 0070) == -1) {
perror("mkdir");
return EXIT_FAILURE;
}
}
if (stat(message_box_path, &st) == -1) {
// Directory doesn't exist, so create it
if (mkdir(message_box_path, 0070) == -1) {
perror("mkdir");
return EXIT_FAILURE;
}
}
chroot(message_box_path);
//Do the rest
} else { } else {
const char *directory_format = "/opt/djumbai/user/%d/message_box/%d";
char directory[PATH_MAX];
snprintf(directory, sizeof(directory), directory_format, msg.header.receiver,
msg.header.sender);
// struct stat st; // Ensure that the directory structure exists
// if (stat(user_path, &st) == -1) { create_directory(directory, 0700);
// // Directory doesn't exist, so create it
// if (mkdir(user_path, 0700) == -1) { // Write the message to a file inside the sender's folder
// perror("mkdir"); char timestamp_str[21];
// return EXIT_FAILURE; unsigned long long timestamp =
// } msg.header.timestamp.tv_sec * 1000 + msg.header.timestamp.tv_usec / 1000;
// } snprintf(timestamp_str, sizeof(timestamp_str), "%lld", timestamp);
// if (stat(message_box_path, &st) == -1) {
// // Directory doesn't exist, so create it write_message_to_file(directory, timestamp_str, 0200, buffer);
// if (mkdir(message_box_path, 0700) == -1) {
// perror("mkdir");
// return EXIT_FAILURE;
// }
// }
// chroot(message_box_path);
//
// Message receiver is a user
// Write to the user's mailbox
} }
} }