master runame.c
ohmu  ·  2026-10-08
  1/* runame - random uname for your os */
  2
  3/*
  4 * TODO: match os name to latest release version
  5 */
  6
  7#include <stdio.h>
  8#include <stdlib.h>
  9#include <unistd.h>
 10#include <sys/time.h>
 11
 12const char *osnames[] = {
 13	"OpenBSD",
 14	"FreeBSD",
 15	"DragonFly",
 16	"NetBSD",
 17	"SunOS",
 18	"Minix",
 19	"Darwin",
 20	"AIX",
 21	"HP-UX",
 22	"IRIX64",
 23	"OSF1",
 24	"UnixWare",
 25	"QNX",
 26	"Haiku"
 27};
 28
 29const char *arches[] = {
 30	"amd64",
 31	"arm64",
 32	"aarch64",
 33	"i386",
 34	"x86_64",
 35	"sparc",
 36	"sparc64",
 37	"powerpc",
 38	"powerpc64",
 39	"mips64",
 40	"alpha",
 41	"arm",
 42	"armv7",
 43	"riscv64",
 44	"hppa",
 45	"ia64",
 46	"unknown"
 47};
 48
 49const char *releases[] = {
 50	"7.9",
 51	"14.1-RELEASE-p3",
 52	"10.0",
 53	"6.4-RELEASE",
 54	"5.11",
 55	"5.10",
 56	"24.0.0",
 57	"3",
 58	"B.11.31",
 59	"6.5",
 60	"V5.1",
 61	"5",
 62	"7.1.0",
 63	"1",
 64	"3.4.0"
 65};
 66
 67const char *versions[] = {
 68	"GENERIC.MP#1",
 69	"GENERIC#0",
 70	"FreeBSD 14.1-RELEASE-p3 GENERIC",
 71	"NetBSD 10.0 (GENERIC)",
 72	"11.4.42.111.0",
 73	"illumos-a1b2c3d4e5",
 74	"Darwin Kernel Version 24.0.0: Tue Sep 24 23:39:07 PDT 2024; root:xnu-11215.1.12~1/RELEASE_ARM64_T6000",
 75	"7",
 76	"U",
 77	"07202013",
 78	"2650",
 79	"7.1.4",
 80	"hrev57937"
 81};
 82
 83const char *names[] = {
 84	"openbsd.my.domain",
 85	"Amnesiac",
 86	"solaris",
 87	"openindiana",
 88	"omnios",
 89	"minix",
 90	"localhost",
 91	"Mac.local",
 92	"MacBook-Pro.local",
 93	"IRIS",
 94	"shredder"
 95};
 96
 97int
 98randomvalue(const char *arr[], int len)
 99{
100    int n;
101    struct timeval tv;
102    gettimeofday(&tv, NULL);
103    srand(tv.tv_sec ^ tv.tv_usec);
104    n = rand() % len;
105    
106    return n;
107}
108
109void 
110osname(void)
111{
112	int size;
113	
114	size = sizeof(osnames) / sizeof(osnames[0]);
115	
116    printf("%s ", osnames[randomvalue(osnames, size)]);
117}
118
119void
120arch(void)
121{
122	int size;
123	
124	size = sizeof(arches) / sizeof(arches[0]);
125	
126	printf("%s ", arches[randomvalue(arches, size)]);
127}
128
129void
130release(void)
131{
132	int size;
133	
134	size = sizeof(releases) / sizeof(releases[0]);
135	
136	printf("%s ", releases[randomvalue(releases, size)]);
137}
138
139void
140version(void)
141{
142	int size;
143	
144	size = sizeof(versions) / sizeof(versions[0]);
145	
146	printf("%s ", versions[randomvalue(versions, size)]);
147}
148
149void
150name(void)
151{
152	int size;
153	
154	size = sizeof(names) / sizeof(names[0]);
155	
156	printf("%s ", names[randomvalue(names, size)]);
157}
158
159int
160main(int argc, char *argv[])
161{
162	int opt;
163	if(argc == 1)
164		osname();
165	
166	while((opt = getopt(argc, argv, "amnprsv")) != -1){
167		switch(opt){
168			case 'm':
169				arch();
170				break;
171			case 'p':
172				arch();
173				break;
174			case 's':
175				osname();
176				break;
177			case 'r':
178				release();
179				break;
180			case 'v':
181				version();
182				break;
183			case 'n':
184				name();
185				break;
186			case 'a':
187				osname();
188				name();
189				release();
190				version();
191				arch();
192				break;
193			default:
194				printf("usage: uname [-amnprsv]\n");
195				return 1;
196		}
197	}
198	
199	printf("\n");
200		
201	return 0;
202}