From 41fc1edc8adad3f49e658b0122ff5a5194c577f1 Mon Sep 17 00:00:00 2001 From: tafabey Date: Sat, 28 Feb 2026 18:51:57 +0000 Subject: [PATCH 1/3] Refactor: Modularized source, new Makefile for using in /usr/lib/, and cleaned up binaries --- Makefile | 31 +++++++++++++++++++++++++------ README.md | 27 ++++++++++++++------------- command.cpp | 45 +++++++++++++++++++++++++++++++++++++++++++++ command.hpp | 46 +++++----------------------------------------- compile.sh | 2 -- main.cpp | 6 ++++++ testcommand | Bin 48032 -> 0 bytes testcommand.cpp | 10 ---------- 8 files changed, 95 insertions(+), 72 deletions(-) create mode 100644 command.cpp delete mode 100755 compile.sh create mode 100644 main.cpp delete mode 100755 testcommand delete mode 100644 testcommand.cpp diff --git a/Makefile b/Makefile index e19fd07..66bf7bd 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,28 @@ CXX = g++ -TARGET = testcommand +CFLAGS = -Wall -Wextra -Werror +OBJS = command.o +TARGET = libcommand.so +PREFIX ?= /usr/local + +all: $(TARGET) + +$(TARGET): $(OBJS) + $(CXX) -shared $(OBJS) -o $(TARGET) + +command.o: command.cpp command.cpp + $(CXX) $(CFLAGS) -fPIC -c command.cpp -o command.o + +install: $(TARGET) + mkdir -p $(PREFIX)/lib + mkdir -p $(PREFIX)/include + install -m 755 $(TARGET) $(PREFIX)/lib/ + install -m 644 command.hpp $(PREFIX)/include/ + +uninstall: + rm -f $(PREFIX)/lib/$(TARGET) + rm -f $(PREFIX)/include/command.hpp -$(TARGET): testcommand.cpp - $(CXX) testcommand.cpp -o $(TARGET) -run: - ./$(TARGET) clean: - rm $(TARGET) + rm -f $(TARGET) $(OBJS) + +.PHONY: all clean install uninstall diff --git a/README.md b/README.md index 1697729..6e1401c 100644 --- a/README.md +++ b/README.md @@ -17,33 +17,34 @@ So I wrote my own wrapper — `command()` — a minimal, readable and safe way t ## Example Usage ```cpp -#include // for cout, main, return function -#include // for string valuable -#include "command.hpp" // for my own super duper awesome command function +#include // for my own super duper awesome command function + int main() { - std::cout << "Enter directory:\n"; - std::string directory; - std::cin >> directory; - command("ls -a " + directory); + command("ls") return 0; } ``` -### Compiling +### Compiling library ```Bash make +sudo make install ``` -If you don't have make installed: + +### Compiling your own code with library ```Bash -./compile.sh +g++ main.cpp -lcommand -o main.elf ``` + ### Running ```Bash -make run +./main.elf ``` -Or: + +### Uninstalling library ```Bash -./testcommand +sudo make uninstall ``` + ## Licensing This project is licensed under the GNU Affero General Public License v3 (AGPLv3). Allowed License Reuse: diff --git a/command.cpp b/command.cpp new file mode 100644 index 0000000..866261f --- /dev/null +++ b/command.cpp @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include +#include +#include +#include "command.hpp" + +std::vector split_command(const std::string& komut) { + std::istringstream iss(komut); + std::string kelime; + std::vector sonuc; + while (iss >> kelime) { + sonuc.push_back(kelime); + } + return sonuc; +} + +int command(const std::string& komut) { + std::vector args = split_command(komut); + if (args.empty()) { + std::cerr << "empty command" << std::endl; + return 1; + } std::vector argv; + for (auto& s : args) { + argv.push_back(strdup(s.c_str())); + } argv.push_back(nullptr); + pid_t pid = fork(); + if (pid == -1) { + std::cerr << "fork() error!" << std::endl; + return 1; + } else if (pid == 0) { + execvp(argv[0], argv.data()); + std::cerr << "execvp failed" << std::endl; + exit(1); + } else { + int durum; + waitpid(pid, &durum, 0); + for (char* ptr : argv) free(ptr); + if (WIFEXITED(durum)) { + return WEXITSTATUS(durum); // Çocuğun exit kodunu döndür + } else { + return 1; // abnormal termination + }}} diff --git a/command.hpp b/command.hpp index 2e9c2a1..cc4b7f7 100644 --- a/command.hpp +++ b/command.hpp @@ -1,46 +1,10 @@ #ifndef COMMAND_HPP #define COMMAND_HPP -#include -#include + #include -#include -#include -#include -#include -inline std::vector split_command(const std::string& komut) { - std::istringstream iss(komut); - std::string kelime; - std::vector sonuc; - while (iss >> kelime) { - sonuc.push_back(kelime); - } - return sonuc; -} +#include + +std::vector split_command(const std::string& komut); +int command(const std::string& komut); -inline int command(const std::string& komut) { - std::vector args = split_command(komut); - if (args.empty()) { - std::cerr << "empty command" << std::endl; - return 1; - } std::vector argv; - for (auto& s : args) { - argv.push_back(strdup(s.c_str())); - } argv.push_back(nullptr); - pid_t pid = fork(); - if (pid == -1) { - std::cerr << "fork() error!" << std::endl; - return 1; - } else if (pid == 0) { - execvp(argv[0], argv.data()); - std::cerr << "execvp failed" << std::endl; - exit(1); - } else { - int durum; - waitpid(pid, &durum, 0); - for (char* ptr : argv) free(ptr); - if (WIFEXITED(durum)) { - return WEXITSTATUS(durum); // Çocuğun exit kodunu döndür - } else { - return 1; // abnormal termination - }}} #endif diff --git a/compile.sh b/compile.sh deleted file mode 100755 index 05b89fd..0000000 --- a/compile.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -g++ testcommand.cpp -o testcommand diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..e15017c --- /dev/null +++ b/main.cpp @@ -0,0 +1,6 @@ +#include + +int main() { + command("ls"); + return 0; +} diff --git a/testcommand b/testcommand deleted file mode 100755 index eece584b0a96c808983f2ca13fd7c3e9b24def7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48032 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 Xb-g-$CQh>DZ+t*;T;j>#Nm~CG_~!MF diff --git a/testcommand.cpp b/testcommand.cpp deleted file mode 100644 index ca69470..0000000 --- a/testcommand.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include -#include "command.hpp" -int main(){ - std::cout << "Enter a directory.\n"; - std::string directory; - std::cin >> directory; - command("ls -a " + directory); - return 0; -} From 3324ef1365d9371a5e7cb96765bb9f5959b8d776 Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Demir Date: Sat, 28 Feb 2026 22:30:13 +0300 Subject: [PATCH 2/3] Update README.md about including --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 6e1401c..05183cb 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,6 @@ - Its formula is basically: **system()-like syntax + fork()/exec() safety = command()** - Designed to provide an easy, readable, shell-free way to run system commands.i - It is single .hpp file function, so it is very easy for adding it to your C++ project: -- Just copy [`command.hpp`](command.hpp) to your project directory, write ```include "command.hpp``` to your C++ file and it is ready to use! ## Philosophy / History While developing my project [`pacostrap`](https://github.com/npc-gnu/pacostrap), I realized: From aff8d6b984b77a3eb496e1c550e9bc89bfcda811 Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Demir Date: Sun, 1 Mar 2026 13:23:39 +0300 Subject: [PATCH 3/3] I forgot the semicolon --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 05183cb..1dedda8 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ So I wrote my own wrapper — `command()` — a minimal, readable and safe way t #include // for my own super duper awesome command function int main() { - command("ls") + command("ls"); return 0; } ```