18c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Copyright (c) 2011, The Linux Foundation. All rights reserved. 28c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * 38c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * Redistribution and use in source and binary forms, with or without 48c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * modification, are permitted provided that the following conditions are 58c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * met: 68c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * * Redistributions of source code must retain the above copyright 78c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * notice, this list of conditions and the following disclaimer. 88c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * * Redistributions in binary form must reproduce the above 98c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * copyright notice, this list of conditions and the following 108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * disclaimer in the documentation and/or other materials provided 118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * with the distribution. 128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * * Neither the name of The Linux Foundation nor the names of its 138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * contributors may be used to endorse or promote products derived 148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * from this software without specific prior written permission. 158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * 168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * 288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam */ 298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <linux/stat.h> 308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <fcntl.h> 318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <linux/types.h> 338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "log_util.h" 358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "platform_lib_includes.h" 368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "loc_eng_dmn_conn_glue_msg.h" 378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "loc_eng_dmn_conn_handler.h" 388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 408c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_eng_dmn_conn_glue_msgget 418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 428c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam This function get a message queue 448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam q_path - name path of the message queue 468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam mode - 478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 488c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES 498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam None 508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 518c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam message queue id 538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 548c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS 558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 588c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_eng_dmn_conn_glue_msgget(const char * q_path, int mode) 598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int msgqid; 618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam msgqid = loc_eng_dmn_conn_glue_pipeget(q_path, mode); 628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return msgqid; 638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 668c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_eng_dmn_conn_glue_msgremove 678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 688c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam remove a message queue 708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam q_path - name path of the message queue 728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam msgqid - message queue id 738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 748c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES 758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam None 768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 778c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 0: success or negative value for failure 798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 808c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS 818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 848c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_eng_dmn_conn_glue_msgremove(const char * q_path, int msgqid) 858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int result; 878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam result = loc_eng_dmn_conn_glue_piperemove(q_path, msgqid); 888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return result; 898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 928c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_eng_dmn_conn_glue_msgsnd 938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 948c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam Send a message 968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam msgqid - message queue id 988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam msgp - pointer to the message to be sent 998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam msgsz - size of the message 1008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1018c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES 1028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam None 1038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1048c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 1058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam number of bytes sent out or negative value for failure 1068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1078c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS 1088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 1098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 1118c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_eng_dmn_conn_glue_msgsnd(int msgqid, const void * msgp, size_t msgsz) 1128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 1138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int result; 1148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam struct ctrl_msgbuf *pmsg = (struct ctrl_msgbuf *) msgp; 1158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam pmsg->msgsz = msgsz; 1168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam result = loc_eng_dmn_conn_glue_pipewrite(msgqid, msgp, msgsz); 1188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (result != (int) msgsz) { 1198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s:%d] pipe broken %d, msgsz = %d\n", __func__, __LINE__, result, (int) msgsz); 1208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return -1; 1218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return result; 1248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 1258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 1278c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_eng_dmn_conn_glue_msgrcv 1288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1298c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 1308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam receive a message 1318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam msgqid - message queue id 1338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam msgp - pointer to the buffer to hold the message 1348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam msgsz - size of the buffer 1358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1368c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES 1378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam None 1388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1398c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 1408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam number of bytes received or negative value for failure 1418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1428c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS 1438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 1448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 1468c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_eng_dmn_conn_glue_msgrcv(int msgqid, void *msgp, size_t msgbufsz) 1478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 1488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int result; 1498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam struct ctrl_msgbuf *pmsg = (struct ctrl_msgbuf *) msgp; 1508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam result = loc_eng_dmn_conn_glue_piperead(msgqid, &(pmsg->msgsz), sizeof(pmsg->msgsz)); 1528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (result != sizeof(pmsg->msgsz)) { 1538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s:%d] pipe broken %d\n", __func__, __LINE__, result); 1548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return -1; 1558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (msgbufsz < pmsg->msgsz) { 1588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s:%d] msgbuf is too small %d < %d\n", __func__, __LINE__, (int) msgbufsz, (int) pmsg->msgsz); 1598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return -1; 1608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam result = loc_eng_dmn_conn_glue_piperead(msgqid, (uint8_t *) msgp + sizeof(pmsg->msgsz), pmsg->msgsz - sizeof(pmsg->msgsz)); 1638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (result != (int) (pmsg->msgsz - sizeof(pmsg->msgsz))) { 1648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s:%d] pipe broken %d, msgsz = %d\n", __func__, __LINE__, result, (int) pmsg->msgsz); 1658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return -1; 1668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return pmsg->msgsz; 1698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 1708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 1728c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_eng_dmn_conn_glue_msgunblock 1738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1748c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 1758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam unblock a message queue 1768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam msgqid - message queue id 1788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1798c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES 1808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam None 1818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1828c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 1838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 0: success 1848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1858c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS 1868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 1878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 1898c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_eng_dmn_conn_glue_msgunblock(int msgqid) 1908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 1918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return loc_eng_dmn_conn_glue_pipeunblock(msgqid); 1928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 1938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 1958c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_eng_dmn_conn_glue_msgflush 1968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1978c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 1988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam flush out the message in a queue 1998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam msgqid - message queue id 2018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2028c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES 2038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam None 2048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2058c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 2068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam number of bytes that are flushed out. 2078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2088c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS 2098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 2108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 2128c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_eng_dmn_conn_glue_msgflush(int msgqid) 2138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 2148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int length; 2158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam char buf[128]; 2168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam do { 2188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam length = loc_eng_dmn_conn_glue_piperead(msgqid, buf, 128); 2198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGD("%s:%d] %s\n", __func__, __LINE__, buf); 2208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } while(length); 2218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return length; 2228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 2238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 224