Add macOS support

This commit is contained in:
sech1p 2021-04-15 22:59:43 +02:00
parent c2c0fb397a
commit 0218e64e02
2 changed files with 103 additions and 6 deletions

View file

@ -10,7 +10,7 @@ Nyalpine, Nyarch Linuwu, Nyartix Linuwu, Debinyan, Fedowa, GentOwO, GnUwU gUwUix
#### Partial support (Either no Ascii art, or no image is provided) #### Partial support (Either no Ascii art, or no image is provided)
endeavOwO, KDE NeOwOn, nixOwOs, Swackwawe, sOwOlus; Plus FweeBSD, and OwOpenBSD endeavOwO, KDE NeOwOn, nixOwOs, Swackwawe, sOwOlus; Plus FweeBSD, OwOpenBSD and macOwOS
## Building and installation ## Building and installation

View file

@ -19,7 +19,12 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <getopt.h> #include <getopt.h>
#ifdef __APPLE__
#include <sys/sysctl.h>
#include <time.h>
#else
#include <sys/sysinfo.h> #include <sys/sysinfo.h>
#endif
#include <sys/utsname.h> #include <sys/utsname.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
@ -36,6 +41,22 @@
#define WHITE "\x1b[37m" #define WHITE "\x1b[37m"
#define PINK "\x1b[38;5;201m" #define PINK "\x1b[38;5;201m"
#define LPINK "\x1b[38;5;213m" #define LPINK "\x1b[38;5;213m"
#ifdef __APPLE__
// buffers where data fetched from sysctl are stored
// CPU
#define CPUBUFFERLEN 128
char cpu_buffer[CPUBUFFERLEN];
size_t cpu_buffer_len = CPUBUFFERLEN;
// Installed RAM
int64_t mem_buffer = 0;
size_t mem_buffer_len = sizeof(mem_buffer);
// uptime
struct timeval time_buffer;
size_t time_buffer_len = sizeof(time_buffer);
#endif
struct package_manager struct package_manager
{ {
@ -43,7 +64,9 @@ struct package_manager
char pkgman_name[16]; // name of the package manager char pkgman_name[16]; // name of the package manager
}; };
struct utsname sys_var; struct utsname sys_var;
#ifndef __APPLE__
struct sysinfo sys; struct sysinfo sys;
#endif
struct winsize win; struct winsize win;
int ram_total, ram_used = 0; int ram_total, ram_used = 0;
// initialise the variables to store data, gpu array can hold up to 8 gpus // initialise the variables to store data, gpu array can hold up to 8 gpus
@ -179,12 +202,14 @@ int pkgman()
struct package_manager pkgmans[] = { struct package_manager pkgmans[] = {
{"apt list --installed 2> /dev/null | wc -l", "(apt)"}, {"apt list --installed 2> /dev/null | wc -l", "(apt)"},
{"apk info 2> /dev/null | wc -l", "(apk)"}, {"apk info 2> /dev/null | wc -l", "(apk)"},
{"brew list --formulae 2> /dev/null | wc -l", "(brew)"},
{"dnf list installed 2> /dev/null | wc -l", "(dnf)"}, {"dnf list installed 2> /dev/null | wc -l", "(dnf)"},
{"qlist -I 2> /dev/null | wc -l", "(emerge)"}, {"qlist -I 2> /dev/null | wc -l", "(emerge)"},
{"flatpak list 2> /dev/null | wc -l", "(flatpack)"}, {"flatpak list 2> /dev/null | wc -l", "(flatpack)"},
{"guix package --list-installed 2> /dev/null | wc -l", "(guix)"}, {"guix package --list-installed 2> /dev/null | wc -l", "(guix)"},
{"nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "(nix)"}, {"nix-store -q --requisites /run/current-sys_vartem/sw 2> /dev/null | wc -l", "(nix)"},
{"pacman -Qq 2> /dev/null | wc -l", "(pacman)"}, {"pacman -Qq 2> /dev/null | wc -l", "(pacman)"},
{"port installed 2> /dev/null | tail -n +2 | wc -l", "(port)"},
{"rpm -qa --last 2> /dev/null | wc -l", "(rpm)"}, {"rpm -qa --last 2> /dev/null | wc -l", "(rpm)"},
{"xbps-query -l 2> /dev/null | wc -l", "(xbps)"}, {"xbps-query -l 2> /dev/null | wc -l", "(xbps)"},
{"zypper se --installed-only 2> /dev/null | wc -l", "(zypper)"}}; {"zypper se --installed-only 2> /dev/null | wc -l", "(zypper)"}};
@ -209,6 +234,19 @@ int pkgman()
return total; return total;
} }
#ifdef __APPLE__
int uptime_mac()
{
int mib[2] = { CTL_KERN, KERN_BOOTTIME };
sysctl(mib, 2, &time_buffer, &time_buffer_len, NULL, 0);
time_t bsec = time_buffer.tv_sec;
time_t csec = time(NULL);
return difftime(csec, bsec);
}
#endif
void print_info() void print_info()
{ {
// store sys info in the sys again // store sys info in the sys again
@ -246,8 +284,13 @@ void print_info()
printf("\033[18C%s%sPKGS %s%s%d %s\n", printf("\033[18C%s%sPKGS %s%s%d %s\n",
NORMAL, BOLD, NORMAL, NORMAL, pkgs, pkgman_name); NORMAL, BOLD, NORMAL, NORMAL, pkgs, pkgman_name);
if (show_uptime) if (show_uptime)
#ifndef __APPLE__
printf("\033[18C%s%sUWUPTIME %s" /*"%lid, "*/ "%lih, %lim\n", printf("\033[18C%s%sUWUPTIME %s" /*"%lid, "*/ "%lih, %lim\n",
NORMAL, BOLD, NORMAL, /*sys.uptime/60/60/24,*/ sys.uptime / 60 / 60, sys.uptime / 60 % 60); NORMAL, BOLD, NORMAL, /*sys.uptime/60/60/24,*/ sys.uptime / 60 / 60, sys.uptime / 60 % 60);
#else
printf("\033[18C%s%sUWUPTIME %s" "%ih, %im\n",
NORMAL, BOLD, NORMAL, (uptime_mac() / 3600), ((uptime_mac() - (3600 * (uptime_mac() / 3600))) / 60));
#endif
if (show_colors) if (show_colors)
printf("\033[18C%s%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\n", printf("\033[18C%s%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\u2587\u2587%s\n",
BOLD, BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, NORMAL); BOLD, BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, NORMAL);
@ -276,9 +319,10 @@ void get_info()
fclose(os_release); fclose(os_release);
} }
else else
{ // try for android vars, or unknown system { // try for android vars, next for macOS var, or unknown system
DIR *system_app = opendir("/system/app/"); DIR *system_app = opendir("/system/app/");
DIR *system_priv_app = opendir("/system/priv-app/"); DIR *system_priv_app = opendir("/system/priv-app/");
DIR *library = opendir("/Library/");
if (system_app && system_priv_app) if (system_app && system_priv_app)
{ // android { // android
closedir(system_app); closedir(system_app);
@ -292,6 +336,14 @@ void get_info()
while (fgets(line, sizeof(line), cpuinfo)) while (fgets(line, sizeof(line), cpuinfo))
if (sscanf(line, "Hardware : %[^\n]", cpu_model)) if (sscanf(line, "Hardware : %[^\n]", cpu_model))
break; break;
}
else if (library) // macOS
{
closedir(library);
sysctlbyname("machdep.cpu.brand_string", &cpu_buffer, &cpu_buffer_len, NULL, 0);
sprintf(version_name, "macos");
sprintf(cpu_model, "%s", cpu_buffer);
} }
else else
sprintf(version_name, "unknown"); sprintf(version_name, "unknown");
@ -314,6 +366,7 @@ void get_info()
truncate_name(kernel); truncate_name(kernel);
// ram // ram
#ifndef __APPLE__
FILE *meminfo; FILE *meminfo;
meminfo = popen("LANG=EN_us free 2> /dev/null", "r"); meminfo = popen("LANG=EN_us free 2> /dev/null", "r");
@ -333,6 +386,31 @@ void get_info()
} }
} }
fclose(meminfo); fclose(meminfo);
#else
// Used
FILE *mem_wired_fp, *mem_active_fp, *mem_compressed_fp;
mem_wired_fp = popen("vm_stat | awk '/wired/ { printf $4 }' | cut -d '.' -f 1", "r");
mem_active_fp = popen("vm_stat | awk '/active/ { printf $3 }' | cut -d '.' -f 1", "r");
mem_compressed_fp = popen("vm_stat | awk '/occupied/ { printf $5 }' | cut -d '.' -f 1", "r");
char mem_wired_ch[2137], mem_active_ch[2137], mem_compressed_ch[2137];
while(fgets(mem_wired_ch, sizeof(mem_wired_ch), mem_wired_fp) != NULL) {
while(fgets(mem_active_ch, sizeof(mem_active_ch), mem_active_fp) != NULL) {
while(fgets(mem_compressed_ch, sizeof(mem_compressed_ch), mem_compressed_fp) != NULL) {}
}
}
pclose(mem_wired_fp); pclose(mem_active_fp); pclose(mem_compressed_fp);
int mem_wired = atoi(mem_wired_ch);
int mem_active = atoi(mem_active_ch);
int mem_compressed = atoi(mem_compressed_ch);
// Total
sysctlbyname("hw.memsize", &mem_buffer, &mem_buffer_len, NULL, 0);
ram_used = ((mem_wired + mem_active + mem_compressed) * 4 / 1024);
ram_total = mem_buffer / 1024 / 1024;
#endif
/* ---------- gpu ---------- */ /* ---------- gpu ---------- */
int gpun = 0; // number of the gpu that the program is searching for to put in the array int gpun = 0; // number of the gpu that the program is searching for to put in the array
@ -349,7 +427,13 @@ void get_info()
{ {
// get gpus with lspci command // get gpus with lspci command
if (strcmp(version_name, "android") != 0) if (strcmp(version_name, "android") != 0)
{
#ifndef __APPLE__
gpu = popen("lspci -mm 2> /dev/null | grep \"VGA\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r"); gpu = popen("lspci -mm 2> /dev/null | grep \"VGA\" | cut --fields=4,6 -d '\"' --output-delimiter=\" \" | sed \"s/ Controller.*//\"", "r");
#else
gpu = popen("system_profiler SPDisplaysDataType | awk -F ': ' '/Chipset Model: /{ print $2 }'", "r");
#endif
}
else else
gpu = popen("getprop ro.hardware.vulkan 2> /dev/null", "r"); gpu = popen("getprop ro.hardware.vulkan 2> /dev/null", "r");
} }
@ -585,6 +669,17 @@ void print_ascii()
YELLOW, RED, YELLOW, WHITE, YELLOW, LPINK, WHITE, LPINK, YELLOW); YELLOW, RED, YELLOW, WHITE, YELLOW, LPINK, WHITE, LPINK, YELLOW);
} }
else if (strcmp(version_name, "macos") == 0)
{
printf("\033[1E\033[3C%s .:`\n"
" .--``--.\n"
"%s ww OwO w\n"
"%s w w\n"
"%s w w\n"
"%s w w\n"
" www_-_www\n\n", GREEN, YELLOW, RED, PINK, BLUE);
}
// everything else // everything else
else else
printf("\033[0E\033[2C%s._.--._.\n" printf("\033[0E\033[2C%s._.--._.\n"
@ -674,6 +769,8 @@ void uwu_name()
else STRING_TO_UWU("freebsd", "FweeBSD"); else STRING_TO_UWU("freebsd", "FweeBSD");
else STRING_TO_UWU("openbsd", "OwOpenBSD"); else STRING_TO_UWU("openbsd", "OwOpenBSD");
else STRING_TO_UWU("macos", "macOwOS");
else else
{ {
sprintf(version_name, "%s", "unknown"); sprintf(version_name, "%s", "unknown");