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}