2021-05-10 13:47:11 +02:00
# pragma GCC diagnostic ignored "-Wunused-function"
2021-05-03 21:47:45 +02:00
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
2021-05-10 08:25:03 +02:00
# include <math.h>
# include <dirent.h>
2021-05-03 21:47:45 +02:00
2021-05-10 08:25:03 +02:00
# define BUF_SIZE 20
2021-05-03 21:47:45 +02:00
2021-05-10 12:24:24 +02:00
void truncate_spaces_leading ( char * str ) ;
2021-05-12 15:08:06 +02:00
void truncate_spaces_trailing ( char * str ) ;
2021-05-10 12:24:24 +02:00
void read_line ( char x ) ;
int count_files ( char * path ) ;
2021-05-03 21:47:45 +02:00
2021-05-10 13:09:05 +02:00
static char * get_sys ( char * sys , char * os_name ) ;
static char * get_kernel ( char * kern_name ) ;
static char * get_uptime ( char * uptime ) ;
static char * get_RAM ( char * ram_info ) ;
static char * get_cpu ( char * cpuname ) ;
2021-05-12 15:08:06 +02:00
static char * get_gpu ( char * gpu ) ;
static int get_packages ( char sys ) ;
2021-05-03 21:47:45 +02:00
int main ( int argc , char * argv [ ] ) {
2021-05-12 15:08:06 +02:00
char sys ;
char * os_name = NULL , * uptime = NULL , * kern_name = NULL , * ram_info = NULL , * cpu_name = NULL , * gpu = NULL ;
char * os = malloc ( BUF_SIZE ) , * cache_path = malloc ( BUF_SIZE * 2 ) ;
snprintf ( cache_path , BUF_SIZE * 2 , " %s/.local/share/fetchy.cache " , getenv ( " HOME " ) ) ;
FILE * FCache = NULL ;
if ( ( FCache = fopen ( cache_path , " r " ) ) ) {
cpu_name = malloc ( BUF_SIZE * 4 ) ;
gpu = malloc ( BUF_SIZE * 4 ) ;
char * line = malloc ( BUF_SIZE * 4 ) ;
fgets ( line , BUF_SIZE * 4 , FCache ) ;
snprintf ( cpu_name , BUF_SIZE * 4 , " %s " , strchr ( line , ' : ' ) + 2 ) ;
truncate_spaces_trailing ( cpu_name ) ;
fgets ( line , BUF_SIZE * 4 , FCache ) ;
snprintf ( gpu , BUF_SIZE * 4 , " %s " , strchr ( line , ' : ' ) + 2 ) ;
truncate_spaces_trailing ( gpu ) ;
fclose ( FCache ) ;
free ( line ) ;
}
else {
FCache = fopen ( cache_path , " w " ) ;
fprintf ( FCache , " CPU : %s \n " , get_cpu ( cpu_name ) ) ;
fprintf ( FCache , " GPU : %s \n " , get_gpu ( gpu ) ) ;
fclose ( FCache ) ;
printf ( " \n \n \a FILE CACHING DONE!! \n \n Values returned : \n CPU -> %s \n GPU -> %s \n \n Caching occurs only once, every subsequent execution will run program normally. Enjoy! \n \n " , get_cpu ( cpu_name ) , get_gpu ( gpu ) ) ;
exit ( 0 ) ;
}
2021-05-10 13:09:05 +02:00
2021-05-10 14:04:52 +02:00
2021-05-10 08:25:03 +02:00
2021-05-10 13:09:05 +02:00
os = get_sys ( & sys , os_name ) ;
2021-05-10 08:25:03 +02:00
2021-05-10 13:09:05 +02:00
switch ( sys ) {
2021-05-03 21:47:45 +02:00
2021-05-10 13:09:05 +02:00
case ' a ' :
2021-05-03 21:47:45 +02:00
2021-05-10 13:09:05 +02:00
printf ( " \n " ) ;
printf ( " \x1b [1m . \x1b [36mOS \x1b [0m -> %s \n " , os ) ;
printf ( " \x1b [1m / \\ \x1b [36mKRNL \x1b [0m -> %s \n " , get_kernel ( kern_name ) ) ;
printf ( " \x1b [1m / \\ \x1b [36mUPT \x1b [0m -> %s \n " , get_uptime ( uptime ) ) ;
printf ( " \x1b [1m /^. \\ \x1b [36mPKGS \x1b [0m -> %d \n " , get_packages ( sys ) ) ;
printf ( " \x1b [1m / .-. \\ \x1b [36m \x1b [0m \n " ) ;
2021-05-12 15:08:06 +02:00
printf ( " \x1b [1m / ( ) _ \\ \x1b [36mCPU \x1b [0m -> %s \n " , cpu_name ) ;
printf ( " \x1b [1m / _.~ ~._^ \\ \x1b [36mGPU \x1b [0m -> %s \n " , gpu ) ;
2021-05-10 13:09:05 +02:00
printf ( " \x1b [1m /.^ ^. \\ \x1b [36mRAM \x1b [0m -> %s \n " , get_RAM ( ram_info ) ) ;
printf ( " \n \n " ) ;
break ;
2021-05-03 21:47:45 +02:00
2021-05-10 13:09:05 +02:00
case ' u ' :
printf ( " \n " ) ;
printf ( " \x1b [1m .-. \x1b [36mOS \x1b [0m -> %s \n " , os ) ;
printf ( " \x1b [1m .-'``(|||) \x1b [36mKERNEL \x1b [0m -> %s \n " , get_kernel ( kern_name ) ) ;
printf ( " \x1b [1m ,` \\ \\ `-`. \x1b [36mUPTIME \x1b [0m -> %s \n " , get_uptime ( uptime ) ) ;
2021-05-10 13:47:11 +02:00
printf ( " \x1b [1m / \\ '``-. ` \x1b [36mPACKAGES \x1b [0m -> *W.I.P.* \n " ) ; //%d\n", get_packages(sys));
2021-05-10 13:09:05 +02:00
printf ( " \x1b [1m .-. , `___: \x1b [36m \x1b [0m \n " ) ;
2021-05-12 15:08:06 +02:00
printf ( " \x1b [1m (:::) : ___ \x1b [36mCPU \x1b [0m -> %s \n " , cpu_name ) ;
2021-05-10 13:09:05 +02:00
printf ( " \x1b [1m `-` ` , : \x1b [36mGPU \x1b [0m -> %s \n " , gpu ) ;
printf ( " \x1b [1m \\ / ,..-` , \x1b [36mRAM \x1b [0m -> %s \n " , get_RAM ( ram_info ) ) ;
printf ( " \x1b [1m `./ / .-.` \x1b [36m \x1b [0m \n " ) ;
printf ( " \x1b [1m `-..-( ) \x1b [36m \x1b [0m \n " ) ;
printf ( " \x1b [1m `-` \x1b [36m \x1b [0m \n " ) ;
printf ( " \n \n " ) ;
break ;
2021-05-03 21:47:45 +02:00
2021-05-10 13:09:05 +02:00
default :
printf ( " \n \n ERROR : Unsupported system \n \n " ) ;
exit ( - 1 ) ;
2021-05-03 21:47:45 +02:00
}
2021-05-10 13:09:05 +02:00
2021-05-10 08:25:03 +02:00
free ( os_name ) ;
free ( uptime ) ;
2021-05-10 11:10:06 +02:00
free ( ram_info ) ;
2021-05-10 10:41:52 +02:00
free ( kern_name ) ;
2021-05-10 12:24:24 +02:00
free ( cpu_name ) ;
2021-05-12 15:08:06 +02:00
free ( gpu ) ;
free ( cache_path ) ;
2021-05-10 08:25:03 +02:00
return 0 ;
2021-05-03 21:47:45 +02:00
}
2021-05-10 11:10:06 +02:00
2021-05-10 12:24:24 +02:00
void read_line ( char x ) {
2021-05-10 11:10:06 +02:00
int c ;
while ( ( c = getchar ( ) ) ! = x & & c ! = EOF ) { }
}
2021-05-10 12:24:24 +02:00
void truncate_spaces_leading ( char * str ) {
2021-05-10 08:25:03 +02:00
int src = 0 , dst = 0 ;
while ( * ( str + dst ) = = ' ' ) dst + + ;
2021-05-03 21:47:45 +02:00
2021-05-10 08:25:03 +02:00
while ( * ( str + dst ) ! = ' \0 ' ) {
* ( str + src ) = * ( str + dst ) ;
if ( * ( str + ( dst + + ) ) = = ' ' )
while ( * ( str + dst ) = = ' ' ) dst + + ;
2021-05-03 21:47:45 +02:00
2021-05-10 08:25:03 +02:00
src + + ;
}
2021-05-03 21:47:45 +02:00
2021-05-10 08:25:03 +02:00
* ( str + src ) = ' \0 ' ;
}
2021-05-03 21:47:45 +02:00
2021-05-10 13:09:05 +02:00
2021-05-10 12:24:24 +02:00
void truncate_spaces_trailing ( char * str ) {
int index , i = - 1 ;
2021-05-03 21:47:45 +02:00
2021-05-10 12:24:24 +02:00
/* Find last index of non-white space character */
i = 0 ;
while ( str [ i ] ! = ' \0 ' ) {
if ( str [ i ] ! = ' ' & & str [ i ] ! = ' \t ' & & str [ i ] ! = ' \n ' ) {
index = i ;
}
i + + ;
}
/* Mark next character to last non-white space character as NULL */
str [ index + 1 ] = ' \0 ' ;
}
2021-05-03 21:47:45 +02:00
2021-05-10 13:09:05 +02:00
static char * get_sys ( char * sys , char * os_name ) {
2021-05-10 08:25:03 +02:00
os_name = malloc ( BUF_SIZE ) ;
char * name = malloc ( BUF_SIZE ) ;
2021-05-10 12:24:24 +02:00
FILE * sysName = fopen ( " /etc/issue " , " rt " ) ;
2021-05-10 08:25:03 +02:00
fscanf ( sysName , " %s " , name ) ;
fclose ( sysName ) ;
2021-05-10 12:24:24 +02:00
truncate_spaces_leading ( name ) ;
2021-05-10 11:10:06 +02:00
snprintf ( os_name , BUF_SIZE , " %s Linux " , name ) ;
2021-05-10 08:25:03 +02:00
2021-05-12 17:47:42 +02:00
if ( ! strcmp ( name , " Arch " ) | | ! strcmp ( name , " Artix " ) ) * sys = ' a ' ;
2021-05-10 11:10:06 +02:00
if ( ! strcmp ( name , " Ubuntu " ) ) * sys = ' u ' ;
2021-05-10 08:25:03 +02:00
free ( name ) ;
return os_name ;
2021-05-03 21:47:45 +02:00
}
2021-05-10 13:09:05 +02:00
static char * get_cpu ( char * cpu_name ) {
2021-05-10 12:24:24 +02:00
char * line = malloc ( BUF_SIZE * 4 ) ;
cpu_name = malloc ( BUF_SIZE * 4 ) ;
FILE * cpu = fopen ( " /proc/cpuinfo " , " rt " ) ;
for ( int i = 0 ; i < 5 ; i + + )
fgets ( line , BUF_SIZE * 4 , cpu ) ;
snprintf ( cpu_name , BUF_SIZE * 4 , " %s " , strchr ( line , ' : ' ) + 2 ) ;
truncate_spaces_trailing ( cpu_name ) ;
fclose ( cpu ) ;
free ( line ) ;
2021-05-03 21:47:45 +02:00
2021-05-10 12:24:24 +02:00
return cpu_name ;
2021-05-03 21:47:45 +02:00
}
2021-05-10 13:09:05 +02:00
2021-05-12 15:08:06 +02:00
static char * get_gpu ( char * gpu ) {
gpu = malloc ( BUF_SIZE * 3 ) ;
2021-05-03 21:47:45 +02:00
FILE * gpuName = popen ( " lspci -v | grep VGA -m 1 | awk -F'[' '{ print $2 }' | awk -F']' '{ print $1 }' " , " r " ) ;
fscanf ( gpuName , " %[^ \n ]%s " , gpu ) ;
2021-05-12 15:08:06 +02:00
truncate_spaces_leading ( gpu ) ;
truncate_spaces_trailing ( gpu ) ;
2021-05-03 21:47:45 +02:00
fclose ( gpuName ) ;
2021-05-12 16:22:29 +02:00
2021-05-12 16:25:44 +02:00
if ( strstr ( gpu , " VGA " ) )
2021-05-12 16:22:29 +02:00
strcpy ( gpu , " CPU's integrated graphics " ) ;
2021-05-12 15:08:06 +02:00
return gpu ;
2021-05-03 21:47:45 +02:00
}
2021-05-10 13:09:05 +02:00
static char * get_kernel ( char * kern_name ) {
2021-05-10 08:25:03 +02:00
kern_name = malloc ( BUF_SIZE ) ;
char * kernel = malloc ( BUF_SIZE ) ;
2021-05-10 12:24:24 +02:00
FILE * kInfo = fopen ( " /proc/version " , " rt " ) ;
2021-05-03 21:47:45 +02:00
2021-05-10 08:25:03 +02:00
fscanf ( kInfo , " Linux version %s " , kernel ) ;
2021-05-03 21:47:45 +02:00
fclose ( kInfo ) ;
2021-05-10 12:24:24 +02:00
truncate_spaces_leading ( kernel ) ;
2021-05-10 08:25:03 +02:00
snprintf ( kern_name , BUF_SIZE + 5 , " Linux %s " , kernel ) ;
free ( kernel ) ;
return kern_name ;
}
2021-05-03 21:47:45 +02:00
2021-05-10 13:09:05 +02:00
static char * get_uptime ( char * uptime ) {
2021-05-10 08:25:03 +02:00
int sec , hr , min ;
2021-05-10 12:24:24 +02:00
FILE * FUp = fopen ( " /proc/uptime " , " rt " ) ;
2021-05-10 08:25:03 +02:00
uptime = malloc ( BUF_SIZE ) ;
2021-05-03 21:47:45 +02:00
fscanf ( FUp , " %d " , & sec ) ;
fclose ( FUp ) ;
2021-05-10 08:25:03 +02:00
hr = ( sec / 60 / 60 % 24 ) ;
min = ( sec / 60 % 60 ) ;
snprintf ( uptime , BUF_SIZE , " %dh, %dmin " , hr , min ) ;
return uptime ;
2021-05-03 21:47:45 +02:00
}
2021-05-10 13:09:05 +02:00
2021-05-10 08:25:03 +02:00
static int get_packages ( char sys ) {
DIR * packageDir ;
int fileCount = 0 ;
struct dirent * entry ;
2021-05-03 21:47:45 +02:00
switch ( sys ) {
case ' a ' :
2021-05-10 08:25:03 +02:00
packageDir = opendir ( " /var/lib/pacman/local " ) ;
2021-05-03 21:47:45 +02:00
break ;
case ' u ' :
2021-05-10 08:25:03 +02:00
2021-05-03 21:47:45 +02:00
break ;
default :
printf ( " \n \n \a Unable to find package list \n \n " ) ;
}
2021-05-10 08:25:03 +02:00
while ( ( entry = readdir ( packageDir ) ) ! = NULL ) {
if ( entry - > d_type = = DT_DIR ) {
fileCount + + ;
}
}
closedir ( packageDir ) ;
return fileCount ;
2021-05-03 21:47:45 +02:00
}
2021-05-10 13:09:05 +02:00
static char * get_RAM ( char * ram_info ) {
2021-05-10 11:10:06 +02:00
int bar_percent ;
float total , free_mem , used ;
float real_percent ;
ram_info = malloc ( BUF_SIZE * 3 ) ;
char * line = malloc ( BUF_SIZE * 3 ) ;
char bar [ ] = " [----------] " ;
2021-05-10 12:24:24 +02:00
FILE * RAM = fopen ( " /proc/meminfo " , " rt " ) ;
2021-05-04 16:46:09 +02:00
2021-05-10 11:10:06 +02:00
fgets ( line , BUF_SIZE * 3 , RAM ) ;
2021-05-10 12:24:24 +02:00
truncate_spaces_leading ( line ) ;
2021-05-10 11:10:06 +02:00
sscanf ( line , " MemTotal: %f " , & total ) ;
fgets ( line , BUF_SIZE * 3 , RAM ) ;
2021-05-10 12:24:24 +02:00
truncate_spaces_leading ( line ) ;
2021-05-10 11:10:06 +02:00
sscanf ( line , " MemFree: %f " , & free_mem ) ;
2021-05-04 16:46:09 +02:00
fclose ( RAM ) ;
2021-05-10 11:10:06 +02:00
used = total - free_mem ;
real_percent = ( used / total ) * 100 ;
2021-05-12 15:08:06 +02:00
bar_percent = ( real_percent / 10 + 0.35 ) ;
2021-05-04 16:46:09 +02:00
2021-05-10 11:10:06 +02:00
for ( int i = 1 ; i < = bar_percent ; i + + ) {
2021-05-04 16:46:09 +02:00
bar [ i ] = ' * ' ;
}
2021-05-10 11:10:06 +02:00
snprintf ( ram_info , BUF_SIZE * 3 , " %.2f GB of %.2f GB, %s -> %.2f %% " , used / 1000000 , total / 1000000 , bar , real_percent ) ;
free ( line ) ;
return ram_info ;
2021-05-04 16:46:09 +02:00
}
2021-05-10 08:25:03 +02:00