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