1bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Copyright (c) 2011, The Linux Foundation. All rights reserved. 2bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * 3bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * Redistribution and use in source and binary forms, with or without 4bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * modification, are permitted provided that the following conditions are 5bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * met: 6bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * * Redistributions of source code must retain the above copyright 7bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * notice, this list of conditions and the following disclaimer. 8bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * * Redistributions in binary form must reproduce the above 9bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * copyright notice, this list of conditions and the following 10bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * disclaimer in the documentation and/or other materials provided 11bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * with the distribution. 12bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * * Neither the name of The Linux Foundation nor the names of its 13bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * contributors may be used to endorse or promote products derived 14bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * from this software without specific prior written permission. 15bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * 16bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * 28bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo */ 29bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <linux/stat.h> 30bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <fcntl.h> 31bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 32bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <linux/types.h> 33bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 34bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "log_util.h" 35bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "platform_lib_includes.h" 36bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "loc_eng_dmn_conn_glue_msg.h" 37bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "loc_eng_dmn_conn_handler.h" 38bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 39bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 40bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION loc_eng_dmn_conn_glue_msgget 41bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 42bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 43bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo This function get a message queue 44bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 45bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo q_path - name path of the message queue 46bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo mode - 47bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 48bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 49bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo None 50bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 51bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 52bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo message queue id 53bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 54bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 55bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 56bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 57bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 58bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_dmn_conn_glue_msgget(const char * q_path, int mode) 59bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 60bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int msgqid; 61bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo msgqid = loc_eng_dmn_conn_glue_pipeget(q_path, mode); 62bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return msgqid; 63bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 64bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 65bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 66bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION loc_eng_dmn_conn_glue_msgremove 67bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 68bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 69bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo remove a message queue 70bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 71bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo q_path - name path of the message queue 72bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo msgqid - message queue id 73bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 74bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 75bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo None 76bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 77bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 78bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 0: success or negative value for failure 79bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 80bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 81bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 82bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 83bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 84bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_dmn_conn_glue_msgremove(const char * q_path, int msgqid) 85bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 86bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int result; 87bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = loc_eng_dmn_conn_glue_piperemove(q_path, msgqid); 88bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return result; 89bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 90bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 91bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 92bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION loc_eng_dmn_conn_glue_msgsnd 93bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 94bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 95bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo Send a message 96bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 97bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo msgqid - message queue id 98bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo msgp - pointer to the message to be sent 99bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo msgsz - size of the message 100bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 101bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 102bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo None 103bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 104bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 105bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo number of bytes sent out or negative value for failure 106bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 107bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 108bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 109bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 110bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 111bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_dmn_conn_glue_msgsnd(int msgqid, const void * msgp, size_t msgsz) 112bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 113bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int result; 114bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo struct ctrl_msgbuf *pmsg = (struct ctrl_msgbuf *) msgp; 115bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo pmsg->msgsz = msgsz; 116bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 117bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = loc_eng_dmn_conn_glue_pipewrite(msgqid, msgp, msgsz); 118bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (result != (int) msgsz) { 119bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGE("%s:%d] pipe broken %d, msgsz = %d\n", __func__, __LINE__, result, (int) msgsz); 120bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return -1; 121bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 122bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 123bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return result; 124bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 125bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 126bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 127bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION loc_eng_dmn_conn_glue_msgrcv 128bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 129bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 130bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo receive a message 131bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 132bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo msgqid - message queue id 133bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo msgp - pointer to the buffer to hold the message 134bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo msgsz - size of the buffer 135bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 136bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 137bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo None 138bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 139bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 140bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo number of bytes received or negative value for failure 141bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 142bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 143bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 144bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 145bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 146bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_dmn_conn_glue_msgrcv(int msgqid, void *msgp, size_t msgbufsz) 147bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 148bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int result; 149bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo struct ctrl_msgbuf *pmsg = (struct ctrl_msgbuf *) msgp; 150bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 151bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = loc_eng_dmn_conn_glue_piperead(msgqid, &(pmsg->msgsz), sizeof(pmsg->msgsz)); 152bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (result != sizeof(pmsg->msgsz)) { 153bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGE("%s:%d] pipe broken %d\n", __func__, __LINE__, result); 154bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return -1; 155bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 156bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 157bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (msgbufsz < pmsg->msgsz) { 158bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGE("%s:%d] msgbuf is too small %d < %d\n", __func__, __LINE__, (int) msgbufsz, (int) pmsg->msgsz); 159bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return -1; 160bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 161bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 162bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = loc_eng_dmn_conn_glue_piperead(msgqid, (uint8_t *) msgp + sizeof(pmsg->msgsz), pmsg->msgsz - sizeof(pmsg->msgsz)); 163bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (result != (int) (pmsg->msgsz - sizeof(pmsg->msgsz))) { 164bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGE("%s:%d] pipe broken %d, msgsz = %d\n", __func__, __LINE__, result, (int) pmsg->msgsz); 165bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return -1; 166bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 167bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 168bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return pmsg->msgsz; 169bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 170bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 171bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 172bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION loc_eng_dmn_conn_glue_msgunblock 173bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 174bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 175bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo unblock a message queue 176bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 177bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo msgqid - message queue id 178bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 179bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 180bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo None 181bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 182bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 183bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 0: success 184bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 185bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 186bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 187bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 188bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 189bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_dmn_conn_glue_msgunblock(int msgqid) 190bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 191bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return loc_eng_dmn_conn_glue_pipeunblock(msgqid); 192bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 193bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 194bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 195bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION loc_eng_dmn_conn_glue_msgflush 196bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 197bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 198bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo flush out the message in a queue 199bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 200bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo msgqid - message queue id 201bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 202bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 203bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo None 204bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 205bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 206bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo number of bytes that are flushed out. 207bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 208bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 209bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 210bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 211bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 212bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_dmn_conn_glue_msgflush(int msgqid) 213bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 214bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int length; 215bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo char buf[128]; 216bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 217bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo do { 218bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo length = loc_eng_dmn_conn_glue_piperead(msgqid, buf, 128); 219bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGD("%s:%d] %s\n", __func__, __LINE__, buf); 220bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } while(length); 221bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return length; 222bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 223bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 224