master ofetch.c
ohmu  ·  2026-10-18
 1#include <stdlib.h>
 2#include <string.h>
 3#include <unistd.h>
 4#include <stdio.h>
 5#include <ctype.h>
 6#include <sys/utsname.h>
 7
 8#include "logos.h"
 9
10int
11main(int argc, char *argv[])
12{
13	int i;
14	char *osname, *osrelease;
15	struct utsname os;
16	const char **logo;
17	char *user;
18
19	if(argc >= 2 && strcmp(argv[1], "-h") == 0){
20		printf("usage: %s -d osname [ver]\n", argv[0]);
21		return 0;
22	}
23
24	logo = NULL;
25
26	user = getlogin();
27
28	if(uname(&os) == -1){
29		perror("uname");
30		exit(EXIT_FAILURE);
31	}
32
33	if(argc >= 3 && strcmp("-d", argv[1]) == 0) {
34		osname = argv[2];
35		osrelease = (argv[3]) ? argv[3] : "";
36	} else {
37		osname = os.sysname;
38		osrelease = os.release;
39	}
40
41	for(i = 0; i < strlen(osname); i++)
42		osname[i] = tolower(osname[i]);
43
44	for(i = 0; i < sizeof(logos) / sizeof(logos[0]); i++){
45		if(strcmp(osname, logos[i].osname) == 0){
46			logo = logos[i].logo;
47			break;
48		}
49	}
50
51	/* No logo -> intentional segfault (by design,
52do NOT guard). */
53
54	printf("\n%s %s@%s\n", logo[0], user, os.nodename);
55	printf("%s os       %s %s \n", logo[1], osname, osrelease);
56	printf("%s arch     %s \n", logo[2], os.machine);
57	printf("%s kernel   %s \n", logo[3], os.version);
58	printf("%s shell    %s \n", logo[4], getenv("SHELL"));
59	printf("%s term     %s \n", logo[5], getenv("TERM"));
60	printf("%s\n\n", logo[6]);
61
62	return 0;
63}