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