1 /*
2  * Network library.
3  * Copyright (C) 1997 Kunihiro Ishiguro
4  *
5  * This file is part of GNU Zebra.
6  *
7  * GNU Zebra is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by the
9  * Free Software Foundation; either version 2, or (at your option) any
10  * later version.
11  *
12  * GNU Zebra is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
19  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20  * 02111-1307, USA.
21  */
22 
23 #include <zebra.h>
24 #include "log.h"
25 #include "network.h"
26 
27 /* Read nbytes from fd and store into ptr. */
28 int
readn(int fd,u_char * ptr,int nbytes)29 readn (int fd, u_char *ptr, int nbytes)
30 {
31   int nleft;
32   int nread;
33 
34   nleft = nbytes;
35 
36   while (nleft > 0)
37     {
38       nread = read (fd, ptr, nleft);
39 
40       if (nread < 0)
41 	return (nread);
42       else
43 	if (nread == 0)
44 	  break;
45 
46       nleft -= nread;
47       ptr += nread;
48     }
49 
50   return nbytes - nleft;
51 }
52 
53 /* Write nbytes from ptr to fd. */
54 int
writen(int fd,const u_char * ptr,int nbytes)55 writen(int fd, const u_char *ptr, int nbytes)
56 {
57   int nleft;
58   int nwritten;
59 
60   nleft = nbytes;
61 
62   while (nleft > 0)
63     {
64       nwritten = write(fd, ptr, nleft);
65 
66       if (nwritten <= 0)
67 	return (nwritten);
68 
69       nleft -= nwritten;
70       ptr += nwritten;
71     }
72   return nbytes - nleft;
73 }
74 
75 int
set_nonblocking(int fd)76 set_nonblocking(int fd)
77 {
78   int flags;
79 
80   /* According to the Single UNIX Spec, the return value for F_GETFL should
81      never be negative. */
82   if ((flags = fcntl(fd, F_GETFL)) < 0)
83     {
84       zlog_warn("fcntl(F_GETFL) failed for fd %d: %s",
85       		fd, safe_strerror(errno));
86       return -1;
87     }
88   if (fcntl(fd, F_SETFL, (flags | O_NONBLOCK)) < 0)
89     {
90       zlog_warn("fcntl failed setting fd %d non-blocking: %s",
91       		fd, safe_strerror(errno));
92       return -1;
93     }
94   return 0;
95 }
96 
97 float
htonf(float host)98 htonf (float host)
99 {
100 #if !defined(__STDC_IEC_559__) && __GCC_IEC_559 < 0
101 #warning "Unknown floating-point format on platform, htonf may break"
102 #endif
103   u_int32_t lu1, lu2;
104   float convert;
105 
106   memcpy (&lu1, &host, sizeof (u_int32_t));
107   lu2 = htonl (lu1);
108   memcpy (&convert, &lu2, sizeof (u_int32_t));
109   return convert;
110 }
111 
112 float
ntohf(float net)113 ntohf (float net)
114 {
115   return htonf (net);
116 }
117