Reworked quite a lot

This commit is contained in:
Јован Ђокић-Шумарац 2021-05-26 16:01:41 +02:00
parent 167bf81633
commit 6ba54810c1
3 changed files with 128 additions and 105 deletions

View file

@ -1,6 +1,6 @@
pkgbase = fetchy-git pkgbase = fetchy-git
pkgdesc = Cli system info tool written in C. pkgdesc = Cli system info tool written in C.
pkgver = 1.6 pkgver = 2.0
pkgrel = 1 pkgrel = 1
url = https://gitlab.com/vojjvoda/fetchy.git url = https://gitlab.com/vojjvoda/fetchy.git
arch = x86_64 arch = x86_64

View file

@ -1,6 +1,6 @@
# Maintainer: Јован Ђокић-Шумарац <sumarac@protonmail.com> # Maintainer: Јован Ђокић-Шумарац <sumarac@protonmail.com>
pkgname=fetchy-git pkgname=fetchy-git
pkgver=1.6 pkgver=2.0
pkgrel=1 pkgrel=1
epoch= epoch=
pkgdesc="Cli system info tool written in C. " pkgdesc="Cli system info tool written in C. "

229
fetchy.c
View file

@ -2,28 +2,30 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <dirent.h> // directory management #include <dirent.h>
#include <sys/utsname.h>
#include <sys/sysinfo.h>
#include <pci/pci.h>
#define BUF_SIZE 50 #define BUF_SIZE 50
#define COLS 8 #define COLS 8
#define ROWS 100 #define ROWS 100
//for easier checks
#define SUPPORTED_OS "xadurm" #define SUPPORTED_OS "xadurm"
#define ARCH_BASED "axmr" #define ARCH_BASED "axmr"
#define DEBIAN_BASED "du" #define DEBIAN_BASED "du"
//ascii art header file
#include "logos.h" #include "logos.h"
// standardish functions
void truncate_spaces(char *str);
void read_line(char x); void read_line(char x);
void cache_info(char *cache_path, char **cpu_name, char **gpu, char *os_table); void cache_info(char **cpu_name, char **gpu, char *os_table);
static int count_files(DIR *package_dir); static int count_files(DIR *package_dir);
// 'get info' functions
static char *get_sys(char *s_os, char *os_name, char *os_table); static char *get_sys(char *s_os, char *os_name, char *os_table);
static char *get_kernel(char *kern_name); static char *get_kernel(char *kern_name);
static char *get_uptime(char *uptime); static char *get_uptime(char *uptime);
@ -32,32 +34,34 @@ static char *get_cpu(char *cpuname);
static char *get_gpu(char *gpu); static char *get_gpu(char *gpu);
static char *get_packages(char *package_count); static char *get_packages(char *package_count);
// final function
void concatenate_print(char *os, char *cpu_name, char *gpu); void concatenate_print(char *os, char *cpu_name, char *gpu);
// easier if global, don't hate me
char sys; char sys;
int logo_number = 0; int logo_number = 0;
int main(int argc, char *argv[]){ int main(int argc, char *argv[]){
char *os_name = NULL, char *os_name = NULL,
*cpu_name = NULL, *cpu_name = NULL,
*gpu = NULL, *gpu = NULL,
*os = malloc(BUF_SIZE), *os = malloc(BUF_SIZE),
*os_table = malloc(BUF_SIZE * 2), *os_table = malloc(BUF_SIZE * 2),
*cache_path = malloc(BUF_SIZE * 2), *s_os = SUPPORTED_OS;
*s_os = SUPPORTED_OS;
// if cache file exits, read it, otherwise cache info
cache_info(cache_path, &cpu_name, &gpu, os_table); cache_info(&cpu_name, &gpu, os_table);
os = get_sys(s_os, os_name, os_table); os = get_sys(s_os, os_name, os_table);
// chack if custom ascii art argument is passed
if ( argv[1] != NULL ) { if ( argv[1] != NULL ) {
if ( strchr(SUPPORTED_OS, *(argv[1] + 1)) ) if ( strchr(SUPPORTED_OS, *(argv[1] + 1)) )
@ -71,25 +75,27 @@ int main(int argc, char *argv[]){
concatenate_print( os, cpu_name, gpu); concatenate_print( os, cpu_name, gpu);
free(os_name); free(os_name);
free(cpu_name); free(cpu_name);
free(gpu); free(gpu);
free(cache_path);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
void read_line(char x) { void read_line(char x) {
int c; int c;
while (( c = getchar()) != x && c != EOF) { } while (( c = getchar()) != x && c != EOF) {}
} }
@ -124,46 +130,53 @@ void truncate_spaces(char *str) {
void cache_info(char *cache_path, char **cpu_name, char **gpu, char *os_table) { void cache_info(char **cpu_name, char **gpu, char *os_table) {
char *cache_path = malloc(BUF_SIZE * 2);
FILE *f_cache = NULL;
// construct path to file
snprintf(cache_path, BUF_SIZE * 2, "%s/.local/share/fetchy.cache", getenv("HOME")); snprintf(cache_path, BUF_SIZE * 2, "%s/.local/share/fetchy.cache", getenv("HOME"));
FILE *FCache = NULL;
if( (f_cache = fopen(cache_path, "r")) ){
if( (FCache = fopen(cache_path, "r")) ){ char *line = malloc(BUF_SIZE * 4);
*cpu_name = malloc(BUF_SIZE * 4); *cpu_name = malloc(BUF_SIZE * 4);
*gpu = malloc(BUF_SIZE * 4); *gpu = malloc(BUF_SIZE * 4);
char *line = malloc(BUF_SIZE * 4); //get CPU
fgets(line, BUF_SIZE * 4, f_cache);
fgets(line, BUF_SIZE * 4, FCache);
truncate_spaces(line); truncate_spaces(line);
snprintf(*cpu_name, BUF_SIZE * 4, "\x1b[36mCPU\x1b[0m -> %s", strchr(line, ':') +2); snprintf(*cpu_name, BUF_SIZE * 4, "\x1b[36mCPU\x1b[0m -> %s", strchr(line, ':') +2);
fgets(line, BUF_SIZE * 4, FCache); //get GPU
fgets(line, BUF_SIZE * 4, f_cache);
truncate_spaces(line); truncate_spaces(line);
snprintf(*gpu, BUF_SIZE * 4, "\x1b[36mGPU\x1b[0m -> %s", strchr(line, ':') +2); snprintf(*gpu, BUF_SIZE * 4, "\x1b[36mGPU\x1b[0m -> %s", strchr(line, ':') +2);
fgets(os_table, BUF_SIZE * 2, FCache); //get OS table
fgets(os_table, BUF_SIZE * 2, f_cache);
fclose(FCache); fclose(f_cache);
free(line); free(line);
}
}
else { else {
FCache = fopen(cache_path, "w"); f_cache = fopen(cache_path, "w");
if( FCache == NULL ){ if( f_cache == NULL ){
printf("\nCan't open cache file.\n"); printf("\nCan't open cache file.\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
// Write info to file
fprintf(f_cache, "CPU : %s\n", get_cpu(*cpu_name));
fprintf(f_cache, "GPU : %s\n", get_gpu(*gpu));
fprintf(f_cache, "a:Arch|x:Artix|r:Arco|m:Manjaro|u:Ubuntu|d:Debian\n");
fprintf(FCache, "CPU : %s\n", get_cpu(*cpu_name)); fclose(f_cache);
fprintf(FCache, "GPU : %s\n", get_gpu(*gpu));
fprintf(FCache, "a:Arch|x:Artix|r:Arco|m:Manjaro|u:Ubuntu|d:Debian\n");
fclose(FCache);
@ -173,8 +186,9 @@ void cache_info(char *cache_path, char **cpu_name, char **gpu, char *os_table) {
printf("run program normally. Enjoy!\n\n"); printf("run program normally. Enjoy!\n\n");
cache_info(cache_path, cpu_name, gpu, os_table); cache_info(cpu_name, gpu, os_table);
} }
free(cache_path);
} }
@ -201,29 +215,30 @@ static char *get_sys(char *s_os, char *os_name, char *os_table) {
os_name = malloc(BUF_SIZE); os_name = malloc(BUF_SIZE);
char *name = malloc(BUF_SIZE); char *name = malloc(BUF_SIZE);
FILE *sysName = fopen("/etc/issue", "rt"); FILE *f_sys_name = fopen("/etc/issue", "rt");
if( sysName == NULL ){ if( f_sys_name == NULL ){
fprintf(stderr, "\nCan't get os name\n"); fprintf(stderr, "\nCan't get os name\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
fscanf(sysName, "%s ", name); fscanf(f_sys_name, "%s %*s", name);
fclose(sysName); fclose(f_sys_name);
truncate_spaces(name); truncate_spaces(name);
sys = *(strstr(os_table, name) - 2);
sys = *(strstr(os_table, name) - 2);
logo_number = (int) (strchr(s_os, sys) - s_os); logo_number = (int) (strchr(s_os, sys) - s_os);
if( sys == 'r' ) if( sys == 'r' )
snprintf(os_name, BUF_SIZE, "\x1b[36mOS\x1b[0m -> %s", name); snprintf(os_name, BUF_SIZE, "\x1b[36mOS\x1b[0m -> %s", name); // Arco has a retarded name to be honest, without a space
else else
snprintf(os_name, BUF_SIZE, "\x1b[36mOS\x1b[0m -> %s Linux", name); snprintf(os_name, BUF_SIZE, "\x1b[36mOS\x1b[0m -> %s Linux", name);
free(name); free(name);
return os_name; return os_name;
} }
@ -243,13 +258,15 @@ static char *get_cpu(char *cpu_name){
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
// Skip first four lines, cpu info is on fifth
for(int i = 0; i < 5; i++) for(int i = 0; i < 5; i++)
fgets(line, BUF_SIZE * 4, cpu); fgets(line, BUF_SIZE * 4, cpu);
snprintf(cpu_name, BUF_SIZE * 4, "%s", strchr(line, ':') +2); snprintf(cpu_name, BUF_SIZE * 4, "%s", strchr(line, ':') +2);
truncate_spaces(cpu_name); truncate_spaces(cpu_name);
fclose(cpu); fclose(cpu);
free(line); free(line);
@ -261,19 +278,43 @@ static char *get_cpu(char *cpu_name){
static char *get_gpu(char *gpu){ static char *get_gpu(char *gpu){
gpu = malloc(BUF_SIZE * 3); gpu = malloc(BUF_SIZE);
FILE *gpuName = popen("lspci -v | grep VGA -m 1 | awk -F'[' '{ print $2 }' | awk -F']' '{ print $1 }' ", "r");
fscanf(gpuName, "%[^\n]%s", gpu);
truncate_spaces(gpu);
// https://github.com/pciutils/pciutils/blob/master/example.c
char buffer[BUF_SIZE];
struct pci_access * pacc = pci_alloc();
fclose(gpuName); pci_init(pacc);
pci_scan_bus(pacc);
struct pci_dev * dev = pacc -> devices;
while (dev) {
pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_CLASS);
if (dev -> device_class == 768) {
break;
}
dev = dev -> next;
}
if(strstr(gpu, "VGA")) char * model = pci_lookup_name(pacc, buffer, sizeof(buffer), PCI_LOOKUP_DEVICE, dev -> vendor_id, dev -> device_id);
strcpy(gpu, "CPU's integrated graphics");
pci_cleanup(pacc);
char * vendor = "unknown vendor";
switch(dev -> vendor_id){
case 4098:
vendor = "AMD";
break;
case 4318:
vendor = "NVIDIA";
break;
case 32902:
vendor = "Intel";
break;
}
snprintf(gpu, BUF_SIZE, "%s %s", vendor, model);
return gpu; return gpu;
} }
@ -284,22 +325,11 @@ static char *get_gpu(char *gpu){
static char *get_kernel(char *kern_name){ static char *get_kernel(char *kern_name){
kern_name = malloc(BUF_SIZE); kern_name = malloc(BUF_SIZE);
char *kernel = malloc(BUF_SIZE);
FILE *kInfo = fopen("/proc/version", "rt");
if( kInfo == NULL ){ struct utsname u_info;
printf("\nCan't get kernel info\n"); uname(&u_info);
exit(EXIT_FAILURE);
}
snprintf(kern_name, BUF_SIZE, "\x1b[36mKERN\x1b[0m -> Linux %s", u_info.release);
fscanf(kInfo, "Linux version %s ", kernel);
fclose(kInfo);
truncate_spaces(kernel);
snprintf(kern_name, BUF_SIZE + 5, "\x1b[36mKERN\x1b[0m -> Linux %s", kernel);
free(kernel);
return kern_name; return kern_name;
} }
@ -308,29 +338,19 @@ static char *get_kernel(char *kern_name){
static char *get_uptime(char *uptime){ static char *get_uptime(char *uptime){
uptime = malloc(BUF_SIZE);
unsigned int sec;
short hr, min;
struct sysinfo sys_info;
int sec, sysinfo(&sys_info);
hr,
min;
FILE *FUp = fopen("/proc/uptime", "rt"); sec = sys_info.uptime;
uptime = malloc(BUF_SIZE); hr = (sec/60/60%24);
if( FUp == NULL ){
printf("\nCan't get uptime info\n");
exit(EXIT_FAILURE);
}
fscanf(FUp, "%d", &sec);
fclose(FUp);
hr = (sec/60/60%24);
min = (sec/60%60); min = (sec/60%60);
snprintf(uptime, BUF_SIZE, "\x1b[36mUPT\x1b[0m -> %dh, %dmin", hr, min); snprintf(uptime, BUF_SIZE, "\x1b[36mUPT\x1b[0m -> %hd h, %hd min", hr, min);
return uptime; return uptime;
} }
@ -347,7 +367,7 @@ static char *get_packages(char *package_count){
pkg_count = count_files(opendir("/var/lib/pacman/local")); pkg_count = count_files(opendir("/var/lib/pacman/local"));
else if( strchr(DEBIAN_BASED, sys) ) else if( strchr(DEBIAN_BASED, sys) )
pkg_count = count_files(opendir("/usr/bin")) + count_files(opendir("/sbin")); pkg_count = count_files(opendir("/usr/bin")) + count_files(opendir("/sbin")); // still not sure where to look
@ -382,13 +402,15 @@ static char *get_RAM(char *ram_info){
FILE *RAM = fopen("/proc/meminfo", "rt"); FILE *RAM = fopen("/proc/meminfo", "rt");
// Get total amount of RAM
fgets(line, BUF_SIZE * 3, RAM); fgets(line, BUF_SIZE * 3, RAM);
truncate_spaces(line); truncate_spaces(line);
sscanf(line, " MemTotal: %f", &total); sscanf(line, " MemTotal: %f", &total);
// throw away second line of file
fgets(line, BUF_SIZE * 3, RAM); fgets(line, BUF_SIZE * 3, RAM);
// Get free memory
fgets(line, BUF_SIZE * 3, RAM); fgets(line, BUF_SIZE * 3, RAM);
truncate_spaces(line); truncate_spaces(line);
sscanf(line, " MemAvailable: %f", &free_mem); sscanf(line, " MemAvailable: %f", &free_mem);
@ -398,15 +420,17 @@ static char *get_RAM(char *ram_info){
used = total - free_mem; used = total - free_mem;
real_percent = (used / total) * 100; real_percent = (used / total) * 100;
bar_percent = (real_percent / 10 + 0.35); bar_percent = (real_percent / 10 + 0.25);
for( int i = 1; i <= bar_percent; i++){ for(int i = 1; i <= bar_percent; i++){
bar[i] = '*'; bar[i] = '*';
} }
snprintf(ram_info, BUF_SIZE * 3, "\x1b[36mRAM\x1b[0m -> %.2f GB of %.2f GB, %s -> %.2f %%", used / 1000000, total / 1000000, bar, real_percent); snprintf(ram_info, BUF_SIZE * 3, "\x1b[36mRAM\x1b[0m -> %.2f GB of %.2f GB, %s -> %.2f %%", used / 1000000,
total / 1000000,
bar, real_percent);
free(line); free(line);
return ram_info; return ram_info;
@ -431,14 +455,13 @@ void concatenate_print(char *os, char *cpu_name, char *gpu){
strcat( (logo + logo_number)->logo[5], gpu); strcat( (logo + logo_number)->logo[5], gpu);
strcat( (logo + logo_number)->logo[6], get_RAM(ram_info)); strcat( (logo + logo_number)->logo[6], get_RAM(ram_info));
printf("\n");
for(int i = 0; i < COLS ; i++) for(int i = 0; i < COLS ; i++)
printf("%s\n", (logo + logo_number)->logo[i]); printf("%s\n", (logo + logo_number)->logo[i]);
free(uptime); free(uptime);
free(ram_info); free(ram_info);
free(kern_name);
free(package_count); free(package_count);
free(kern_name);
} }