1e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo/* Copyright (c) 2011, The Linux Foundation. All rights reserved. 234ee09551764b045fdc02df754157473125edf60Kevin Tang * 334ee09551764b045fdc02df754157473125edf60Kevin Tang * Redistribution and use in source and binary forms, with or without 434ee09551764b045fdc02df754157473125edf60Kevin Tang * modification, are permitted provided that the following conditions are 534ee09551764b045fdc02df754157473125edf60Kevin Tang * met: 634ee09551764b045fdc02df754157473125edf60Kevin Tang * * Redistributions of source code must retain the above copyright 734ee09551764b045fdc02df754157473125edf60Kevin Tang * notice, this list of conditions and the following disclaimer. 834ee09551764b045fdc02df754157473125edf60Kevin Tang * * Redistributions in binary form must reproduce the above 934ee09551764b045fdc02df754157473125edf60Kevin Tang * copyright notice, this list of conditions and the following 1034ee09551764b045fdc02df754157473125edf60Kevin Tang * disclaimer in the documentation and/or other materials provided 1134ee09551764b045fdc02df754157473125edf60Kevin Tang * with the distribution. 12e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * * Neither the name of The Linux Foundation nor the names of its 1334ee09551764b045fdc02df754157473125edf60Kevin Tang * contributors may be used to endorse or promote products derived 1434ee09551764b045fdc02df754157473125edf60Kevin Tang * from this software without specific prior written permission. 1534ee09551764b045fdc02df754157473125edf60Kevin Tang * 1634ee09551764b045fdc02df754157473125edf60Kevin Tang * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1734ee09551764b045fdc02df754157473125edf60Kevin Tang * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1834ee09551764b045fdc02df754157473125edf60Kevin Tang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1934ee09551764b045fdc02df754157473125edf60Kevin Tang * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2034ee09551764b045fdc02df754157473125edf60Kevin Tang * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2134ee09551764b045fdc02df754157473125edf60Kevin Tang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2234ee09551764b045fdc02df754157473125edf60Kevin Tang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2334ee09551764b045fdc02df754157473125edf60Kevin Tang * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2434ee09551764b045fdc02df754157473125edf60Kevin Tang * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2534ee09551764b045fdc02df754157473125edf60Kevin Tang * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2634ee09551764b045fdc02df754157473125edf60Kevin Tang * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2734ee09551764b045fdc02df754157473125edf60Kevin Tang * 2834ee09551764b045fdc02df754157473125edf60Kevin Tang */ 2934ee09551764b045fdc02df754157473125edf60Kevin Tang#include <linux/stat.h> 3034ee09551764b045fdc02df754157473125edf60Kevin Tang#include <fcntl.h> 3134ee09551764b045fdc02df754157473125edf60Kevin Tang 3234ee09551764b045fdc02df754157473125edf60Kevin Tang#include <linux/types.h> 3334ee09551764b045fdc02df754157473125edf60Kevin Tang 3434ee09551764b045fdc02df754157473125edf60Kevin Tang#include "log_util.h" 35e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include "platform_lib_includes.h" 3634ee09551764b045fdc02df754157473125edf60Kevin Tang#include "loc_eng_dmn_conn_glue_msg.h" 3734ee09551764b045fdc02df754157473125edf60Kevin Tang#include "loc_eng_dmn_conn_handler.h" 3834ee09551764b045fdc02df754157473125edf60Kevin Tang 3934ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 4034ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION loc_eng_dmn_conn_glue_msgget 4134ee09551764b045fdc02df754157473125edf60Kevin Tang 4234ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 4334ee09551764b045fdc02df754157473125edf60Kevin Tang This function get a message queue 4434ee09551764b045fdc02df754157473125edf60Kevin Tang 4534ee09551764b045fdc02df754157473125edf60Kevin Tang q_path - name path of the message queue 4634ee09551764b045fdc02df754157473125edf60Kevin Tang mode - 4734ee09551764b045fdc02df754157473125edf60Kevin Tang 4834ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 4934ee09551764b045fdc02df754157473125edf60Kevin Tang None 5034ee09551764b045fdc02df754157473125edf60Kevin Tang 5134ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 5234ee09551764b045fdc02df754157473125edf60Kevin Tang message queue id 5334ee09551764b045fdc02df754157473125edf60Kevin Tang 5434ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 5534ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 5634ee09551764b045fdc02df754157473125edf60Kevin Tang 5734ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 5834ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_glue_msgget(const char * q_path, int mode) 5934ee09551764b045fdc02df754157473125edf60Kevin Tang{ 6034ee09551764b045fdc02df754157473125edf60Kevin Tang int msgqid; 6134ee09551764b045fdc02df754157473125edf60Kevin Tang msgqid = loc_eng_dmn_conn_glue_pipeget(q_path, mode); 6234ee09551764b045fdc02df754157473125edf60Kevin Tang return msgqid; 6334ee09551764b045fdc02df754157473125edf60Kevin Tang} 6434ee09551764b045fdc02df754157473125edf60Kevin Tang 6534ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 6634ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION loc_eng_dmn_conn_glue_msgremove 6734ee09551764b045fdc02df754157473125edf60Kevin Tang 6834ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 6934ee09551764b045fdc02df754157473125edf60Kevin Tang remove a message queue 7034ee09551764b045fdc02df754157473125edf60Kevin Tang 7134ee09551764b045fdc02df754157473125edf60Kevin Tang q_path - name path of the message queue 7234ee09551764b045fdc02df754157473125edf60Kevin Tang msgqid - message queue id 7334ee09551764b045fdc02df754157473125edf60Kevin Tang 7434ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 7534ee09551764b045fdc02df754157473125edf60Kevin Tang None 7634ee09551764b045fdc02df754157473125edf60Kevin Tang 7734ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 7834ee09551764b045fdc02df754157473125edf60Kevin Tang 0: success or negative value for failure 7934ee09551764b045fdc02df754157473125edf60Kevin Tang 8034ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 8134ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 8234ee09551764b045fdc02df754157473125edf60Kevin Tang 8334ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 8434ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_glue_msgremove(const char * q_path, int msgqid) 8534ee09551764b045fdc02df754157473125edf60Kevin Tang{ 8634ee09551764b045fdc02df754157473125edf60Kevin Tang int result; 8734ee09551764b045fdc02df754157473125edf60Kevin Tang result = loc_eng_dmn_conn_glue_piperemove(q_path, msgqid); 8834ee09551764b045fdc02df754157473125edf60Kevin Tang return result; 8934ee09551764b045fdc02df754157473125edf60Kevin Tang} 9034ee09551764b045fdc02df754157473125edf60Kevin Tang 9134ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 9234ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION loc_eng_dmn_conn_glue_msgsnd 9334ee09551764b045fdc02df754157473125edf60Kevin Tang 9434ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 9534ee09551764b045fdc02df754157473125edf60Kevin Tang Send a message 9634ee09551764b045fdc02df754157473125edf60Kevin Tang 9734ee09551764b045fdc02df754157473125edf60Kevin Tang msgqid - message queue id 9834ee09551764b045fdc02df754157473125edf60Kevin Tang msgp - pointer to the message to be sent 9934ee09551764b045fdc02df754157473125edf60Kevin Tang msgsz - size of the message 10034ee09551764b045fdc02df754157473125edf60Kevin Tang 10134ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 10234ee09551764b045fdc02df754157473125edf60Kevin Tang None 10334ee09551764b045fdc02df754157473125edf60Kevin Tang 10434ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 10534ee09551764b045fdc02df754157473125edf60Kevin Tang number of bytes sent out or negative value for failure 10634ee09551764b045fdc02df754157473125edf60Kevin Tang 10734ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 10834ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 10934ee09551764b045fdc02df754157473125edf60Kevin Tang 11034ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 11134ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_glue_msgsnd(int msgqid, const void * msgp, size_t msgsz) 11234ee09551764b045fdc02df754157473125edf60Kevin Tang{ 11334ee09551764b045fdc02df754157473125edf60Kevin Tang int result; 11434ee09551764b045fdc02df754157473125edf60Kevin Tang struct ctrl_msgbuf *pmsg = (struct ctrl_msgbuf *) msgp; 11534ee09551764b045fdc02df754157473125edf60Kevin Tang pmsg->msgsz = msgsz; 11634ee09551764b045fdc02df754157473125edf60Kevin Tang 11734ee09551764b045fdc02df754157473125edf60Kevin Tang result = loc_eng_dmn_conn_glue_pipewrite(msgqid, msgp, msgsz); 11834ee09551764b045fdc02df754157473125edf60Kevin Tang if (result != (int) msgsz) { 11934ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGE("%s:%d] pipe broken %d, msgsz = %d\n", __func__, __LINE__, result, (int) msgsz); 12034ee09551764b045fdc02df754157473125edf60Kevin Tang return -1; 12134ee09551764b045fdc02df754157473125edf60Kevin Tang } 12234ee09551764b045fdc02df754157473125edf60Kevin Tang 12334ee09551764b045fdc02df754157473125edf60Kevin Tang return result; 12434ee09551764b045fdc02df754157473125edf60Kevin Tang} 12534ee09551764b045fdc02df754157473125edf60Kevin Tang 12634ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 12734ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION loc_eng_dmn_conn_glue_msgrcv 12834ee09551764b045fdc02df754157473125edf60Kevin Tang 12934ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 13034ee09551764b045fdc02df754157473125edf60Kevin Tang receive a message 13134ee09551764b045fdc02df754157473125edf60Kevin Tang 13234ee09551764b045fdc02df754157473125edf60Kevin Tang msgqid - message queue id 13334ee09551764b045fdc02df754157473125edf60Kevin Tang msgp - pointer to the buffer to hold the message 13434ee09551764b045fdc02df754157473125edf60Kevin Tang msgsz - size of the buffer 13534ee09551764b045fdc02df754157473125edf60Kevin Tang 13634ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 13734ee09551764b045fdc02df754157473125edf60Kevin Tang None 13834ee09551764b045fdc02df754157473125edf60Kevin Tang 13934ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 14034ee09551764b045fdc02df754157473125edf60Kevin Tang number of bytes received or negative value for failure 14134ee09551764b045fdc02df754157473125edf60Kevin Tang 14234ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 14334ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 14434ee09551764b045fdc02df754157473125edf60Kevin Tang 14534ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 14634ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_glue_msgrcv(int msgqid, void *msgp, size_t msgbufsz) 14734ee09551764b045fdc02df754157473125edf60Kevin Tang{ 14834ee09551764b045fdc02df754157473125edf60Kevin Tang int result; 14934ee09551764b045fdc02df754157473125edf60Kevin Tang struct ctrl_msgbuf *pmsg = (struct ctrl_msgbuf *) msgp; 15034ee09551764b045fdc02df754157473125edf60Kevin Tang 15134ee09551764b045fdc02df754157473125edf60Kevin Tang result = loc_eng_dmn_conn_glue_piperead(msgqid, &(pmsg->msgsz), sizeof(pmsg->msgsz)); 15234ee09551764b045fdc02df754157473125edf60Kevin Tang if (result != sizeof(pmsg->msgsz)) { 15334ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGE("%s:%d] pipe broken %d\n", __func__, __LINE__, result); 15434ee09551764b045fdc02df754157473125edf60Kevin Tang return -1; 15534ee09551764b045fdc02df754157473125edf60Kevin Tang } 15634ee09551764b045fdc02df754157473125edf60Kevin Tang 15734ee09551764b045fdc02df754157473125edf60Kevin Tang if (msgbufsz < pmsg->msgsz) { 15834ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGE("%s:%d] msgbuf is too small %d < %d\n", __func__, __LINE__, (int) msgbufsz, (int) pmsg->msgsz); 15934ee09551764b045fdc02df754157473125edf60Kevin Tang return -1; 16034ee09551764b045fdc02df754157473125edf60Kevin Tang } 16134ee09551764b045fdc02df754157473125edf60Kevin Tang 16234ee09551764b045fdc02df754157473125edf60Kevin Tang result = loc_eng_dmn_conn_glue_piperead(msgqid, (uint8_t *) msgp + sizeof(pmsg->msgsz), pmsg->msgsz - sizeof(pmsg->msgsz)); 16334ee09551764b045fdc02df754157473125edf60Kevin Tang if (result != (int) (pmsg->msgsz - sizeof(pmsg->msgsz))) { 16434ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGE("%s:%d] pipe broken %d, msgsz = %d\n", __func__, __LINE__, result, (int) pmsg->msgsz); 16534ee09551764b045fdc02df754157473125edf60Kevin Tang return -1; 16634ee09551764b045fdc02df754157473125edf60Kevin Tang } 16734ee09551764b045fdc02df754157473125edf60Kevin Tang 16834ee09551764b045fdc02df754157473125edf60Kevin Tang return pmsg->msgsz; 16934ee09551764b045fdc02df754157473125edf60Kevin Tang} 17034ee09551764b045fdc02df754157473125edf60Kevin Tang 17134ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 17234ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION loc_eng_dmn_conn_glue_msgunblock 17334ee09551764b045fdc02df754157473125edf60Kevin Tang 17434ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 17534ee09551764b045fdc02df754157473125edf60Kevin Tang unblock a message queue 17634ee09551764b045fdc02df754157473125edf60Kevin Tang 17734ee09551764b045fdc02df754157473125edf60Kevin Tang msgqid - message queue id 17834ee09551764b045fdc02df754157473125edf60Kevin Tang 17934ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 18034ee09551764b045fdc02df754157473125edf60Kevin Tang None 18134ee09551764b045fdc02df754157473125edf60Kevin Tang 18234ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 18334ee09551764b045fdc02df754157473125edf60Kevin Tang 0: success 18434ee09551764b045fdc02df754157473125edf60Kevin Tang 18534ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 18634ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 18734ee09551764b045fdc02df754157473125edf60Kevin Tang 18834ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 18934ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_glue_msgunblock(int msgqid) 19034ee09551764b045fdc02df754157473125edf60Kevin Tang{ 19134ee09551764b045fdc02df754157473125edf60Kevin Tang return loc_eng_dmn_conn_glue_pipeunblock(msgqid); 19234ee09551764b045fdc02df754157473125edf60Kevin Tang} 19334ee09551764b045fdc02df754157473125edf60Kevin Tang 19434ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 19534ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION loc_eng_dmn_conn_glue_msgflush 19634ee09551764b045fdc02df754157473125edf60Kevin Tang 19734ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 19834ee09551764b045fdc02df754157473125edf60Kevin Tang flush out the message in a queue 19934ee09551764b045fdc02df754157473125edf60Kevin Tang 20034ee09551764b045fdc02df754157473125edf60Kevin Tang msgqid - message queue id 20134ee09551764b045fdc02df754157473125edf60Kevin Tang 20234ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 20334ee09551764b045fdc02df754157473125edf60Kevin Tang None 20434ee09551764b045fdc02df754157473125edf60Kevin Tang 20534ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 20634ee09551764b045fdc02df754157473125edf60Kevin Tang number of bytes that are flushed out. 20734ee09551764b045fdc02df754157473125edf60Kevin Tang 20834ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 20934ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 21034ee09551764b045fdc02df754157473125edf60Kevin Tang 21134ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 21234ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_glue_msgflush(int msgqid) 21334ee09551764b045fdc02df754157473125edf60Kevin Tang{ 21434ee09551764b045fdc02df754157473125edf60Kevin Tang int length; 21534ee09551764b045fdc02df754157473125edf60Kevin Tang char buf[128]; 21634ee09551764b045fdc02df754157473125edf60Kevin Tang 21734ee09551764b045fdc02df754157473125edf60Kevin Tang do { 21834ee09551764b045fdc02df754157473125edf60Kevin Tang length = loc_eng_dmn_conn_glue_piperead(msgqid, buf, 128); 21934ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("%s:%d] %s\n", __func__, __LINE__, buf); 22034ee09551764b045fdc02df754157473125edf60Kevin Tang } while(length); 22134ee09551764b045fdc02df754157473125edf60Kevin Tang return length; 22234ee09551764b045fdc02df754157473125edf60Kevin Tang} 22334ee09551764b045fdc02df754157473125edf60Kevin Tang 224