net_rt_iflist.c 1.92 KB
Newer Older
Leigh Stoller's avatar
Leigh Stoller committed
1 2
/*
 * Copyright (c) 2000-2002 University of Utah and the Flux Group.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 * 
 * {{{EMULAB-LICENSE
 * 
 * This file is part of the Emulab network testbed software.
 * 
 * This file is free software: you can redistribute it and/or modify it
 * under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or (at
 * your option) any later version.
 * 
 * This file 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 Affero General Public
 * License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this file.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * }}}
Leigh Stoller's avatar
Leigh Stoller committed
22 23
 */

Kristin Wright's avatar
Kristin Wright committed
24 25 26 27 28 29 30
/* 
 * This is a very slightly modified version of
 * example code from Unix Netwok Programming, edition 2.
 */

#include "discvr.h"

31 32 33
//


Kristin Wright's avatar
Kristin Wright committed
34 35 36 37 38 39
char *
net_rt_iflist(int family, int flags, size_t *lenp)
{
	int		mib[6];
	char	*buf;

40 41 42 43 44 45 46 47 48 49 50
	// Meaning of each parameter is explained below -ik
	mib[0] = CTL_NET; 		// network related system information
	mib[1] = PF_ROUTE;		// get the routing messages
	mib[2] = 0;				// protocol number (always zero!)
	mib[3] = family;		// get addresses of only this family 
	mib[4] = NET_RT_IFLIST; // return "interface" list
	mib[5] = flags;			/* interface index, or 0*/ // "man" says NONE?!

	// Call "sysctl" to get the length of buffer needed for storing the list
	// of interfaces. The "oldp" parameter is supplied with NULL to get just
	// the size. -ik
Kristin Wright's avatar
Kristin Wright committed
51 52 53
	if (sysctl(mib, 6, NULL, lenp, NULL, 0) < 0)
		return(NULL);

54
	// Allocate a buffer to store the list of interfaces. -ik
Kristin Wright's avatar
Kristin Wright committed
55 56
	if ( (buf = malloc(*lenp)) == NULL)
		return(NULL);
57 58

	// Get the list of interfaces in the "buf". -ik
Kristin Wright's avatar
Kristin Wright committed
59 60 61
	if (sysctl(mib, 6, buf, lenp, NULL, 0) < 0)
		return(NULL);

62
	// Return the list of interfaces. -ik
Kristin Wright's avatar
Kristin Wright committed
63 64 65 66
	return(buf);
}