Line data Source code
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
29 0 : readn (int fd, u_char *ptr, int nbytes)
30 : {
31 : int nleft;
32 : int nread;
33 :
34 0 : nleft = nbytes;
35 :
36 0 : while (nleft > 0)
37 : {
38 0 : nread = read (fd, ptr, nleft);
39 :
40 0 : if (nread < 0)
41 0 : return (nread);
42 : else
43 0 : if (nread == 0)
44 0 : break;
45 :
46 0 : nleft -= nread;
47 0 : ptr += nread;
48 : }
49 :
50 0 : return nbytes - nleft;
51 : }
52 :
53 : /* Write nbytes from ptr to fd. */
54 : int
55 0 : writen(int fd, const u_char *ptr, int nbytes)
56 : {
57 : int nleft;
58 : int nwritten;
59 :
60 0 : nleft = nbytes;
61 :
62 0 : while (nleft > 0)
63 : {
64 0 : nwritten = write(fd, ptr, nleft);
65 :
66 0 : if (nwritten <= 0)
67 0 : return (nwritten);
68 :
69 0 : nleft -= nwritten;
70 0 : ptr += nwritten;
71 : }
72 0 : return nbytes - nleft;
73 : }
74 :
75 : int
76 97 : 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 97 : if ((flags = fcntl(fd, F_GETFL)) < 0)
83 : {
84 0 : zlog_warn("fcntl(F_GETFL) failed for fd %d: %s",
85 0 : fd, safe_strerror(errno));
86 0 : return -1;
87 : }
88 97 : if (fcntl(fd, F_SETFL, (flags | O_NONBLOCK)) < 0)
89 : {
90 0 : zlog_warn("fcntl failed setting fd %d non-blocking: %s",
91 0 : fd, safe_strerror(errno));
92 0 : return -1;
93 : }
94 97 : return 0;
95 : }
|