18c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Copyright (c) 2011-2012, 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 <string.h>
308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <unistd.h>
318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <errno.h>
328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam// #include <linux/stat.h>
348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <fcntl.h>
358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam// #include <linux/types.h>
368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <sys/types.h>
378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <sys/stat.h>
388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "loc_eng_dmn_conn_glue_pipe.h"
408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "log_util.h"
418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "platform_lib_includes.h"
428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===========================================================================
438c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION    loc_eng_dmn_conn_glue_pipeget
448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
458c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION
468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   create a named pipe.
478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   pipe_name - pipe name path
498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   mode - mode
508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
518c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES
528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   None
538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
548c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE
558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   0: success or negative value for failure
568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
578c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS
588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   N/A
598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/
618c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_eng_dmn_conn_glue_pipeget(const char * pipe_name, int mode)
628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int fd;
648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int result;
658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_LOGD("%s, mode = %d\n", pipe_name, mode);
678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    result = mkfifo(pipe_name, 0660);
688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if ((result == -1) && (errno != EEXIST)) {
708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LOC_LOGE("failed: %s\n", strerror(errno));
718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        return result;
728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    // The mode in mkfifo is not honoured and does not provide the
758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    // group permissions. Doing chmod to add group permissions.
768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    result = chmod (pipe_name, 0660);
778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (result != 0){
788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LOC_LOGE ("%s failed to change mode for %s, error = %s\n", __func__,
798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam              pipe_name, strerror(errno));
808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    fd = open(pipe_name, mode);
838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (fd <= 0)
848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    {
858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LOC_LOGE("failed: %s\n", strerror(errno));
868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_LOGD("fd = %d, %s\n", fd, pipe_name);
888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return fd;
898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===========================================================================
928c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION    loc_eng_dmn_conn_glue_piperemove
938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
948c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION
958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   remove a pipe
968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    pipe_name - pipe name path
988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    fd - fd for the pipe
998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1008c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES
1018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   None
1028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1038c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE
1048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   0: success
1058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1068c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS
1078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   N/A
1088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/
1108c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_eng_dmn_conn_glue_piperemove(const char * pipe_name, int fd)
1118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
1128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    close(fd);
1138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (pipe_name) unlink(pipe_name);
1148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_LOGD("fd = %d, %s\n", fd, pipe_name);
1158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return 0;
1168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
1178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===========================================================================
1198c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION    loc_eng_dmn_conn_glue_pipewrite
1208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1218c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION
1228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   write to a pipe
1238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   fd - fd of a pipe
1258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   buf - buffer for the data to write
1268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   sz - size of the data in buffer
1278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1288c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES
1298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   None
1308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1318c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE
1328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   number of bytes written or negative value for failure
1338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1348c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS
1358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   N/A
1368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/
1388c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_eng_dmn_conn_glue_pipewrite(int fd, const void * buf, size_t sz)
1398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
1408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int result;
1418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    result = write(fd, buf, sz);
1438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    /* @todo check for non EINTR & EAGAIN, shall not do select again, select_tut Law 7) */
1458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    /* LOC_LOGD("fd = %d, buf = 0x%lx, size = %d, result = %d\n", fd, (long) buf, (int) sz, (int) result); */
1478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return result;
1488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
1498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===========================================================================
1518c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION    loc_eng_dmn_conn_glue_piperead
1528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1538c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION
1548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   read from a pipe
1558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   fd - fd for the pipe
1578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   buf - buffer to hold the data read from pipe
1588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   sz - size of the buffer
1598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1608c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES
1618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   None
1628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1638c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE
1648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   number of bytes read from pipe or negative value for failure
1658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1668c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS
1678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   N/A
1688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/
1708c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_eng_dmn_conn_glue_piperead(int fd, void * buf, size_t sz)
1718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
1728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int len;
1738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    len = read(fd, buf, sz);
1758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    /* @todo check for non EINTR & EAGAIN, shall not do select again, select_tut Law 7) */
1778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    /* LOC_LOGD("fd = %d, buf = 0x%lx, size = %d, len = %d\n", fd, (long) buf, (int) sz, len); */
1798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return len;
1808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
1818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===========================================================================
1838c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION    loc_eng_dmn_conn_glue_pipeunblock
1848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1858c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION
1868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   unblock a pipe
1878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   fd - fd for the pipe
1898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1908c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES
1918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   None
1928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1938c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE
1948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   0 for success or negative value for failure
1958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1968c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS
1978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   N/A
1988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/
2008c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_eng_dmn_conn_glue_pipeunblock(int fd)
2018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
2028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int result;
2038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    struct flock flock_v;
2048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_LOGD("\n");
2058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam//    result = fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NDELAY);
2068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    flock_v.l_type = F_UNLCK;
2078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    flock_v.l_len = 32;
2088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    result = fcntl(fd, F_SETLK, &flock_v);
2098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (result < 0) {
2108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LOC_LOGE("fcntl failure, %s\n", strerror(errno));
2118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
2128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return result;
2148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
215