//Base funcs #include #include #include #include #include #include #include #include "logos.h" #if defined(CLOCK_BOOTTIME) #define CLOCK CLOCK_BOOTTIME #elif defined(CLOCK_UPTIME) #define CLOCK CLOCK_UPTIME #elif defined(__APPLE__) #define CLOCK CLOCK_MONOTONIC #endif typedef struct { size_t size; char *color; char *pkg_cmd; char **art; } LOGO; char *Os; LOGO Logo; struct utsname Uts; //Funcs void Init(void); void GetShell(void); void GetKernel(void); void PrintOs(void); void GetUptime(void); void GetUser(void); void GetPkgs(void); char *GetOs(void); void PrintColors(void); void GetArch(void); void Blank(void); LOGO GetArt(void); void Init(void) { Os = GetOs(); Logo = GetArt(); if (uname(&Uts) < 0) { fprintf(stderr, "WTF, uname dont work\n"); exit(1); } } void GetShell(void) { char *shell = getenv("SHELL"); if (shell == NULL) { printf("%s SHELL \033[0;37mNothing\033[0m", Logo.color); return; } char *splt = strrchr(shell, '/'); if (splt != NULL) printf("%s SHELL \033[0;37m%s\033[0m", Logo.color, splt + 1); } void GetKernel(void) { printf("%s KERNEL \033[0;37m%s\033[0m", Logo.color, Uts.release); } void PrintOs(void) { if (Os == NULL) { printf("%s OS \033[0;37m%s\033[0m", Logo.color, Uts.sysname); return; } printf("%s OS \033[0;37m%s\033[0m", Logo.color, Os + strlen("PRETTY_NAME= ")); } void GetUptime(void) { #ifdef CLOCK struct timespec uptime; clock_gettime(CLOCK, &uptime); int UptimeH = uptime.tv_sec / 3600; int UptimeM = (uptime.tv_sec / 60) - (uptime.tv_sec / 3600 * 60); printf("%s UPTIME \033[0;37m%dh %dm\033[0m", Logo.color, UptimeH, UptimeM); #else printf("%s UPTIME \033[0;37m0h 0m\033[0m", Logo.color); #endif } void GetUser(void) { struct passwd *pw = getpwuid(geteuid()); printf("%s USER \033[0;37m%s\033[0m", Logo.color, pw->pw_name); } void GetPkgs(void) { if (Logo.pkg_cmd == NULL) { printf("%s PKGS \033[0;37m0", Logo.color); return; } FILE *fp = popen(Logo.pkg_cmd, "r"); printf("%s PKGS \033[0;37m", Logo.color); char ch; while ((ch = fgetc(fp)) != '\n') printf("%c", ch); pclose(fp); } char *GetOs(void) { FILE *fp = fopen("/etc/os-release", "r"); if (fp == NULL) return NULL; else { size_t len = 1; char *line = malloc(sizeof(char) * len); while (getline(&line, &len, fp) != EOF) { if (strstr(line, "PRETTY_NAME=") != NULL) { line[strlen(line) - 2] = '\0'; fclose(fp); //Need free (in main()) return line; } } //EOF free(line); } return NULL; } void PrintColors(void) { printf(" "); for (int i = 0; i < 7; i++) printf("\033[1;3%dm● \033[0;3%dm● \033[0m", i, i); } void GetArch(void) { printf("%s ARCH \033[0;37m%s", Logo.color, Uts.machine); } void Blank(void) { return; } LOGO GetArt(void) { LOGO art; if (Os != NULL) { if (strstr(Os, "Debian")) { art.size = sizeof(Debian) / sizeof(char *); art.pkg_cmd = "dpkg -l | tail -n+6 | wc -l"; art.art = Debian; art.color = "\033[0;31m"; } else if (strstr(Os, "Void")) { art.size = sizeof(Void) / sizeof(char *); art.pkg_cmd = "xbps-query -l | wc -l"; art.art = Void; art.color = "\033[0;32m"; } else if (strstr(Os, "Alpine")) { art.size = sizeof(Alpine) / sizeof(char *); art.pkg_cmd = "grep 'P:' /lib/apk/db/installed | wc -l"; art.art = Alpine; art.color = "\033[1;34m"; } else if (strstr(Os, "Arch") || strstr(Os, "Artix")) { art.size = sizeof(Arch) / sizeof(char *); art.pkg_cmd = "pacman -Qq | wc -l"; art.art = Arch; art.color = "\033[0;34"; } } else { art.size = sizeof(Unknow) / sizeof(char *); art.pkg_cmd = NULL; art.art = Unknow; art.color = "\033[1;36m"; } return art; }