Compare commits

..

No commits in common. "d034306374d72886b664c165fa5b4219cbf31e63" and "32ae97d7648cb0d27e44b69a69ff2d7e37935676" have entirely different histories.

5 changed files with 68 additions and 1286 deletions

View File

@ -19,19 +19,10 @@ $(OUTPUT): $(SRC)
nomime: $(SRC) nomime: $(SRC)
$(CXX) $(SRC) -o $(OUTPUT) -D NO_MIME $(CXX) $(SRC) -o $(OUTPUT) -D NO_MIME
noemojis: $(SRC)
$(CXX) $(SRC) $(CXXFLAGS) -o $(OUTPUT) -D NO_EMOJIS
check: $(OUTPUT) check: $(OUTPUT)
$(CXX) $(SRC) $(CXXFLAGS) -o $(OUTPUT) $(CXX) $(SRC) $(CXXFLAGS) -o $(OUTPUT)
rm -f $(OUTPUT) rm -f $(OUTPUT)
install: $(OUTPUT)
cp $(OUTPUT) /usr/bin/
userinstall: $(OUTPUT)
cp $(OUTPUT) ~/.local/bin/
# Clean up generated files # Clean up generated files
clean: clean:
rm -f $(OUTPUT) rm -f $(OUTPUT)

View File

@ -78,5 +78,3 @@ pavlik@pavlik-MacBookPro9-2:~/rgb-terminal$ fileinfo . # Current directory
Hidden: 0 files and 1 folders. Hidden: 0 files and 1 folders.
Permissions: drwxrwxr-x Permissions: drwxrwxr-x
``` ```
## Coming soon
* Created, last modified and last opened dates.

View File

@ -1,2 +0,0 @@
// MIME types for archives
#define ARCHIVES {"application/x-archive", "application/x-cpio", "application/x-shar", "application/x-iso9660-image", "application/x-sbx", "application/x-tar", "application/x-brotli", "application/x-bzip2", "application/vnd.genozip", "application/gzip", "application/x-lzip", "application/x-lzma", "application/x-lzop", "application/x-snappy-framed", "application/x-xz", "application/x-compress", "application/x-compress", "application/zstd", "application/x-7z-compressed", "application/x-ace-compressed", "application/x-astrotite-afa", "application/x-alz-compressed", "application/vnd.android.package-archive", "application/x-freearc", "application/x-arj", "application/x-b1", "application/vnd.ms-cab-compressed", "application/x-cfs-compressed", "application/x-dar", "application/x-dgc-compressed", "application/x-apple-diskimage", "application/x-gca-compressed", "application/java-archive", "application/x-lzh", "application/x-lzx", "application/x-rar-compressed", "application/x-stuffit", "application/x-stuffitx", "application/x-gtar", "application/x-ms-wim", "application/x-xar", "application/zip", "application/x-zoo"}

152
main.cpp
View File

