static int init_mq()

in src/glk_comm.c [72:115]


static int init_mq(struct sock_names* names) {
    names->sock_name = NULL;
    names->sock_fd = -1;
    names->serv_sock_fd = -1;

    char temp[25] = "/tmp/mlglk_XXXXXX";
    if (mkdtemp(temp) == NULL) {
        perror("glk_comm.c: mkdtemp()");
        return -1;
    }
    strcat(temp, "/socket");

    names->sock_name = strdup(temp);
    if (!names->sock_name) {
        perror("glk_comm.c: strdup()");
        return -1;
    }

    /* sockets */
    struct sockaddr_un sock_addr;
    sock_addr.sun_family = AF_UNIX;
    memset(sock_addr.sun_path, 0, sizeof(sock_addr.sun_path));
    strncpy(sock_addr.sun_path, names->sock_name, sizeof(sock_addr.sun_path) - 1);

    names->serv_sock_fd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (names->serv_sock_fd == -1) {
        perror("glk_comm.c: Error opening socket");
        return -1;
    }

    int status = bind(names->serv_sock_fd, (struct sockaddr*)&sock_addr, sizeof(sock_addr));
    if (status == -1) {
        perror("glk_comm.c: Error binding socket");
        return -1;
    }

    status = listen(names->serv_sock_fd, 1);
    if (status == -1) {
        perror("glk_comm.c: Error listening socket");
        return -1;
    }

    return 0;
}