1e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo/* Copyright (c) 2011-2012, 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 <string.h>
3034ee09551764b045fdc02df754157473125edf60Kevin Tang#include <unistd.h>
3134ee09551764b045fdc02df754157473125edf60Kevin Tang#include <errno.h>
3234ee09551764b045fdc02df754157473125edf60Kevin Tang
3334ee09551764b045fdc02df754157473125edf60Kevin Tang// #include <linux/stat.h>
3434ee09551764b045fdc02df754157473125edf60Kevin Tang#include <fcntl.h>
3534ee09551764b045fdc02df754157473125edf60Kevin Tang// #include <linux/types.h>
3634ee09551764b045fdc02df754157473125edf60Kevin Tang#include <sys/types.h>
3734ee09551764b045fdc02df754157473125edf60Kevin Tang#include <sys/stat.h>
3834ee09551764b045fdc02df754157473125edf60Kevin Tang
3934ee09551764b045fdc02df754157473125edf60Kevin Tang#include "loc_eng_dmn_conn_glue_pipe.h"
4034ee09551764b045fdc02df754157473125edf60Kevin Tang#include "log_util.h"
41e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include "platform_lib_includes.h"
4234ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
4334ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_eng_dmn_conn_glue_pipeget
4434ee09551764b045fdc02df754157473125edf60Kevin Tang
4534ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
4634ee09551764b045fdc02df754157473125edf60Kevin Tang   create a named pipe.
4734ee09551764b045fdc02df754157473125edf60Kevin Tang
4834ee09551764b045fdc02df754157473125edf60Kevin Tang   pipe_name - pipe name path
4934ee09551764b045fdc02df754157473125edf60Kevin Tang   mode - mode
5034ee09551764b045fdc02df754157473125edf60Kevin Tang
5134ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
5234ee09551764b045fdc02df754157473125edf60Kevin Tang   None
5334ee09551764b045fdc02df754157473125edf60Kevin Tang
5434ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
5534ee09551764b045fdc02df754157473125edf60Kevin Tang   0: success or negative value for failure
5634ee09551764b045fdc02df754157473125edf60Kevin Tang
5734ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
5834ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
5934ee09551764b045fdc02df754157473125edf60Kevin Tang
6034ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
6134ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_glue_pipeget(const char * pipe_name, int mode)
6234ee09551764b045fdc02df754157473125edf60Kevin Tang{
6334ee09551764b045fdc02df754157473125edf60Kevin Tang    int fd;
6434ee09551764b045fdc02df754157473125edf60Kevin Tang    int result;
6534ee09551764b045fdc02df754157473125edf60Kevin Tang
6634ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGD("%s, mode = %d\n", pipe_name, mode);
67e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    result = mkfifo(pipe_name, 0660);
6834ee09551764b045fdc02df754157473125edf60Kevin Tang
6934ee09551764b045fdc02df754157473125edf60Kevin Tang    if ((result == -1) && (errno != EEXIST)) {
7034ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGE("failed: %s\n", strerror(errno));
7134ee09551764b045fdc02df754157473125edf60Kevin Tang        return result;
7234ee09551764b045fdc02df754157473125edf60Kevin Tang    }
7334ee09551764b045fdc02df754157473125edf60Kevin Tang
74e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    // The mode in mkfifo is not honoured and does not provide the
75e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    // group permissions. Doing chmod to add group permissions.
76e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    result = chmod (pipe_name, 0660);
77e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    if (result != 0){
78e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo        LOC_LOGE ("%s failed to change mode for %s, error = %s\n", __func__,
79e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo              pipe_name, strerror(errno));
80e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo    }
81e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo
8234ee09551764b045fdc02df754157473125edf60Kevin Tang    fd = open(pipe_name, mode);
8334ee09551764b045fdc02df754157473125edf60Kevin Tang    if (fd <= 0)
8434ee09551764b045fdc02df754157473125edf60Kevin Tang    {
8534ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGE("failed: %s\n", strerror(errno));
8634ee09551764b045fdc02df754157473125edf60Kevin Tang    }
8734ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGD("fd = %d, %s\n", fd, pipe_name);
8834ee09551764b045fdc02df754157473125edf60Kevin Tang    return fd;
8934ee09551764b045fdc02df754157473125edf60Kevin Tang}
9034ee09551764b045fdc02df754157473125edf60Kevin Tang
9134ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
9234ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_eng_dmn_conn_glue_piperemove
9334ee09551764b045fdc02df754157473125edf60Kevin Tang
9434ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
9534ee09551764b045fdc02df754157473125edf60Kevin Tang   remove a pipe
9634ee09551764b045fdc02df754157473125edf60Kevin Tang
9734ee09551764b045fdc02df754157473125edf60Kevin Tang    pipe_name - pipe name path
9834ee09551764b045fdc02df754157473125edf60Kevin Tang    fd - fd for the pipe
9934ee09551764b045fdc02df754157473125edf60Kevin Tang
10034ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
10134ee09551764b045fdc02df754157473125edf60Kevin Tang   None
10234ee09551764b045fdc02df754157473125edf60Kevin Tang
10334ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
10434ee09551764b045fdc02df754157473125edf60Kevin Tang   0: success
10534ee09551764b045fdc02df754157473125edf60Kevin Tang
10634ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
10734ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
10834ee09551764b045fdc02df754157473125edf60Kevin Tang
10934ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
11034ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_glue_piperemove(const char * pipe_name, int fd)
11134ee09551764b045fdc02df754157473125edf60Kevin Tang{
11234ee09551764b045fdc02df754157473125edf60Kevin Tang    close(fd);
11334ee09551764b045fdc02df754157473125edf60Kevin Tang    if (pipe_name) unlink(pipe_name);
11434ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGD("fd = %d, %s\n", fd, pipe_name);
11534ee09551764b045fdc02df754157473125edf60Kevin Tang    return 0;
11634ee09551764b045fdc02df754157473125edf60Kevin Tang}
11734ee09551764b045fdc02df754157473125edf60Kevin Tang
11834ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
11934ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_eng_dmn_conn_glue_pipewrite
12034ee09551764b045fdc02df754157473125edf60Kevin Tang
12134ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
12234ee09551764b045fdc02df754157473125edf60Kevin Tang   write to a pipe
12334ee09551764b045fdc02df754157473125edf60Kevin Tang
12434ee09551764b045fdc02df754157473125edf60Kevin Tang   fd - fd of a pipe
12534ee09551764b045fdc02df754157473125edf60Kevin Tang   buf - buffer for the data to write
12634ee09551764b045fdc02df754157473125edf60Kevin Tang   sz - size of the data in buffer
12734ee09551764b045fdc02df754157473125edf60Kevin Tang
12834ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
12934ee09551764b045fdc02df754157473125edf60Kevin Tang   None
13034ee09551764b045fdc02df754157473125edf60Kevin Tang
13134ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
13234ee09551764b045fdc02df754157473125edf60Kevin Tang   number of bytes written or negative value for failure
13334ee09551764b045fdc02df754157473125edf60Kevin Tang
13434ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
13534ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
13634ee09551764b045fdc02df754157473125edf60Kevin Tang
13734ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
13834ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_glue_pipewrite(int fd, const void * buf, size_t sz)
13934ee09551764b045fdc02df754157473125edf60Kevin Tang{
14034ee09551764b045fdc02df754157473125edf60Kevin Tang    int result;
14134ee09551764b045fdc02df754157473125edf60Kevin Tang
14234ee09551764b045fdc02df754157473125edf60Kevin Tang    result = write(fd, buf, sz);
14334ee09551764b045fdc02df754157473125edf60Kevin Tang
14434ee09551764b045fdc02df754157473125edf60Kevin Tang    /* @todo check for non EINTR & EAGAIN, shall not do select again, select_tut Law 7) */
14534ee09551764b045fdc02df754157473125edf60Kevin Tang
14634ee09551764b045fdc02df754157473125edf60Kevin Tang    /* LOC_LOGD("fd = %d, buf = 0x%lx, size = %d, result = %d\n", fd, (long) buf, (int) sz, (int) result); */
14734ee09551764b045fdc02df754157473125edf60Kevin Tang    return result;
14834ee09551764b045fdc02df754157473125edf60Kevin Tang}
14934ee09551764b045fdc02df754157473125edf60Kevin Tang
15034ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
15134ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_eng_dmn_conn_glue_piperead
15234ee09551764b045fdc02df754157473125edf60Kevin Tang
15334ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
15434ee09551764b045fdc02df754157473125edf60Kevin Tang   read from a pipe
15534ee09551764b045fdc02df754157473125edf60Kevin Tang
15634ee09551764b045fdc02df754157473125edf60Kevin Tang   fd - fd for the pipe
15734ee09551764b045fdc02df754157473125edf60Kevin Tang   buf - buffer to hold the data read from pipe
15834ee09551764b045fdc02df754157473125edf60Kevin Tang   sz - size of the buffer
15934ee09551764b045fdc02df754157473125edf60Kevin Tang
16034ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
16134ee09551764b045fdc02df754157473125edf60Kevin Tang   None
16234ee09551764b045fdc02df754157473125edf60Kevin Tang
16334ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
16434ee09551764b045fdc02df754157473125edf60Kevin Tang   number of bytes read from pipe or negative value for failure
16534ee09551764b045fdc02df754157473125edf60Kevin Tang
16634ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
16734ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
16834ee09551764b045fdc02df754157473125edf60Kevin Tang
16934ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
17034ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_glue_piperead(int fd, void * buf, size_t sz)
17134ee09551764b045fdc02df754157473125edf60Kevin Tang{
17234ee09551764b045fdc02df754157473125edf60Kevin Tang    int len;
17334ee09551764b045fdc02df754157473125edf60Kevin Tang
17434ee09551764b045fdc02df754157473125edf60Kevin Tang    len = read(fd, buf, sz);
17534ee09551764b045fdc02df754157473125edf60Kevin Tang
17634ee09551764b045fdc02df754157473125edf60Kevin Tang    /* @todo check for non EINTR & EAGAIN, shall not do select again, select_tut Law 7) */
17734ee09551764b045fdc02df754157473125edf60Kevin Tang
17834ee09551764b045fdc02df754157473125edf60Kevin Tang    /* LOC_LOGD("fd = %d, buf = 0x%lx, size = %d, len = %d\n", fd, (long) buf, (int) sz, len); */
17934ee09551764b045fdc02df754157473125edf60Kevin Tang    return len;
18034ee09551764b045fdc02df754157473125edf60Kevin Tang}
18134ee09551764b045fdc02df754157473125edf60Kevin Tang
18234ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
18334ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION    loc_eng_dmn_conn_glue_pipeunblock
18434ee09551764b045fdc02df754157473125edf60Kevin Tang
18534ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
18634ee09551764b045fdc02df754157473125edf60Kevin Tang   unblock a pipe
18734ee09551764b045fdc02df754157473125edf60Kevin Tang
18834ee09551764b045fdc02df754157473125edf60Kevin Tang   fd - fd for the pipe
18934ee09551764b045fdc02df754157473125edf60Kevin Tang
19034ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES
19134ee09551764b045fdc02df754157473125edf60Kevin Tang   None
19234ee09551764b045fdc02df754157473125edf60Kevin Tang
19334ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
19434ee09551764b045fdc02df754157473125edf60Kevin Tang   0 for success or negative value for failure
19534ee09551764b045fdc02df754157473125edf60Kevin Tang
19634ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS
19734ee09551764b045fdc02df754157473125edf60Kevin Tang   N/A
19834ee09551764b045fdc02df754157473125edf60Kevin Tang
19934ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
20034ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_glue_pipeunblock(int fd)
20134ee09551764b045fdc02df754157473125edf60Kevin Tang{
20234ee09551764b045fdc02df754157473125edf60Kevin Tang    int result;
20334ee09551764b045fdc02df754157473125edf60Kevin Tang    struct flock flock_v;
20434ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_LOGD("\n");
20534ee09551764b045fdc02df754157473125edf60Kevin Tang//    result = fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NDELAY);
20634ee09551764b045fdc02df754157473125edf60Kevin Tang    flock_v.l_type = F_UNLCK;
20734ee09551764b045fdc02df754157473125edf60Kevin Tang    flock_v.l_len = 32;
20834ee09551764b045fdc02df754157473125edf60Kevin Tang    result = fcntl(fd, F_SETLK, &flock_v);
20934ee09551764b045fdc02df754157473125edf60Kevin Tang    if (result < 0) {
21034ee09551764b045fdc02df754157473125edf60Kevin Tang        LOC_LOGE("fcntl failure, %s\n", strerror(errno));
21134ee09551764b045fdc02df754157473125edf60Kevin Tang    }
21234ee09551764b045fdc02df754157473125edf60Kevin Tang
21334ee09551764b045fdc02df754157473125edf60Kevin Tang    return result;
21434ee09551764b045fdc02df754157473125edf60Kevin Tang}
215