| .\" Copyright (C) 2001 Andries Brouwer <aeb@cwi.nl>. |
| .\" |
| .\" %%%LICENSE_START(VERBATIM) |
| .\" Permission is granted to make and distribute verbatim copies of this |
| .\" manual provided the copyright notice and this permission notice are |
| .\" preserved on all copies. |
| .\" |
| .\" Permission is granted to copy and distribute modified versions of this |
| .\" manual under the conditions for verbatim copying, provided that the |
| .\" entire resulting derived work is distributed under the terms of a |
| .\" permission notice identical to this one. |
| .\" |
| .\" Since the Linux kernel and libraries are constantly changing, this |
| .\" manual page may be incorrect or out-of-date. The author(s) assume no |
| .\" responsibility for errors or omissions, or for damages resulting from |
| .\" the use of the information contained herein. The author(s) may not |
| .\" have taken the same level of care in the production of this manual, |
| .\" which is licensed free of charge, as they might when working |
| .\" professionally. |
| .\" |
| .\" Formatted or processed versions of this manual, if unaccompanied by |
| .\" the source, must acknowledge the copyright and authors of this work. |
| .\" %%%LICENSE_END |
| .\" |
| .\" 2007-07-05 mtk: Added details on underlying system call interfaces |
| .\" |
| .TH UNAME 2 2017-09-15 "Linux" "Linux Programmer's Manual" |
| .SH NAME |
| uname \- get name and information about current kernel |
| .SH SYNOPSIS |
| .B #include <sys/utsname.h> |
| .PP |
| .BI "int uname(struct utsname *" buf ); |
| .SH DESCRIPTION |
| .BR uname () |
| returns system information in the structure pointed to by |
| .IR buf . |
| The |
| .I utsname |
| struct is defined in |
| .IR <sys/utsname.h> : |
| .PP |
| .in +4n |
| .EX |
| struct utsname { |
| char sysname[]; /* Operating system name (e.g., "Linux") */ |
| char nodename[]; /* Name within "some implementation-defined |
| network" */ |
| char release[]; /* Operating system release (e.g., "2.6.28") */ |
| char version[]; /* Operating system version */ |
| char machine[]; /* Hardware identifier */ |
| #ifdef _GNU_SOURCE |
| char domainname[]; /* NIS or YP domain name */ |
| #endif |
| }; |
| .EE |
| .in |
| .PP |
| The length of the arrays in a |
| .I struct utsname |
| is unspecified (see NOTES); |
| the fields are terminated by a null byte (\(aq\\0\(aq). |
| .SH RETURN VALUE |
| On success, zero is returned. |
| On error, \-1 is returned, and |
| .I errno |
| is set appropriately. |
| .SH ERRORS |
| .TP |
| .B EFAULT |
| .I buf |
| is not valid. |
| .SH CONFORMING TO |
| POSIX.1-2001, POSIX.1-2008, SVr4. |
| There is no |
| .BR uname () |
| call in 4.3BSD. |
| .PP |
| The |
| .I domainname |
| member (the NIS or YP domain name) is a GNU extension. |
| .SH NOTES |
| This is a system call, and the operating system presumably knows |
| its name, release and version. |
| It also knows what hardware it runs on. |
| So, four of the fields of the struct are meaningful. |
| On the other hand, the field |
| .I nodename |
| is meaningless: |
| it gives the name of the present machine in some undefined |
| network, but typically machines are in more than one network |
| and have several names. |
| Moreover, the kernel has no way of knowing |
| about such things, so it has to be told what to answer here. |
| The same holds for the additional |
| .I domainname |
| field. |
| .PP |
| To this end, Linux uses the system calls |
| .BR sethostname (2) |
| and |
| .BR setdomainname (2). |
| Note that there is no standard that says that the hostname set by |
| .BR sethostname (2) |
| is the same string as the |
| .I nodename |
| field of the struct returned by |
| .BR uname () |
| (indeed, some systems allow a 256-byte hostname and an 8-byte nodename), |
| but this is true on Linux. |
| The same holds for |
| .BR setdomainname (2) |
| and the |
| .I domainname |
| field. |
| .PP |
| 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 |
| .B SYS_NMLN |
| or |
| .B _SYS_NMLN |
| or |
| .B UTSLEN |
| or |
| .BR _UTSNAME_LENGTH . |
| Clearly, it is a bad |
| idea to use any of these constants; just use sizeof(...). |
| Often 257 is chosen in order to have room for an internet hostname. |
| .PP |
| Part of the utsname information is also accessible via |
| .IR /proc/sys/kernel/ { ostype , |
| .IR hostname , |
| .IR osrelease , |
| .IR version , |
| .IR domainname }. |
| .SS C library/kernel differences |
| .PP |
| Over time, increases in the size of the |
| .I utsname |
| structure have led to three successive versions of |
| .BR uname (): |
| .IR sys_olduname () |
| (slot |
| .IR __NR_oldolduname ), |
| .IR sys_uname () |
| (slot |
| .IR __NR_olduname ), |
| and |
| .IR sys_newuname () |
| (slot |
| .IR __NR_uname) . |
| The first one |
| .\" That was back before Linux 1.0 |
| used length 9 for all fields; |
| the second |
| .\" That was also back before Linux 1.0 |
| used 65; |
| the third also uses 65 but adds the |
| .I domainname |
| field. |
| The glibc |
| .BR uname () |
| wrapper function hides these details from applications, |
| invoking the most recent version of the system call provided by the kernel. |
| .SH SEE ALSO |
| .BR uname (1), |
| .BR getdomainname (2), |
| .BR gethostname (2), |
| .BR namespaces (7) |