193 lines
3.3 KiB
C
193 lines
3.3 KiB
C
|
//Base funcs
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <unistd.h>
|
||
|
#include <pwd.h>
|
||
|
#include <time.h>
|
||
|
#include <sys/utsname.h>
|
||
|
#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
|
||
|
|
||
|
//Varables
|
||
|
typedef struct {
|
||
|
size_t size;
|
||
|
char *color;
|
||
|
char *pkg_cmd;
|
||
|
char **art;
|
||
|
} LOGO;
|
||
|
|
||
|
char *Os;
|
||
|
char *Color;
|
||
|
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 Blank(void);
|
||
|
LOGO GetArt(void);
|
||
|
|
||
|
|
||
|
void Init(void) {
|
||
|
Os = GetOs();
|
||
|
|
||
|
Logo = GetArt();
|
||
|
Color = Logo.color;
|
||
|
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[37mNothing\033[0m", Color);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
char *splt = strrchr(shell, '/');
|
||
|
if (splt != NULL)
|
||
|
printf("%s SHELL \033[37m%s\033[0m", Color, splt + 1);
|
||
|
}
|
||
|
|
||
|
|
||
|
void GetKernel(void) {
|
||
|
printf("%s KERNEL \033[37m%s\033[0m", Color, Uts.release);
|
||
|
}
|
||
|
|
||
|
|
||
|
void PrintOs(void) {
|
||
|
if (Os == NULL) {
|
||
|
printf("%s OS \033[37mUnknow\033[0m", Color);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
printf("%s OS \033[37m%s\033[0m", 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[37m%dh %dm\033[0m", Color, UptimeH, UptimeM);
|
||
|
|
||
|
#else
|
||
|
printf("%s UPTIME \033[37m0h 0m\033[0m", Color);
|
||
|
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|
||
|
void GetUser(void) {
|
||
|
struct passwd *pw = getpwuid(geteuid());
|
||
|
printf("%s USER \033[37m%s\033[0m", Color, pw->pw_name);
|
||
|
}
|
||
|
|
||
|
|
||
|
void GetPkgs(void) {
|
||
|
if (Logo.pkg_cmd == NULL) {
|
||
|
printf("%s PKGS \033[37m0", Color);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
FILE *fp = popen(Logo.pkg_cmd, "r");
|
||
|
printf("%s PKGS \033[37m", 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);
|
||
|
return line;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
void PrintColors(void) {
|
||
|
printf(" ");
|
||
|
for (int i = 0; i < 7; i++)
|
||
|
printf("\033[1;3%dm$ \033[0m", i);
|
||
|
}
|
||
|
|
||
|
void Blank(void) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
LOGO GetArt(void) {
|
||
|
LOGO art;
|
||
|
|
||
|
//Else
|
||
|
art.size = sizeof(Debian) / sizeof(char *);
|
||
|
art.pkg_cmd = NULL;
|
||
|
art.art = Debian;
|
||
|
art.color = "\033[0;31m";
|
||
|
if (Os == NULL)
|
||
|
return art;
|
||
|
|
||
|
else 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";
|
||
|
}
|
||
|
|
||
|
return art;
|
||
|
}
|