1/*
2 * Copyright 2004-2007, J��r��me Duval jerome.duval@free.fr. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <sys/utsname.h>
8
9#include <errno.h>
10#include <stdio.h>
11#include <string.h>
12#include <unistd.h>
13
14#include <OS.h>
15#include <ByteOrder.h>
16
17#include <errno_private.h>
18#include <system_revision.h>
19
20
21int
22uname(struct utsname *info)
23{
24	cpu_topology_node_info root;
25	system_info systemInfo;
26	const char *platform;
27	const char *haikuRevision;
28	uint32 count = 1;
29	status_t error;
30
31	if (!info) {
32		__set_errno(B_BAD_VALUE);
33		return -1;
34	}
35
36	get_system_info(&systemInfo);
37
38	strlcpy(info->sysname, "Haiku", sizeof(info->sysname));
39
40	haikuRevision = __get_haiku_revision();
41	if (haikuRevision[0] != '\0')
42		snprintf(info->version, sizeof(info->version), "%s ", haikuRevision);
43	else
44		info->version[0] = '\0';
45	strlcat(info->version, systemInfo.kernel_build_date, sizeof(info->version));
46	strlcat(info->version, " ", sizeof(info->version));
47	strlcat(info->version, systemInfo.kernel_build_time, sizeof(info->version));
48	snprintf(info->release, sizeof(info->release), "%" B_PRId64,
49		systemInfo.kernel_version);
50
51	error = get_cpu_topology_info(&root, &count);
52	if (error != B_OK || count < 1)
53		platform = "unknown";
54	else {
55		switch (root.data.root.platform) {
56			case B_CPU_x86:
57				platform = "BePC";
58				break;
59			case B_CPU_x86_64:
60				platform = "x86_64";
61				break;
62			case B_CPU_PPC:
63				platform = "ppc";
64				break;
65			case B_CPU_PPC_64:
66				platform = "ppc64";
67				break;
68			case B_CPU_M68K:
69				platform = "m68k";
70				break;
71			case B_CPU_ARM:
72				platform = "arm";
73				break;
74			case B_CPU_ARM_64:
75				platform = "aarch64";
76				break;
77			case B_CPU_RISC_V:
78				platform = "riscv64";
79				break;
80			case B_CPU_UNKNOWN:
81			default:
82				platform = "unknown";
83				break;
84		}
85	}
86
87	strlcpy(info->machine, platform, sizeof(info->machine));
88
89	if (gethostname(info->nodename, sizeof(info->nodename)) != 0)
90		strlcpy(info->nodename, "unknown", sizeof(info->nodename));
91
92	return 0;
93}
94
95