//Base funcs #ifndef FUNCS_H #define FUNCS_H #include #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); void PrintColors(void); void GetArch(void); void Blank(void); char *GetOs(void); void SetArt(LOGO *art, size_t size, char *pkg_cmd, char **logo, char *color); LOGO GetArt(void); void Init(void) { if (uname(&Uts) < 0) { fprintf(stderr, "kfetch: uaname() failed: %s\n", strerror(errno)); exit(1); } Os = GetOs(); Logo = GetArt(); } void GetShell(void) { char *shell = getenv("SHELL"); if (shell == NULL) { printf("%sSHELL \033[0;37mNothing\033[0m", Logo.color); return; } char *splt = strrchr(shell, '/'); if (splt != NULL) printf("%sSHELL \033[0;37m%s\033[0m", Logo.color, splt + 1); } void GetKernel(void) { printf("%sKERNEL \033[0;37m%s\033[0m", Logo.color, Uts.release); } void PrintOs(void) { if (Os == NULL) { printf("%sOS \033[0;37m%s\033[0m", Logo.color, Uts.sysname); return; } printf("%sOS \033[0;37m%s\033[0m", Logo.color, Os + strlen("PRETTY_NAME= ")); } void GetUptime(void) { int UptimeH = 0; int UptimeM = 0; #ifdef CLOCK struct timespec uptime; clock_gettime(CLOCK, &uptime); UptimeH = uptime.tv_sec / 3600; UptimeM = (uptime.tv_sec / 60) - (uptime.tv_sec / 3600 * 60); #endif printf("%sUPTIME \033[0;37m%dh %dm\033[0m", Logo.color, UptimeH, UptimeM); } void GetUser(void) { struct passwd *pw = getpwuid(geteuid()); printf("%sUSER \033[0;37m%s\033[0m", Logo.color, pw->pw_name); } void GetPkgs(void) { if (Logo.pkg_cmd == NULL) { printf("%sPKGS \033[0;37m0", Logo.color); return; } FILE *fp = popen(Logo.pkg_cmd, "r"); if (fp == NULL) { printf("%sPKGS \033[0;37m0", Logo.color); return; } printf("%sPKGS \033[0;37m", Logo.color); char ch; while ((ch = fgetc(fp))) { if (feof(fp) || ch == '\n') break; printf("%c", ch); } pclose(fp); } void PrintColors(void) { for (int i = 1; i < 7; i++) printf("\033[1;3%dm● \033[0;3%dm● \033[0m", i, i); } void GetArch(void) { printf("%sARCH \033[0;37m%s", Logo.color, Uts.machine); } void GetAvg(void) { double avg[3] = {0, 0, 0}; #ifndef __ANDROID__ if (getloadavg(avg, sizeof(avg) / sizeof(avg[0])) < 0) { fprintf(stderr, "kfetch: getloadavg() failed\n"); return; } #endif printf("%sLOAGAVG \033[0;37m%.2f %.2f %.2f", Logo.color, avg[0], avg[1], avg[2]); } void Blank(void) { return; } 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 SetArt(LOGO *art, size_t size, char *pkg_cmd, char **logo, char *color) { art->size = size; art->pkg_cmd = pkg_cmd; art->art = logo; art->color = color; } LOGO GetArt(void) { LOGO art; if (Os != NULL) { if (strstr(Os, "Debian")) SetArt(&art, sizeof(Debian) / sizeof(char *), "dpkg -l | tail -n+6 | wc -l", Debian, "\033[0;31m"); else if (strstr(Os, "Void")) SetArt(&art, sizeof(Void) / sizeof(char *), "xbps-query -l | wc -l", Void, "\033[0;32m"); else if (strstr(Os, "Alpine")) SetArt(&art, sizeof(Alpine) / sizeof(char *), "grep 'P:' /lib/apk/db/installed | wc -l", Alpine, "\033[1;34m"); else if (strstr(Os, "Arch") || strstr(Os, "Artix")) SetArt(&art, sizeof(Arch) / sizeof(char *), "pacman -Qq | wc -l", Arch, "\033[0;34m"); } else if (access("/system", F_OK) != 1) SetArt(&art, sizeof(Android) / sizeof(char *), "dpkg -l | tail -n+6 | wc -l", Android, "\033[32m"); else SetArt(&art, sizeof(Unknow) / sizeof(char *), NULL, Unknow, "\033[1;36m"); return art; } #endif