root/opal/mca/pmix/pmix4x/pmix/src/util/fd.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. pmix_fd_read
  2. pmix_fd_write
  3. pmix_fd_set_cloexec
  4. pmix_fd_is_regular
  5. pmix_fd_is_chardev
  6. pmix_fd_is_blkdev

   1 /*
   2  * Copyright (c) 2008-2014 Cisco Systems, Inc.  All rights reserved.
   3  * Copyright (c) 2009      Sandia National Laboratories. All rights reserved.
   4  * Copyright (c) 2014-2018 Intel, Inc. All rights reserved.
   5  * Copyright (c) 2015      Research Organization for Information Science
   6  *                         and Technology (RIST). All rights reserved.
   7  * $COPYRIGHT$
   8  *
   9  * Additional copyrights may follow
  10  *
  11  * $HEADER$
  12  */
  13 
  14 #include <src/include/pmix_config.h>
  15 
  16 #include <pmix_common.h>
  17 
  18 #ifdef HAVE_UNISTD_H
  19 #include <unistd.h>
  20 #endif
  21 #include <errno.h>
  22 #include <fcntl.h>
  23 #ifdef HAVE_SYS_TYPES_H
  24 #include <sys/types.h>
  25 #endif
  26 #ifdef HAVE_SYS_STAT_H
  27 #include <sys/stat.h>
  28 #endif
  29 
  30 #include "src/util/error.h"
  31 #include "src/util/fd.h"
  32 
  33 
  34 /*
  35  * Simple loop over reading from a fd
  36  */
  37 pmix_status_t pmix_fd_read(int fd, int len, void *buffer)
  38 {
  39     int rc;
  40     char *b = buffer;
  41 
  42     while (len > 0) {
  43         rc = read(fd, b, len);
  44         if (rc < 0 && (EAGAIN == errno || EINTR == errno)) {
  45             continue;
  46         } else if (rc > 0) {
  47             len -= rc;
  48             b += rc;
  49         } else if (0 == rc) {
  50             return PMIX_ERR_TIMEOUT;
  51         } else {
  52             return PMIX_ERR_IN_ERRNO;
  53         }
  54     }
  55     return PMIX_SUCCESS;
  56 }
  57 
  58 
  59 /*
  60  * Simple loop over writing to an fd
  61  */
  62 pmix_status_t pmix_fd_write(int fd, int len, const void *buffer)
  63 {
  64     int rc;
  65     const char *b = buffer;
  66 
  67     while (len > 0) {
  68         rc = write(fd, b, len);
  69         if (rc < 0 && (EAGAIN == errno || EINTR == errno)) {
  70             continue;
  71         } else if (rc > 0) {
  72             len -= rc;
  73             b += rc;
  74         } else {
  75             return PMIX_ERR_IN_ERRNO;
  76         }
  77     }
  78 
  79     return PMIX_SUCCESS;
  80 }
  81 
  82 
  83 pmix_status_t pmix_fd_set_cloexec(int fd)
  84 {
  85 #ifdef FD_CLOEXEC
  86     int flags;
  87 
  88     /* Stevens says that we should get the fd's flags before we set
  89        them.  So say we all. */
  90     flags = fcntl(fd, F_GETFD, 0);
  91     if (-1 == flags) {
  92         return PMIX_ERR_IN_ERRNO;
  93     }
  94 
  95     if (fcntl(fd, F_SETFD, FD_CLOEXEC | flags) == -1) {
  96         return PMIX_ERR_IN_ERRNO;
  97     }
  98 #endif
  99 
 100     return PMIX_SUCCESS;
 101 }
 102 
 103 
 104 bool pmix_fd_is_regular(int fd)
 105 {
 106     struct stat buf;
 107     if (fstat(fd, &buf)) {
 108         return false;
 109     }
 110     return S_ISREG(buf.st_mode);
 111 }
 112 
 113 bool pmix_fd_is_chardev(int fd)
 114 {
 115     struct stat buf;
 116     if (fstat(fd, &buf)) {
 117         return false;
 118     }
 119     return S_ISCHR(buf.st_mode);
 120 }
 121 
 122 bool pmix_fd_is_blkdev(int fd)
 123 {
 124     struct stat buf;
 125     if (fstat(fd, &buf)) {
 126         return false;
 127     }
 128     return S_ISBLK(buf.st_mode);
 129 }

/* [<][>][^][v][top][bottom][index][help] */