Home | History | Annotate | Download | only in libloc_api_50001
      1 /* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
      2  *
      3  * Redistribution and use in source and binary forms, with or without
      4  * modification, are permitted provided that the following conditions are
      5  * met:
      6  *     * Redistributions of source code must retain the above copyright
      7  *       notice, this list of conditions and the following disclaimer.
      8  *     * Redistributions in binary form must reproduce the above
      9  *       copyright notice, this list of conditions and the following
     10  *       disclaimer in the documentation and/or other materials provided
     11  *       with the distribution.
     12  *     * Neither the name of The Linux Foundation, nor the names of its
     13  *       contributors may be used to endorse or promote products derived
     14  *       from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  *
     28  */
     29 #include <string.h>
     30 #include <unistd.h>
     31 #include <errno.h>
     32 
     33 // #include <linux/stat.h>
     34 #include <fcntl.h>
     35 // #include <linux/types.h>
     36 #include <sys/types.h>
     37 #include <sys/stat.h>
     38 
     39 #include "loc_eng_dmn_conn_glue_pipe.h"
     40 #include "log_util.h"
     41 #include "platform_lib_includes.h"
     42 /*===========================================================================
     43 FUNCTION    loc_eng_dmn_conn_glue_pipeget
     44 
     45 DESCRIPTION
     46    create a named pipe.
     47 
     48    pipe_name - pipe name path
     49    mode - mode
     50 
     51 DEPENDENCIES
     52    None
     53 
     54 RETURN VALUE
     55    0: success or negative value for failure
     56 
     57 SIDE EFFECTS
     58    N/A
     59 
     60 ===========================================================================*/
     61 int loc_eng_dmn_conn_glue_pipeget(const char * pipe_name, int mode)
     62 {
     63     int fd;
     64     int result;
     65 
     66     LOC_LOGD("%s, mode = %d\n", pipe_name, mode);
     67     result = mkfifo(pipe_name, 0660);
     68 
     69     if ((result == -1) && (errno != EEXIST)) {
     70         LOC_LOGE("failed: %s\n", strerror(errno));
     71         return result;
     72     }
     73 
     74     // The mode in mkfifo is not honoured and does not provide the
     75     // group permissions. Doing chmod to add group permissions.
     76     result = chmod (pipe_name, 0660);
     77     if (result != 0){
     78         LOC_LOGE ("%s failed to change mode for %s, error = %s\n", __func__,
     79               pipe_name, strerror(errno));
     80     }
     81 
     82     fd = open(pipe_name, mode);
     83     if (fd <= 0)
     84     {
     85         LOC_LOGE("failed: %s\n", strerror(errno));
     86     }
     87     LOC_LOGD("fd = %d, %s\n", fd, pipe_name);
     88     return fd;
     89 }
     90 
     91 /*===========================================================================
     92 FUNCTION    loc_eng_dmn_conn_glue_piperemove
     93 
     94 DESCRIPTION
     95    remove a pipe
     96 
     97     pipe_name - pipe name path
     98     fd - fd for the pipe
     99 
    100 DEPENDENCIES
    101    None
    102 
    103 RETURN VALUE
    104    0: success
    105 
    106 SIDE EFFECTS
    107    N/A
    108 
    109 ===========================================================================*/
    110 int loc_eng_dmn_conn_glue_piperemove(const char * pipe_name, int fd)
    111 {
    112     close(fd);
    113     if (pipe_name) unlink(pipe_name);
    114     LOC_LOGD("fd = %d, %s\n", fd, pipe_name);
    115     return 0;
    116 }
    117 
    118 /*===========================================================================
    119 FUNCTION    loc_eng_dmn_conn_glue_pipewrite
    120 
    121 DESCRIPTION
    122    write to a pipe
    123 
    124    fd - fd of a pipe
    125    buf - buffer for the data to write
    126    sz - size of the data in buffer
    127 
    128 DEPENDENCIES
    129    None
    130 
    131 RETURN VALUE
    132    number of bytes written or negative value for failure
    133 
    134 SIDE EFFECTS
    135    N/A
    136 
    137 ===========================================================================*/
    138 int loc_eng_dmn_conn_glue_pipewrite(int fd, const void * buf, size_t sz)
    139 {
    140     int result;
    141 
    142     result = write(fd, buf, sz);
    143 
    144     /* @todo check for non EINTR & EAGAIN, shall not do select again, select_tut Law 7) */
    145 
    146     /* LOC_LOGD("fd = %d, buf = 0x%lx, size = %d, result = %d\n", fd, (long) buf, (int) sz, (int) result); */
    147     return result;
    148 }
    149 
    150 /*===========================================================================
    151 FUNCTION    loc_eng_dmn_conn_glue_piperead
    152 
    153 DESCRIPTION
    154    read from a pipe
    155 
    156    fd - fd for the pipe
    157    buf - buffer to hold the data read from pipe
    158    sz - size of the buffer
    159 
    160 DEPENDENCIES
    161    None
    162 
    163 RETURN VALUE
    164    number of bytes read from pipe or negative value for failure
    165 
    166 SIDE EFFECTS
    167    N/A
    168 
    169 ===========================================================================*/
    170 int loc_eng_dmn_conn_glue_piperead(int fd, void * buf, size_t sz)
    171 {
    172     int len;
    173 
    174     len = read(fd, buf, sz);
    175 
    176     /* @todo check for non EINTR & EAGAIN, shall not do select again, select_tut Law 7) */
    177 
    178     /* LOC_LOGD("fd = %d, buf = 0x%lx, size = %d, len = %d\n", fd, (long) buf, (int) sz, len); */
    179     return len;
    180 }
    181 
    182 /*===========================================================================
    183 FUNCTION    loc_eng_dmn_conn_glue_pipeunblock
    184 
    185 DESCRIPTION
    186    unblock a pipe
    187 
    188    fd - fd for the pipe
    189 
    190 DEPENDENCIES
    191    None
    192 
    193 RETURN VALUE
    194    0 for success or negative value for failure
    195 
    196 SIDE EFFECTS
    197    N/A
    198 
    199 ===========================================================================*/
    200 int loc_eng_dmn_conn_glue_pipeunblock(int fd)
    201 {
    202     int result;
    203     struct flock flock_v;
    204     LOC_LOGD("\n");
    205 //    result = fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NDELAY);
    206     flock_v.l_type = F_UNLCK;
    207     flock_v.l_len = 32;
    208     result = fcntl(fd, F_SETLK, &flock_v);
    209     if (result < 0) {
    210         LOC_LOGE("fcntl failure, %s\n", strerror(errno));
    211     }
    212 
    213     return result;
    214 }
    215