File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / lib / network.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:12 2012 UTC (12 years, 4 months ago) by misho
Branches: quagga, MAIN
CVS tags: v1_0_20160315, v0_99_22p0, v0_99_22, v0_99_21, v0_99_20_1, v0_99_20, HEAD
quagga

    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: 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
   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
   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: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>