1bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Copyright (c) 2011, The Linux Foundation. All rights reserved.
2bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *
3bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * Redistribution and use in source and binary forms, with or without
4bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * modification, are permitted provided that the following conditions are
5bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * met:
6bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *     * Redistributions of source code must retain the above copyright
7bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       notice, this list of conditions and the following disclaimer.
8bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *     * Redistributions in binary form must reproduce the above
9bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       copyright notice, this list of conditions and the following
10bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       disclaimer in the documentation and/or other materials provided
11bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       with the distribution.
12bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *     * Neither the name of The Linux Foundation nor the names of its
13bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       contributors may be used to endorse or promote products derived
14bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *       from this software without specific prior written permission.
15bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *
16bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo *
28bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo */
29bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <linux/stat.h>
30bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <fcntl.h>
31bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
32bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <linux/types.h>
33bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
34bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "log_util.h"
35bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "platform_lib_includes.h"
36bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "loc_eng_dmn_conn_glue_msg.h"
37bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "loc_eng_dmn_conn_handler.h"
38bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
39bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
40bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_eng_dmn_conn_glue_msgget
41bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
42bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
43bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   This function get a message queue
44bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
45bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   q_path - name path of the message queue
46bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   mode -
47bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
48bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
49bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
50bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
51bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
52bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   message queue id
53bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
54bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
55bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
56bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
57bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
58bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_dmn_conn_glue_msgget(const char * q_path, int mode)
59bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
60bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int msgqid;
61bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    msgqid = loc_eng_dmn_conn_glue_pipeget(q_path, mode);
62bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return msgqid;
63bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
64bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
65bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
66bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_eng_dmn_conn_glue_msgremove
67bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
68bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
69bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   remove a message queue
70bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
71bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   q_path - name path of the message queue
72bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   msgqid - message queue id
73bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
74bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
75bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
76bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
77bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
78bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0: success or negative value for failure
79bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
80bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
81bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
82bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
83bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
84bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_dmn_conn_glue_msgremove(const char * q_path, int msgqid)
85bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
86bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int result;
87bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    result = loc_eng_dmn_conn_glue_piperemove(q_path, msgqid);
88bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return result;
89bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
90bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
91bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
92bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_eng_dmn_conn_glue_msgsnd
93bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
94bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
95bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   Send a message
96bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
97bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   msgqid - message queue id
98bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   msgp - pointer to the message to be sent
99bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   msgsz - size of the message
100bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
101bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
102bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
103bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
104bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
105bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   number of bytes sent out or negative value for failure
106bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
107bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
108bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
109bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
110bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
111bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_dmn_conn_glue_msgsnd(int msgqid, const void * msgp, size_t msgsz)
112bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
113bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int result;
114bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    struct ctrl_msgbuf *pmsg = (struct ctrl_msgbuf *) msgp;
115bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    pmsg->msgsz = msgsz;
116bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
117bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    result = loc_eng_dmn_conn_glue_pipewrite(msgqid, msgp, msgsz);
118bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (result != (int) msgsz) {
119bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGE("%s:%d] pipe broken %d, msgsz = %d\n", __func__, __LINE__, result, (int) msgsz);
120bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        return -1;
121bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
122bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
123bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return result;
124bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
125bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
126bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
127bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_eng_dmn_conn_glue_msgrcv
128bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
129bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
130bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   receive a message
131bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
132bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   msgqid - message queue id
133bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   msgp - pointer to the buffer to hold the message
134bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   msgsz - size of the buffer
135bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
136bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
137bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
138bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
139bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
140bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   number of bytes received or negative value for failure
141bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
142bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
143bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
144bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
145bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
146bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_dmn_conn_glue_msgrcv(int msgqid, void *msgp, size_t msgbufsz)
147bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
148bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int result;
149bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    struct ctrl_msgbuf *pmsg = (struct ctrl_msgbuf *) msgp;
150bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
151bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    result = loc_eng_dmn_conn_glue_piperead(msgqid, &(pmsg->msgsz), sizeof(pmsg->msgsz));
152bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (result != sizeof(pmsg->msgsz)) {
153bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGE("%s:%d] pipe broken %d\n", __func__, __LINE__, result);
154bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        return -1;
155bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
156bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
157bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (msgbufsz < pmsg->msgsz) {
158bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGE("%s:%d] msgbuf is too small %d < %d\n", __func__, __LINE__, (int) msgbufsz, (int) pmsg->msgsz);
159bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        return -1;
160bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
161bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
162bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    result = loc_eng_dmn_conn_glue_piperead(msgqid, (uint8_t *) msgp + sizeof(pmsg->msgsz), pmsg->msgsz - sizeof(pmsg->msgsz));
163bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    if (result != (int) (pmsg->msgsz - sizeof(pmsg->msgsz))) {
164bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGE("%s:%d] pipe broken %d, msgsz = %d\n", __func__, __LINE__, result, (int) pmsg->msgsz);
165bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        return -1;
166bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    }
167bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
168bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return pmsg->msgsz;
169bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
170bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
171bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
172bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_eng_dmn_conn_glue_msgunblock
173bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
174bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
175bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   unblock a message queue
176bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
177bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   msgqid - message queue id
178bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
179bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
180bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
181bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
182bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
183bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   0: success
184bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
185bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
186bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
187bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
188bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
189bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_dmn_conn_glue_msgunblock(int msgqid)
190bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
191bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return loc_eng_dmn_conn_glue_pipeunblock(msgqid);
192bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
193bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
194bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===========================================================================
195bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION    loc_eng_dmn_conn_glue_msgflush
196bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
197bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION
198bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   flush out the message in a queue
199bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
200bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   msgqid - message queue id
201bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
202bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES
203bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   None
204bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
205bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE
206bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   number of bytes that are flushed out.
207bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
208bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS
209bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo   N/A
210bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
211bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/
212bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_dmn_conn_glue_msgflush(int msgqid)
213bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{
214bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    int length;
215bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    char buf[128];
216bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
217bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    do {
218bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        length = loc_eng_dmn_conn_glue_piperead(msgqid, buf, 128);
219bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo        LOC_LOGD("%s:%d] %s\n", __func__, __LINE__, buf);
220bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    } while(length);
221bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo    return length;
222bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo}
223bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo
224