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

# olduname(2)

get name and information about current kernel

Part of [uname(2)](/uname/2.md).

## NAME

uname - get name and information about current kernel

## LIBRARY

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

## SYNOPSIS

```
#include <sys/utsname.h>
```

**int uname(struct utsname \****buf***);**

## DESCRIPTION

**uname**() returns system information in the structure pointed to by *buf*. The *utsname* struct is defined in *\<sys/utsname.h\>*:

```
struct utsname {
    char sysname[];    /* Operating system name (e.g., "Linux") */
    char nodename[];   /* Name within communications network
                          to which the node is attached, if any */
    char release[];    /* Operating system release
                          (e.g., "2.6.28") */
    char version[];    /* Operating system version */
    char machine[];    /* Hardware type identifier */
#ifdef _GNU_SOURCE
    char domainname[]; /* NIS or YP domain name */
#endif
};
```

The length of the arrays in a *struct utsname* is unspecified (see VERSIONS and HISTORY); the fields are terminated by a null byte ('\\0').

## RETURN VALUE

On success, zero is returned. On error, -1 is returned, and *errno* is set to indicate the error.

## ERRORS

- **EFAULT**

  *buf* is not valid.

## VERSIONS

The *domainname* member (the NIS or YP domain name) is a GNU extension.

The length of the fields in the struct varies. Some operating systems or libraries use a hardcoded 9 or 33 or 65 or 257. Other systems use **SYS\_NMLN** or **\_SYS\_NMLN** or **UTSLEN** or **\_UTSNAME\_LENGTH**. Clearly, it is a bad idea to use any of these constants; just use sizeof(...). SVr4 uses 257, "to support Internet hostnames" —this is the largest value likely to be encountered in the wild—.

## STANDARDS

POSIX.1-2024.

## HISTORY

POSIX.1-2001, SVr4, 4.4BSD.

### C library/kernel differences

Over time, increases in the size of the *utsname* structure have led to three successive versions of **uname**(): *sys\_olduname*() (slot *\_\_NR\_oldolduname*), *sys\_uname*() (slot *\_\_NR\_olduname*), and *sys\_newuname*() (slot *\_\_NR\_uname)*. The first one used length 9 for all fields; the second used 65; the third also uses 65 but adds the *domainname* field. The glibc **uname**() wrapper function hides these details from applications, invoking the most recent version of the system call provided by the kernel.

## NOTES

The kernel has the name, release, version, and supported machine type built in. Conversely, the *nodename* field is configured by the administrator to match the network (this is what the BSD historically calls the "hostname", and is set via [**sethostname**(2)](/sethostname/2.md)). Similarly, the *domainname* field is set via [**setdomainname**(2)](/setdomainname/2.md).

Part of the utsname information is also accessible via */proc/sys/kernel/*{*ostype*, *hostname*, *osrelease*, *version*, *domainname*}.

## SEE ALSO

[**uname**(1)](/uname/1.md), [**getdomainname**(2)](/getdomainname/2.md), [**gethostname**(2)](/gethostname/2.md), [**uts\_namespaces**(7)](/uts_namespaces/7.md)