@ -7,35 +7,16 @@
#include <cstring> #include <cstring>
#include <unistd.h> #include <unistd.h>
#ifndef NO_MIME #ifndef NO_MIME
#include "mime.h" #include <magic.h>
#include "archives.h" // Run make nomime
#endif #endif
#include <string> #include <string>
#include <vector> #include <vector>
#include <array>
#include <sys/types.h> #include <sys/types.h>
#include <dirent.h> #include <dirent.h>
#include <fstream>
#include "devinfo.c"
void ListPartitions(const std::string& device) {
std::ifstream file("/proc/partitions");
std::string line;
while (std::getline(file, line)) {
if (line.find(device) != std::string::npos) {
std::cout << line << std::endl;
}
}
}
enum FileType { enum FileType {
Unknown, Unknown,
File, Folder, File, Folder,
BLKFile, CHRFile,
FIFO, Symlink,
Socket,
#ifndef NO_MIME #ifndef NO_MIME
Archive, Audio, Archive, Audio,
Application, Application,
@ -44,12 +25,12 @@ enum FileType {
#endif #endif
}; };
std::array<int, 4> get_files_in_directory(const std::string& path) std::vector<int> get_files_in_directory(const std::string& path)
{ {
DIR* dp = opendir(path.c_str()); DIR* dp = opendir(path.c_str());
// int normal, hidden; // int normal, hidden;
std::array<int, 2> normal = {0, 0}; int normal[2] = {0,0};
std::array<int, 2> hidden = {0, 0}; int hidden[2] = {0,0};
if (dp != nullptr) { if (dp != nullptr) {
struct dirent* ep; struct dirent* ep;
while((ep = readdir(dp))) { while((ep = readdir(dp))) {
@ -67,11 +48,11 @@ std::array<int, 4> get_files_in_directory(const std::string& path)
} }
else else
perror("Couldn't open the directory"); perror("Couldn't open the directory");
std::array<int, 4> result; std::vector<int> result;
result[0] = normal[0]; result.insert(result.end(), normal[0]);
result[1] = normal[1]; result.insert(result.end(), normal[1]);
result[2] = hidden[0]; result.insert(result.end(), hidden[0]);
result[3] = hidden[1]; result.insert(result.end(), hidden[1]);
return result; return result;
} }
@ -79,10 +60,53 @@ bool starts_with(const std::string& prefix, const std::string& string) {
return string.rfind(prefix, 0) == 0; return string.rfind(prefix, 0) == 0;
} }
#ifndef NO_MIME
bool is_archive(const std::string& mime_type) bool is_archive(const std::string& mime_type)
{ {
const std::string archives[] = ARCHIVES; const std::string archives[] = {
"application/x-archive",
"application/x-cpio",
"application/x-shar",
"application/x-iso9660-image",
"application/x-sbx",
"application/x-tar",
"application/x-brotli",
"application/x-bzip2",
"application/vnd.genozip",
"application/gzip",
"application/x-lzip",
"application/x-lzma",
"application/x-lzop",
"application/x-snappy-framed",
"application/x-xz",
"application/x-compress",
"application/x-compress",
"application/zstd",
"application/x-7z-compressed",
"application/x-ace-compressed",
"application/x-astrotite-afa",
"application/x-alz-compressed",
"application/vnd.android.package-archive",
"application/x-freearc",
"application/x-arj",
"application/x-b1",
"application/vnd.ms-cab-compressed",
"application/x-cfs-compressed",
"application/x-dar",
"application/x-dgc-compressed",
"application/x-apple-diskimage",
"application/x-gca-compressed",
"application/java-archive",
"application/x-lzh",
"application/x-lzx",
"application/x-rar-compressed",
"application/x-stuffit",
"application/x-stuffitx",
"application/x-gtar",
"application/x-ms-wim",
"application/x-xar",
"application/zip",
"application/x-zoo"
};
int len = sizeof(archives)/sizeof(archives[0]); int len = sizeof(archives)/sizeof(archives[0]);
for(int i = 0; i < len; ++i) for(int i = 0; i < len; ++i)
@ -94,7 +118,6 @@ bool is_archive(const std::string& mime_type)
} }
return false; return false;
} }
#endif
std::string get_name_from_filetype(const enum FileType fs) std::string get_name_from_filetype(const enum FileType fs)
{ {
@ -113,16 +136,6 @@ std::string get_name_from_filetype(const enum FileType fs)
return "File"; return "File";
case FileType::Folder: case FileType::Folder:
return "Folder"; return "Folder";
case FileType::BLKFile:
return "Block special file";
case FileType::CHRFile:
return "Character special file";
case FileType::FIFO:
return "Pipe or FIFO special file";
case FileType::Socket:
return "UNIX socket";
case FileType::Symlink:
return "Symbolic";
#ifndef NO_MIME #ifndef NO_MIME
case FileType::Text: case FileType::Text:
return "Text"; return "Text";
@ -133,10 +146,8 @@ std::string get_name_from_filetype(const enum FileType fs)
return "Unknown"; return "Unknown";
} }
} }
std::string get_emoji_from_filetype(const enum FileType fs) std::string get_emoji_from_filetype(const enum FileType fs)
{ {
#ifndef NO_EMOJIS
switch (fs) { switch (fs) {
#ifndef NO_MIME #ifndef NO_MIME
case FileType::Application: case FileType::Application:
@ -152,16 +163,6 @@ std::string get_emoji_from_filetype(const enum FileType fs)
return "📄"; return "📄";
case FileType::Folder: case FileType::Folder:
return "📁"; return "📁";
case FileType::BLKFile:
return "🪄";
case FileType::CHRFile:
return "🖨️";
case FileType::FIFO:
return "🤝";
case FileType::Socket:
return "🔌";
case FileType::Symlink:
return "🔗";
#ifndef NO_MIME #ifndef NO_MIME
case FileType::Text: case FileType::Text:
return "📝"; return "📝";
@ -171,14 +172,9 @@ std::string get_emoji_from_filetype(const enum FileType fs)
default: default:
return "?"; return "?";
} }
#else
return "";
#endif
} }
std::string readable_fs(const long int size /*in bytes*/, std::string readable_fs(const long int size /*in bytes*/, const double divide_by = 1024, const std::string& suffix = "B")
const double divide_by = 1024,
const std::string& suffix = "B")
{ {
if(size < 1024) { if(size < 1024) {
char buffer[128]; char buffer[128];
@ -257,25 +253,11 @@ std::string basename(const std::string& filepath) {
return filepath.substr(filepath.find_last_of("/\\") + 1); return filepath.substr(filepath.find_last_of("/\\") + 1);
} }
FileType getFileType(mode_t st_mode) {
if(S_ISBLK(st_mode)) return FileType::BLKFile;
if(S_ISCHR(st_mode)) return FileType::CHRFile;
if(S_ISDIR(st_mode)) return FileType::Folder;
if(S_ISFIFO(st_mode)) return FileType::FIFO;
if(S_ISLNK(st_mode)) return FileType::Symlink;
if(S_ISSOCK(st_mode)) return FileType::Socket;
if(S_ISREG(st_mode)) return FileType::File;
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
bool absolute = false; bool absolute = false;
#ifndef NO_EMOJIS
bool emojis = true; bool emojis = true;
#else // char* filename = "/home/pavlik/Desktop/twrp-3.7.0_9-0-starlte.img";
bool emojis = false;
#endif
if (argc < 2) { if (argc < 2) {
std::cerr << "Usage:\n\t" << argv[0] << " [args] filename ...\n"; std::cerr << "Usage:\n\t" << argv[0] << " [args] filename ...\n";
std::cerr << "Args:" << std::endl; std::cerr << "Args:" << std::endl;
@ -311,8 +293,7 @@ int main(int argc, char *argv[])
return 1; return 1;
} }
// start // start
FileType file = getFileType(file_stat.st_mode); int is_file = S_ISREG(file_stat.st_mode);
bool is_file = file == FileType::File;
char temp[4097] = {'\0'}; char temp[4097] = {'\0'};
if (realpath(c_filename, temp) == nullptr) { if (realpath(c_filename, temp) == nullptr) {
perror("realpath"); perror("realpath");
@ -321,13 +302,14 @@ int main(int argc, char *argv[])
std::string full_name(temp); // = malloc(4097); std::string full_name(temp); // = malloc(4097);
// delete[] temp; // delete[] temp;
std::string name = basename(full_name); std::string name = basename(full_name);
if(file == FileType::Folder) name += "/"; if(!is_file) name += "/";
#ifndef NO_MIME #ifndef NO_MIME
std::string mime_type = get_mime(full_name); std::string mime_type = get_mime(full_name);
//file = (is_file) ? FileType::File : FileType::Folder;
#else
std::string mime_type = "application/octet-stream (no mime)";
#endif #endif
FileType file;
#ifdef NO_MIME
file = (is_file) ? FileType::File : FileType::Folder;
#else
if (starts_with("inode/directory", mime_type) || !is_file) { if (starts_with("inode/directory", mime_type) || !is_file) {
file = FileType::Folder; file = FileType::Folder;
} else if (is_archive(mime_type)) { } else if (is_archive(mime_type)) {
@ -343,9 +325,9 @@ int main(int argc, char *argv[])
} else if (starts_with("text", mime_type)) { } else if (starts_with("text", mime_type)) {
file = FileType::Text; file = FileType::Text;
} else { } else {
file = FileType::Binary; file = FileType::Unknown;
} }
#endif
std::string type = get_name_from_filetype(file); std::string type = get_name_from_filetype(file);
std::string emoji = get_emoji_from_filetype(file); std::string emoji = get_emoji_from_filetype(file);
if (emojis) printf("%s ", emoji.c_str()); if (emojis) printf("%s ", emoji.c_str());
@ -361,14 +343,12 @@ int main(int argc, char *argv[])
std::string _1000 = readable_fs(file_stat.st_size, 1024, "iB"); std::string _1000 = readable_fs(file_stat.st_size, 1024, "iB");
if (file_stat.st_size >= 1000) printf("\tFile size: %s or %s (%li bytes)\n", _1024.c_str(), _1000.c_str(), file_stat.st_size); if (file_stat.st_size >= 1000) printf("\tFile size: %s or %s (%li bytes)\n", _1024.c_str(), _1000.c_str(), file_stat.st_size);
else printf("\tFile size: %li bytes\n", file_stat.st_size); else printf("\tFile size: %li bytes\n", file_stat.st_size);
} else if (file == FileType::Folder) { } else {
auto insides = get_files_in_directory(full_name); auto insides = get_files_in_directory(full_name);
printf("\tContents:\n"); printf("\tContents:\n");
printf("\t\tNormal: %i files and %i folders.\n", insides[0], insides[1]); printf("\t\tNormal: %i files and %i folders.\n", insides[0], insides[1]);
printf("\t\tHidden: %i files and %i folders.\n", insides[2], insides[3]); printf("\t\tHidden: %i files and %i folders.\n", insides[2], insides[3]);
} else if (file == FileType::CHRFile) { }
ListPartitions(full_name);
}
printf("\tPermissions: %s\n", print_permissions(file_stat.st_mode, !is_file).c_str()); printf("\tPermissions: %s\n", print_permissions(file_stat.st_mode, !is_file).c_str());
if (i != last-1) { if (i != last-1) {
printf("\n"); printf("\n");

1185
mime.cpp

File diff suppressed because it is too large Load Diff