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