Select Git revision

Leon Bohnwagner authored
receive.c 1.55 KiB
/*
* receive.c - Implementation of message queue communication functions
*
* This file provides the implementation of the functions declared in
* receive.h.
*
*/
#include "../include/receive.h"
#include "../../common/include/measurement.h"
#include "../../common/include/userspace_comm.h"
#include <fcntl.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int create_run_file() {
int fd;
if ((fd = open(MSG_QUEUE_KEY, O_CREAT | O_EXCL)) == -1) {
return -1;
}
return close(fd);
}
int remove_run_file() { return remove(MSG_QUEUE_KEY); }
int create_userspace_receive_handle(userspace_receive_handle_t *handle) {
if (create_run_file() == -1) {
return -1;
}
key_t key = msg_queue_key();
if (key == -1) {
return -1;
}
if ((handle->msg_queue_id = msgget(key, IPC_CREAT | IPC_EXCL | IPC_NOWAIT)) ==
-1) {
return -1;
}
return 0;
}
int recv_userspace_message(userspace_receive_handle_t *handle,
measurement_t *measurement) {
message_queue_message_t message_queue_message;
ssize_t read = msgrcv(handle->msg_queue_id, &message_queue_message,
sizeof(measurement_t), MESSAGE_MEASUREMENT_ID, 0);
if (read == -1) {
return -1;
}
*measurement = message_queue_message.measurement;
return 0;
}
int destroy_userspace_receive_handle(userspace_receive_handle_t *handle) {
remove_run_file();
msgctl(handle->msg_queue_id, IPC_RMID, NULL);
return 0;
}