14035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/* Copyright (c) 2011, The Linux Foundation. All rights reserved.
24035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *
34035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * Redistribution and use in source and binary forms, with or without
44035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * modification, are permitted provided that the following conditions are
54035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * met:
64035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *     * Redistributions of source code must retain the above copyright
74035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       notice, this list of conditions and the following disclaimer.
84035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *     * Redistributions in binary form must reproduce the above
94035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       copyright notice, this list of conditions and the following
104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       disclaimer in the documentation and/or other materials provided
114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       with the distribution.
124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *     * Neither the name of The Linux Foundation nor the names of its
134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       contributors may be used to endorse or promote products derived
144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       from this software without specific prior written permission.
154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *
164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *
284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin */
294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <linux/stat.h>
304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <fcntl.h>
314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <linux/types.h>
334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include "log_util.h"
354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include "platform_lib_includes.h"
364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include "loc_eng_dmn_conn_glue_msg.h"
374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include "loc_eng_dmn_conn_handler.h"
384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*===========================================================================
404035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION    loc_eng_dmn_conn_glue_msgget
414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
424035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION
434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   This function get a message queue
444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   q_path - name path of the message queue
464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   mode -
474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
484035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES
494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   None
504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
514035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE
524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   message queue id
534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
544035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS
554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   N/A
564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/
584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_dmn_conn_glue_msgget(const char * q_path, int mode)
594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int msgqid;
614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    msgqid = loc_eng_dmn_conn_glue_pipeget(q_path, mode);
624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return msgqid;
634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*===========================================================================
664035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION    loc_eng_dmn_conn_glue_msgremove
674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
684035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION
694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   remove a message queue
704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   q_path - name path of the message queue
724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   msgqid - message queue id
734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
744035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES
754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   None
764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
774035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE
784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   0: success or negative value for failure
794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
804035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS
814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   N/A
824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/
844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_dmn_conn_glue_msgremove(const char * q_path, int msgqid)
854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int result;
874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    result = loc_eng_dmn_conn_glue_piperemove(q_path, msgqid);
884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return result;
894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*===========================================================================
924035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION    loc_eng_dmn_conn_glue_msgsnd
934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
944035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION
954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   Send a message
964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   msgqid - message queue id
984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   msgp - pointer to the message to be sent
994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   msgsz - size of the message
1004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1014035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES
1024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   None
1034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1044035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE
1054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   number of bytes sent out or negative value for failure
1064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1074035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS
1084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   N/A
1094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/
1114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_dmn_conn_glue_msgsnd(int msgqid, const void * msgp, size_t msgsz)
1124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int result;
1144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    struct ctrl_msgbuf *pmsg = (struct ctrl_msgbuf *) msgp;
1154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    pmsg->msgsz = msgsz;
1164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    result = loc_eng_dmn_conn_glue_pipewrite(msgqid, msgp, msgsz);
1184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (result != (int) msgsz) {
1194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("%s:%d] pipe broken %d, msgsz = %d\n", __func__, __LINE__, result, (int) msgsz);
1204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return -1;
1214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
1224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return result;
1244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*===========================================================================
1274035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION    loc_eng_dmn_conn_glue_msgrcv
1284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1294035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION
1304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   receive a message
1314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   msgqid - message queue id
1334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   msgp - pointer to the buffer to hold the message
1344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   msgsz - size of the buffer
1354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1364035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES
1374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   None
1384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1394035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE
1404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   number of bytes received or negative value for failure
1414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1424035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS
1434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   N/A
1444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/
1464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_dmn_conn_glue_msgrcv(int msgqid, void *msgp, size_t msgbufsz)
1474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int result;
1494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    struct ctrl_msgbuf *pmsg = (struct ctrl_msgbuf *) msgp;
1504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    result = loc_eng_dmn_conn_glue_piperead(msgqid, &(pmsg->msgsz), sizeof(pmsg->msgsz));
1524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (result != sizeof(pmsg->msgsz)) {
1534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("%s:%d] pipe broken %d\n", __func__, __LINE__, result);
1544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return -1;
1554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
1564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (msgbufsz < pmsg->msgsz) {
1584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("%s:%d] msgbuf is too small %d < %d\n", __func__, __LINE__, (int) msgbufsz, (int) pmsg->msgsz);
1594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return -1;
1604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
1614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    result = loc_eng_dmn_conn_glue_piperead(msgqid, (uint8_t *) msgp + sizeof(pmsg->msgsz), pmsg->msgsz - sizeof(pmsg->msgsz));
1634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (result != (int) (pmsg->msgsz - sizeof(pmsg->msgsz))) {
1644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("%s:%d] pipe broken %d, msgsz = %d\n", __func__, __LINE__, result, (int) pmsg->msgsz);
1654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return -1;
1664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
1674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return pmsg->msgsz;
1694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*===========================================================================
1724035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION    loc_eng_dmn_conn_glue_msgunblock
1734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1744035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION
1754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   unblock a message queue
1764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   msgqid - message queue id
1784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1794035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES
1804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   None
1814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1824035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE
1834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   0: success
1844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1854035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS
1864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   N/A
1874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/
1894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_dmn_conn_glue_msgunblock(int msgqid)
1904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
1914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return loc_eng_dmn_conn_glue_pipeunblock(msgqid);
1924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
1934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*===========================================================================
1954035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION    loc_eng_dmn_conn_glue_msgflush
1964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1974035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION
1984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   flush out the message in a queue
1994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   msgqid - message queue id
2014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2024035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES
2034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   None
2044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2054035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE
2064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   number of bytes that are flushed out.
2074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2084035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS
2094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin   N/A
2104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/
2124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_dmn_conn_glue_msgflush(int msgqid)
2134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
2144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    int length;
2154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    char buf[128];
2164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
2174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    do {
2184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        length = loc_eng_dmn_conn_glue_piperead(msgqid, buf, 128);
2194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGD("%s:%d] %s\n", __func__, __LINE__, buf);
2204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    } while(length);
2214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return length;
2224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
2234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
224