Files
AwesomePolytech/OSs/lab7/client.c
2025-10-13 18:44:31 +03:00

66 lines
1.8 KiB
C

#include "common.h"
#include <fcntl.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#define FAIL_TO_CLEANUP(cond, jmp_to) \
if (cond) { \
perror(#cond); \
ret = EXIT_FAILURE; \
goto jmp_to; \
}
int main(void) {
int ret = 0;
int shm_fd = -1;
void *shm_ptr = MAP_FAILED;
sem_t *sem_c2s = SEM_FAILED;
sem_t *sem_s2c = SEM_FAILED;
FAIL_TO_CLEANUP((shm_fd = shm_open(SHM_NAME, O_RDWR, 0)) == -1, exit);
FAIL_TO_CLEANUP(
(shm_ptr = mmap(NULL, SHM_SIZE,
PROT_READ | PROT_WRITE,
MAP_SHARED, shm_fd, 0)) == MAP_FAILED,
unmap_shared_mem);
FAIL_TO_CLEANUP((sem_c2s = sem_open(SEM_C2S_NAME, 0)) == SEM_FAILED,
close_sem_c2s);
FAIL_TO_CLEANUP((sem_s2c = sem_open(SEM_S2C_NAME, 0)) == SEM_FAILED,
close_sem_s2c);
char filename[SHM_SIZE];
FAIL_TO_CLEANUP(fgets(filename, sizeof(filename), stdin) == NULL, close_sem_s2c);
size_t ln = strlen(filename);
if (ln > 0 && filename[ln - 1] == '\n')
filename[ln - 1] = '\0';
memset(shm_ptr, 0, SHM_SIZE);
strncpy((char *)shm_ptr, filename, SHM_SIZE - 1);
FAIL_TO_CLEANUP(sem_post(sem_c2s) == -1, close_sem_s2c);
FAIL_TO_CLEANUP(sem_wait(sem_s2c) == -1, close_sem_s2c);
size_t len = strnlen((char *)shm_ptr, SHM_SIZE);
FAIL_TO_CLEANUP(fwrite(shm_ptr, sizeof(char), len, stdout) != len, close_sem_s2c);
fflush(stdout); // don't really care if fails
close_sem_s2c:
sem_close(sem_s2c);
close_sem_c2s:
sem_close(sem_c2s);
unmap_shared_mem:
munmap(shm_ptr, SHM_SIZE);
close_shared_fd:
close(shm_fd);
exit:
return ret;
}