Skip to content
Snippets Groups Projects
Select Git revision
  • 0a398d572017613327b266328f46713536916b6f
  • main default protected
2 results

receive.c

Blame
  • 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;
    }