]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/network.c
zebra, lib: fix the ZEBRA_INTERFACE_VRF_UPDATE zapi message
[mirror_frr.git] / lib / network.c
index 3b296720df22f59c76cf824cf659b6cd16f71931..411661a5e1bca1764803289f0edad2f373794acf 100644 (file)
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
- * along with GNU Zebra; see the file COPYING.  If not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.  
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <zebra.h>
 #include "log.h"
 #include "network.h"
+#include "lib_errors.h"
 
 /* Read nbytes from fd and store into ptr. */
-int
-readn (int fd, u_char *ptr, int nbytes)
+int readn(int fd, uint8_t *ptr, int nbytes)
 {
-  int nleft;
-  int nread;
+       int nleft;
+       int nread;
 
-  nleft = nbytes;
+       nleft = nbytes;
 
-  while (nleft > 0) 
-    {
-      nread = read (fd, ptr, nleft);
+       while (nleft > 0) {
+               nread = read(fd, ptr, nleft);
 
-      if (nread < 0) 
-       return (nread);
-      else
-       if (nread == 0) 
-         break;
+               if (nread < 0)
+                       return (nread);
+               else if (nread == 0)
+                       break;
 
-      nleft -= nread;
-      ptr += nread;
-    }
+               nleft -= nread;
+               ptr += nread;
+       }
 
-  return nbytes - nleft;
-}  
+       return nbytes - nleft;
+}
 
 /* Write nbytes from ptr to fd. */
-int
-writen(int fd, const u_char *ptr, int nbytes)
+int writen(int fd, const uint8_t *ptr, int nbytes)
 {
-  int nleft;
-  int nwritten;
-
-  nleft = nbytes;
-
-  while (nleft > 0) 
-    {
-      nwritten = write(fd, ptr, nleft);
-      
-      if (nwritten <= 0) 
-       return (nwritten);
-
-      nleft -= nwritten;
-      ptr += nwritten;
-    }
-  return nbytes - nleft;
+       int nleft;
+       int nwritten;
+
+       nleft = nbytes;
+
+       while (nleft > 0) {
+               nwritten = write(fd, ptr, nleft);
+
+               if (nwritten < 0) {
+                       if (!ERRNO_IO_RETRY(errno))
+                               return nwritten;
+               }
+               if (nwritten == 0)
+                       return (nwritten);
+
+               nleft -= nwritten;
+               ptr += nwritten;
+       }
+       return nbytes - nleft;
+}
+
+int set_nonblocking(int fd)
+{
+       int flags;
+
+       /* According to the Single UNIX Spec, the return value for F_GETFL
+          should
+          never be negative. */
+       if ((flags = fcntl(fd, F_GETFL)) < 0) {
+               flog_err(EC_LIB_SYSTEM_CALL,
+                        "fcntl(F_GETFL) failed for fd %d: %s", fd,
+                        safe_strerror(errno));
+               return -1;
+       }
+       if (fcntl(fd, F_SETFL, (flags | O_NONBLOCK)) < 0) {
+               flog_err(EC_LIB_SYSTEM_CALL,
+                        "fcntl failed setting fd %d non-blocking: %s", fd,
+                        safe_strerror(errno));
+               return -1;
+       }
+       return 0;
+}
+
+int set_cloexec(int fd)
+{
+       int flags;
+       flags = fcntl(fd, F_GETFD, 0);
+       if (flags == -1)
+               return -1;
+
+       flags |= FD_CLOEXEC;
+       if (fcntl(fd, F_SETFD, flags) == -1)
+               return -1;
+       return 0;
+}
+
+float htonf(float host)
+{
+       uint32_t lu1, lu2;
+       float convert;
+
+       memcpy(&lu1, &host, sizeof(uint32_t));
+       lu2 = htonl(lu1);
+       memcpy(&convert, &lu2, sizeof(uint32_t));
+       return convert;
 }
 
-int
-set_nonblocking(int fd)
+float ntohf(float net)
 {
-  if (fcntl(fd, F_SETFL, (fcntl(fd, F_GETFL) | O_NONBLOCK)) < 0)
-    {
-      zlog_warn("fcntl failed setting fd %d non-blocking: %s",
-               fd, safe_strerror(errno));
-      return -1;
-    }
-  return 0;
+       return htonf(net);
 }