mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-11-04 11:45:06 +00:00 
			
		
		
		
	watchquagga is already leaking an open file descriptor on its pid file on fork+exec() invocations; next up is adding vtysh support with even more fds. Mark things CLOEXEC before going there. Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
		
			
				
	
	
		
			128 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Network library.
 | 
						|
 * Copyright (C) 1997 Kunihiro Ishiguro
 | 
						|
 *
 | 
						|
 * This file is part of GNU Zebra.
 | 
						|
 *
 | 
						|
 * GNU Zebra is free software; you can redistribute it and/or modify it
 | 
						|
 * under the terms of the GNU General Public License as published by the
 | 
						|
 * Free Software Foundation; either version 2, or (at your option) any
 | 
						|
 * later version.
 | 
						|
 *
 | 
						|
 * GNU Zebra is distributed in the hope that it will be useful, but
 | 
						|
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 * 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.  
 | 
						|
 */
 | 
						|
 | 
						|
#include <zebra.h>
 | 
						|
#include "log.h"
 | 
						|
#include "network.h"
 | 
						|
 | 
						|
/* Read nbytes from fd and store into ptr. */
 | 
						|
int
 | 
						|
readn (int fd, u_char *ptr, int nbytes)
 | 
						|
{
 | 
						|
  int nleft;
 | 
						|
  int nread;
 | 
						|
 | 
						|
  nleft = nbytes;
 | 
						|
 | 
						|
  while (nleft > 0) 
 | 
						|
    {
 | 
						|
      nread = read (fd, ptr, nleft);
 | 
						|
 | 
						|
      if (nread < 0) 
 | 
						|
	return (nread);
 | 
						|
      else
 | 
						|
	if (nread == 0) 
 | 
						|
	  break;
 | 
						|
 | 
						|
      nleft -= nread;
 | 
						|
      ptr += nread;
 | 
						|
    }
 | 
						|
 | 
						|
  return nbytes - nleft;
 | 
						|
}  
 | 
						|
 | 
						|
/* Write nbytes from ptr to fd. */
 | 
						|
int
 | 
						|
writen(int fd, const u_char *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
 | 
						|
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)
 | 
						|
    {
 | 
						|
      zlog_warn("fcntl(F_GETFL) failed for fd %d: %s",
 | 
						|
      		fd, safe_strerror(errno));
 | 
						|
      return -1;
 | 
						|
    }
 | 
						|
  if (fcntl(fd, F_SETFL, (flags | O_NONBLOCK)) < 0)
 | 
						|
    {
 | 
						|
      zlog_warn("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)
 | 
						|
{
 | 
						|
  u_int32_t lu1, lu2;
 | 
						|
  float convert;
 | 
						|
 | 
						|
  memcpy (&lu1, &host, sizeof (u_int32_t));
 | 
						|
  lu2 = htonl (lu1);
 | 
						|
  memcpy (&convert, &lu2, sizeof (u_int32_t));
 | 
						|
  return convert;
 | 
						|
}
 | 
						|
 | 
						|
float
 | 
						|
ntohf (float net)
 | 
						|
{
 | 
						|
  return htonf (net);
 | 
						|
}
 |