---
name: "if_nameindex"
section: "3"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd"]
url: "https://new.carta.tech/if_nameindex"
---

# if\_nameindex(3)

get network interface names and indexes

## NAME

if\_nameindex, if\_freenameindex - get network interface names and indexes

## LIBRARY

Standard C library (*libc*, *-lc*)

## SYNOPSIS

```
#include <net/if.h>
```

**struct if\_nameindex \*if\_nameindex(***void***);** **void if\_freenameindex(struct if\_nameindex \****ptr***);**

## DESCRIPTION

The **if\_nameindex**() function returns an array of *if\_nameindex* structures, each containing information about one of the network interfaces on the local system. The *if\_nameindex* structure contains at least the following entries:

```
unsigned int if_index;  /* Index of interface (1, 2, ...) */
char        *if_name;   /* Null-terminated name ("eth0", etc.) */
```

The *if\_index* field contains the interface index. The *if\_name* field points to the null-terminated interface name. The end of the array is indicated by entry with *if\_index* set to zero and *if\_name* set to NULL.

The data structure returned by **if\_nameindex**() is dynamically allocated and should be freed using **if\_freenameindex**() when no longer needed.

## RETURN VALUE

On success, **if\_nameindex**() returns pointer to the array; on error, NULL is returned, and *errno* is set to indicate the error.

## ERRORS

**if\_nameindex**() may fail and set *errno* if:

- **ENOBUFS**

  Insufficient resources available.

**if\_nameindex**() may also fail for any of the errors specified for [**socket**(2)](/socket/2.md), [**bind**(2)](/bind/2.md), [**ioctl**(2)](/ioctl/2.md), [**getsockname**(2)](/getsockname/2.md), [**recvmsg**(2)](/recvmsg/2.md), [**sendto**(2)](/sendto/2.md), or [**malloc**(3)](/malloc/3.md).

## ATTRIBUTES

For an explanation of the terms used in this section, see [**attributes**(7)](/attributes/7.md).

| | | |
| --- | --- | --- |
| **Interface** | **Attribute** | **Value** |
| **if\_nameindex**(), **if\_freenameindex**() | Thread safety | MT-Safe |

## STANDARDS

POSIX.1-2008, RFC 3493.

## HISTORY

glibc 2.1. POSIX.1-2001. BSDi.

Before glibc 2.3.4, the implementation supported only interfaces with IPv4 addresses. Support of interfaces that don't have IPv4 addresses is available only on kernels that support netlink.

## EXAMPLES

The program below demonstrates the use of the functions described on this page. An example of the output this program might produce is the following:

```
$ ./a.out;
1: lo
2: wlan0
3: em1
```

### Program source

```
#include <net/if.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(void)
{
    struct if_nameindex *if_ni, *i;
    if_ni = if_nameindex();
    if (if_ni == NULL) {
        perror("if_nameindex");
        exit(EXIT_FAILURE);
    }
    for (i = if_ni; !(i->if_index == 0 && i->if_name == NULL); i++)
        printf("%u: %s\n", i->if_index, i->if_name);
    if_freenameindex(if_ni);
    exit(EXIT_SUCCESS);
}
```

## SEE ALSO

[**getsockopt**(2)](/getsockopt/2.md), [**setsockopt**(2)](/setsockopt/2.md), [**getifaddrs**(3)](/getifaddrs/3.md), [**if\_indextoname**(3)](/if_indextoname/3.md), [**if\_nametoindex**(3)](/if_nametoindex/3.md), [**ifconfig**(8)](/ifconfig/8.md)
