1*864f048cSclaudio /* $OpenBSD: if_nametoindex.c,v 1.10 2015/10/23 13:09:19 claudio Exp $ */
22fc8ca5aSmillert /* $KAME: if_nametoindex.c,v 1.5 2000/11/24 08:04:40 itojun Exp $ */
32fc8ca5aSmillert
42fc8ca5aSmillert /*-
5*864f048cSclaudio * Copyright (c) 2015 Claudio Jeker <claudio@openbsd.org>
62fc8ca5aSmillert * Copyright (c) 1997, 2000
72fc8ca5aSmillert * Berkeley Software Design, Inc. All rights reserved.
8bc4c5135Scmetz *
9bc4c5135Scmetz * Redistribution and use in source and binary forms, with or without
10bc4c5135Scmetz * modification, are permitted provided that the following conditions
11bc4c5135Scmetz * are met:
12bc4c5135Scmetz * 1. Redistributions of source code must retain the above copyright
13bc4c5135Scmetz * notice, this list of conditions and the following disclaimer.
14bc4c5135Scmetz *
152fc8ca5aSmillert * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND
16bc4c5135Scmetz * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17bc4c5135Scmetz * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
182fc8ca5aSmillert * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE
19bc4c5135Scmetz * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20bc4c5135Scmetz * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21bc4c5135Scmetz * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22bc4c5135Scmetz * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23bc4c5135Scmetz * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24bc4c5135Scmetz * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25bc4c5135Scmetz * SUCH DAMAGE.
262fc8ca5aSmillert *
272fc8ca5aSmillert * BSDI Id: if_nametoindex.c,v 2.3 2000/04/17 22:38:05 dab Exp
28bc4c5135Scmetz */
29bc4c5135Scmetz
30bc4c5135Scmetz #include <sys/types.h>
31bc4c5135Scmetz #include <sys/socket.h>
32bc4c5135Scmetz #include <net/if.h>
332fc8ca5aSmillert #include <stdlib.h>
34b2c288efSderaadt #include <string.h>
35bc4c5135Scmetz #include <errno.h>
36bc4c5135Scmetz
3771794f70Sderaadt /*
382fc8ca5aSmillert * From RFC 2553:
392fc8ca5aSmillert *
402fc8ca5aSmillert * 4.1 Name-to-Index
412fc8ca5aSmillert *
422fc8ca5aSmillert *
432fc8ca5aSmillert * The first function maps an interface name into its corresponding
442fc8ca5aSmillert * index.
452fc8ca5aSmillert *
462fc8ca5aSmillert * #include <net/if.h>
472fc8ca5aSmillert *
482fc8ca5aSmillert * unsigned int if_nametoindex(const char *ifname);
492fc8ca5aSmillert *
502fc8ca5aSmillert * If the specified interface name does not exist, the return value is
512fc8ca5aSmillert * 0, and errno is set to ENXIO. If there was a system error (such as
522fc8ca5aSmillert * running out of memory), the return value is 0 and errno is set to the
532fc8ca5aSmillert * proper value (e.g., ENOMEM).
5471794f70Sderaadt */
552fc8ca5aSmillert
562fc8ca5aSmillert unsigned int
if_nametoindex(const char * ifname)572fc8ca5aSmillert if_nametoindex(const char *ifname)
582fc8ca5aSmillert {
59*864f048cSclaudio struct if_nameindex *ifni, *ifni2;
60*864f048cSclaudio unsigned int index;
612fc8ca5aSmillert
62*864f048cSclaudio if ((ifni = if_nameindex()) == NULL)
632fc8ca5aSmillert return(0);
642fc8ca5aSmillert
65*864f048cSclaudio for (ifni2 = ifni; ifni2->if_index != 0; ifni2++) {
66*864f048cSclaudio if (strcmp(ifni2->if_name, ifname) == 0) {
67*864f048cSclaudio index = ifni2->if_index;
68*864f048cSclaudio if_freenameindex(ifni);
69*864f048cSclaudio return index;
7071794f70Sderaadt }
7171794f70Sderaadt }
72bc4c5135Scmetz
73*864f048cSclaudio if_freenameindex(ifni);
742fc8ca5aSmillert errno = ENXIO;
75*864f048cSclaudio return 0;
76b2c288efSderaadt }
77fbd37677Sguenther DEF_WEAK(if_nametoindex);
78