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