Overhaul cmake configuration, add console api, fix http code that caused issues with cgi-bin

This commit is contained in:
2026-05-27 03:02:16 -05:00
parent 266ef5f830
commit 8413c67ec6
177 changed files with 20088 additions and 17948 deletions

View File

@@ -6,18 +6,15 @@ using namespace Tesses::Framework::Filesystem;
using namespace Tesses::Framework::Serialization::Bencode;
using namespace Tesses::Framework::TextStreams;
using namespace Tesses::Framework::BitTorrent;
int main(int argc, char** argv)
{
int main(int argc, char **argv) {
TF_Init();
if(argc < 2)
{
printf("USAGE: %s /path/to/torrent/file\n",argv[0]);
if (argc < 2) {
printf("USAGE: %s /path/to/torrent/file\n", argv[0]);
return 1;
}
auto strm = LocalFS->OpenFile((std::string)argv[1],"rb");
auto strm = LocalFS->OpenFile((std::string)argv[1], "rb");
auto bencode = Bencode::Load(strm);
if(std::holds_alternative<BeDictionary>(bencode))
{
if (std::holds_alternative<BeDictionary>(bencode)) {
TorrentFile file(std::get<BeDictionary>(bencode));
file.Print(std::make_shared<ConsoleWriter>());

View File

@@ -7,83 +7,84 @@ using namespace Tesses::Framework::Filesystem;
std::shared_ptr<VFS> vfs;
int main(int argc, char** argv)
{
int main(int argc, char **argv) {
TF_InitWithConsole();
vfs = std::make_shared<SubdirFilesystem>(LocalFS,Tesses::Framework::Filesystem::VFSPath::GetAbsoluteCurrentDirectory());
vfs = std::make_shared<SubdirFilesystem>(
LocalFS,
Tesses::Framework::Filesystem::VFSPath::GetAbsoluteCurrentDirectory());
std::shared_ptr<CallbackServer> cb = std::make_shared<CallbackServer>([](ServerContext& ctx)->bool{
if(ctx.path == "/")
{
std::shared_ptr<CallbackServer> cb = std::make_shared<
CallbackServer>([](ServerContext &ctx) -> bool {
if (ctx.path == "/") {
ctx.WithMimeType("text/html")
.SendText(
"<!DOCTYPE html>"
"<html>"
"<head><meta charset=\"UTF-8\"><title>AnonyDrop</title><meta name=\"color-scheme\" content=\"dark light\"></head>"
"<body>"
"<h1>AnonyDrop</h1>"
"<a href=\"./files/\">Files</a>"
"<form action=\"./upload\" method=\"post\" enctype=\"multipart/form-data\" accept-charset=\"UTF-8\">"
"<input type=\"file\" name=\"file\" multiple>"
"<input type=\"submit\" value=\"Upload\">"
"</form>"
"</body>"
"</html>"
);
return true;
}
else if(ctx.path == "/upload")
{
if(ctx.NeedToParseFormData())
{
ctx.ParseFormData([](std::string mime, std::string filename,std::string name)->std::shared_ptr<Stream> {
if(name != "file") return nullptr;
VFSPath path("/"+filename);
auto strm = vfs->OpenFile(path,"wb");
return strm;
});
ctx.WithMimeType("text/html")
.SendText(
"<!DOCTYPE html>"
"<html>"
"<head><meta name=\"color-scheme\" content=\"dark light\"><title>AnonyDrop - Uploaded successfully</title></head>"
"<head><meta "
"charset=\"UTF-8\"><title>AnonyDrop</title><meta "
"name=\"color-scheme\" content=\"dark light\"></head>"
"<body>"
"<h1>Uploaded successfully</h1>"
"<a href=\"./\">Back</a>"
"</body>"
"</html>"
);
return true;
}
else {
ctx.statusCode= Tesses::Framework::Http::BadRequest;
ctx.WithMimeType("text/html")
.SendText(
"<!DOCTYPE html>"
"<html>"
"<head><title>AnonyDump - Error: Must contain multipart and POST</title>"
"<body>"
"<h1>Error: Must contain multipart and POST</h1>"
"<a href=\"./\">Back</a>"
"<h1>AnonyDrop</h1>"
"<a href=\"./files/\">Files</a>"
"<form action=\"./upload\" method=\"post\" "
"enctype=\"multipart/form-data\" accept-charset=\"UTF-8\">"
"<input type=\"file\" name=\"file\" multiple>"
"<input type=\"submit\" value=\"Upload\">"
"</form>"
"</body>"
"</html>"
);
"</html>");
return true;
} else if (ctx.path == "/upload") {
if (ctx.NeedToParseFormData()) {
ctx.ParseFormData(
[](std::string mime, std::string filename,
std::string name) -> std::shared_ptr<Stream> {
if (name != "file")
return nullptr;
VFSPath path("/" + filename);
auto strm = vfs->OpenFile(path, "wb");
return strm;
});
ctx.WithMimeType("text/html")
.SendText("<!DOCTYPE html>"
"<html>"
"<head><meta name=\"color-scheme\" "
"content=\"dark light\"><title>AnonyDrop - "
"Uploaded successfully</title></head>"
"<body>"
"<h1>Uploaded successfully</h1>"
"<a href=\"./\">Back</a>"
"</body>"
"</html>");
return true;
} else {
ctx.statusCode = Tesses::Framework::Http::BadRequest;
ctx.WithMimeType("text/html")
.SendText("<!DOCTYPE html>"
"<html>"
"<head><title>AnonyDump - Error: Must contain "
"multipart and POST</title>"
"<body>"
"<h1>Error: Must contain multipart and POST</h1>"
"<a href=\"./\">Back</a>"
"</form>"
"</body>"
"</html>");
}
}
return false;
});
auto mountable = std::make_shared<Tesses::Framework::Http::MountableServer>(cb);
mountable->Mount("/files/",std::make_shared<FileServer>(vfs,true,false));
auto mountable =
std::make_shared<Tesses::Framework::Http::MountableServer>(cb);
mountable->Mount("/files/", std::make_shared<FileServer>(vfs, true, false));
HttpServer srv(4985,mountable);
HttpServer srv(4985, mountable);
srv.StartAccepting();
TF_RunEventLoop();

View File

@@ -1,15 +1,17 @@
#include "TessesFramework/TessesFramework.hpp"
int main(int argc, char** argv)
{
if(argc < 4)
{
std::cout << "USAGE: " << argv[0] << " BINARYFILE VARNAME HEADERFILE" << std::endl;
int main(int argc, char **argv) {
if (argc < 4) {
std::cout << "USAGE: " << argv[0] << " BINARYFILE VARNAME HEADERFILE"
<< std::endl;
return 0;
}
auto fs=std::make_shared<Tesses::Framework::Streams::FileStream>(argv[1],"rb");
if(!fs->CanRead()) return 1;
auto writer = std::make_shared<Tesses::Framework::TextStreams::StreamWriter>(argv[3]);
auto fs =
std::make_shared<Tesses::Framework::Streams::FileStream>(argv[1], "rb");
if (!fs->CanRead())
return 1;
auto writer =
std::make_shared<Tesses::Framework::TextStreams::StreamWriter>(argv[3]);
Tesses::Framework::Text::GenerateCHeaderFile(fs, argv[2], writer);
return 0;
}

View File

@@ -3,20 +3,18 @@ using namespace Tesses::Framework;
using namespace Tesses::Framework::BitTorrent;
using namespace Tesses::Framework::Serialization::Bencode;
using namespace Tesses::Framework::Filesystem;
int main(int argc, char** argv)
{
int main(int argc, char **argv) {
TF_Init();
if(argc < 2)
{
printf("USAGE: %s torrent_file\n",argv[0]);
if (argc < 2) {
printf("USAGE: %s torrent_file\n", argv[0]);
return 1;
}
auto strm = LocalFS->OpenFile((std::string)argv[1],"rb");
auto strm = LocalFS->OpenFile((std::string)argv[1], "rb");
auto data = Bencode::Load(strm);
if(std::holds_alternative<BeDictionary>(data)){
std::get<BeDictionary>(data).SetValue("url-list",BeUndefined());
if (std::holds_alternative<BeDictionary>(data)) {
std::get<BeDictionary>(data).SetValue("url-list", BeUndefined());
}
strm = LocalFS->OpenFile((std::string)argv[1],"wb");
Bencode::Save(strm,data);
strm = LocalFS->OpenFile((std::string)argv[1], "wb");
Bencode::Save(strm, data);
return 0;
}

View File

@@ -2,44 +2,34 @@
using namespace Tesses::Framework::Streams;
using namespace Tesses::Framework::Serialization::Json;
using namespace Tesses::Framework::TextStreams;
std::shared_ptr<FileStream> OpenWrite(std::string dest)
{
if(dest == "-")
{
return std::make_shared<FileStream>(stdout,false,"w");
}
else
{
auto strm = std::make_shared<FileStream>(dest,"w");
if(!strm->CanWrite())
{
std::shared_ptr<FileStream> OpenWrite(std::string dest) {
if (dest == "-") {
return std::make_shared<FileStream>(stdout, false, "w");
} else {
auto strm = std::make_shared<FileStream>(dest, "w");
if (!strm->CanWrite()) {
return nullptr;
}
return strm;
}
}
std::shared_ptr<FileStream> OpenRead(std::string src)
{
if(src == "-")
{
return std::make_shared<FileStream>(stdin,false,"r");
}
else
{
auto strm = std::make_shared<FileStream>(src,"r");
if(!strm->CanRead())
{
std::shared_ptr<FileStream> OpenRead(std::string src) {
if (src == "-") {
return std::make_shared<FileStream>(stdin, false, "r");
} else {
auto strm = std::make_shared<FileStream>(src, "r");
if (!strm->CanRead()) {
return nullptr;
}
return strm;
}
}
int main(int argc, char** argv)
{
if(argc < 3)
{
int main(int argc, char **argv) {
if (argc < 3) {
std::cout << "USAGE: " << argv[0] << " SRC DEST" << std::endl;
std::cout << "SRC: doc json file or - for stdin to convert to pretty json" << std::endl;
std::cout
<< "SRC: doc json file or - for stdin to convert to pretty json"
<< std::endl;
std::cout << "DEST: prettied file or - for stdout" << std::endl;
return 0;
}
@@ -47,14 +37,12 @@ int main(int argc, char** argv)
auto dest = OpenWrite(argv[2]);
if(src == nullptr)
{
if (src == nullptr) {
std::cerr << "ERROR: Input could not be read" << std::endl;
return 1;
}
if(dest == nullptr)
{
if (dest == nullptr) {
std::cerr << "ERROR: Output could not be read" << std::endl;
return 1;
}
@@ -65,6 +53,5 @@ int main(int argc, char** argv)
auto str = reader.ReadToEnd();
writer.WriteLine(Json::Encode(Json::DocDecode(str)));
return 0;
}

View File

@@ -3,25 +3,22 @@
using namespace Tesses::Framework;
using namespace Tesses::Framework::Streams;
using namespace Tesses::Framework::Http;
int main(int argc, char** argv)
{
if(argc < 3)
{
printf("USAGE: %s <url> <path>\n",argv[0]);
printf("USAGE: %s <unixSocket> <url> <path>\n",argv[0]);
int main(int argc, char **argv) {
if (argc < 3) {
printf("USAGE: %s <url> <path>\n", argv[0]);
printf("USAGE: %s <unixSocket> <url> <path>\n", argv[0]);
return 1;
}
if(argc >= 4)
{
if (argc >= 4) {
std::string unixSocket = argv[1];
std::string url = argv[2];
std::string path = argv[3];
Tesses::Framework::Http::DownloadUnixSocketToFileSimple(unixSocket,url,path);
}
else {
std::string path = argv[3];
Tesses::Framework::Http::DownloadUnixSocketToFileSimple(unixSocket, url,
path);
} else {
std::string path = argv[2];
Tesses::Framework::Http::DownloadToFileSimple(argv[1],path);
Tesses::Framework::Http::DownloadToFileSimple(argv[1], path);
}
return 0;
}

View File

@@ -6,121 +6,106 @@ using namespace Tesses::Framework::Streams;
using namespace Tesses::Framework::TextStreams;
using namespace Tesses::Framework::Threading;
void print_help(const char* name)
{
printf("Tesses FileServer\nUSAGE: %s [OPTIONS] <dir>\n",name);
printf("OPTIONS:\n-p PORT, --port PORT: Change port from 9852\n-l, --listing: Enable listing\n-s, --spa: Enable SPA mode (send \"/\" body instead of not found)\n-c, --cgi-bin: Enable cgi (common gateway interface) support (specify a folder like /cgi-bin)\n-a, --cgi-admin: cgi admin email\n-w, --cgi-working: working directory for cgi scripts\n-h, --help: This Screen\n");
void print_help(const char *name) {
printf("Tesses FileServer\nUSAGE: %s [OPTIONS] <dir>\n", name);
printf("OPTIONS:\n-p PORT, --port PORT: Change port from 9852\n-l, "
"--listing: Enable listing\n-s, --spa: Enable SPA mode (send \"/\" "
"body instead of not found)\n-c, --cgi-bin: Enable cgi (common "
"gateway interface) support (specify a folder like /cgi-bin)\n-a, "
"--cgi-admin: cgi admin email\n-w, --cgi-working: working directory "
"for cgi scripts\n-h, --help: This Screen\n");
exit(1);
}
int main(int argc, char** argv)
{
int main(int argc, char **argv) {
try {
TF_InitWithConsole();
TF_LOG("INIT");
const char* directory = "wwwroot";
bool spa=false;
bool allowListing = false;
std::optional<std::string> cgi_bin;
std::optional<std::string> cgi_admin;
std::optional<Tesses::Framework::Filesystem::VFSPath> cgi_workdir;
uint16_t port = 9852L;
for(int i = 1; i < argc; i++)
{
if(strcmp(argv[i],"--help") == 0 || strcmp(argv[i],"-h") == 0)
{
print_help(argv[0]);
}
else if(strcmp(argv[i], "-c") == 0 || strcmp(argv[i],"--cgi-bin") == 0)
{
if(i+1>=argc)
{
printf("ERROR: Not enough arguments for cgi-bin\n");
print_help(argv[0]);
}
else {
printf("CGI is enabled\n");
cgi_bin = argv[++i];
}
}
else if(strcmp(argv[i], "-a") == 0 || strcmp(argv[i],"--cgi-admin") == 0)
{
if(i+1>=argc)
{
printf("ERROR: Not enough arguments for cgi-admin\n");
print_help(argv[0]);
}
else {
cgi_admin = argv[++i];
}
}
else if(strcmp(argv[i], "-w") == 0 || strcmp(argv[i],"--cgi-working") == 0)
{
if(i+1>=argc)
{
printf("ERROR: Not enough arguments for cgi-working\n");
print_help(argv[0]);
}
else {
cgi_workdir = (Tesses::Framework::Filesystem::VFSPath)argv[++i];
}
}
else if(strcmp(argv[i], "-l") == 0 || strcmp(argv[i], "--listing") == 0)
{
allowListing = true;
}
else if(strcmp(argv[i],"-s") == 0 || strcmp(argv[i],"--spa") == 0)
{
spa=true;
}
else if(strcmp(argv[i],"-p") == 0 || strcmp(argv[i],"--port") == 0)
{
if(i+1>=argc)
{
printf("ERROR: Not enough arguments for PORT\n");
print_help(argv[0]);
}
else
{
TF_InitWithConsole();
TF_LOG("INIT");
const char *directory = "wwwroot";
bool spa = false;
bool allowListing = false;
std::optional<std::string> cgi_bin;
std::optional<std::string> cgi_admin;
std::optional<Tesses::Framework::Filesystem::VFSPath> cgi_workdir;
uint16_t port = 9852L;
port = (uint16_t)std::stoul(argv[++i]);
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-h") == 0) {
print_help(argv[0]);
} else if (strcmp(argv[i], "-c") == 0 ||
strcmp(argv[i], "--cgi-bin") == 0) {
if (i + 1 >= argc) {
printf("ERROR: Not enough arguments for cgi-bin\n");
print_help(argv[0]);
} else {
printf("CGI is enabled\n");
cgi_bin = argv[++i];
}
} else if (strcmp(argv[i], "-a") == 0 ||
strcmp(argv[i], "--cgi-admin") == 0) {
if (i + 1 >= argc) {
printf("ERROR: Not enough arguments for cgi-admin\n");
print_help(argv[0]);
} else {
cgi_admin = argv[++i];
}
} else if (strcmp(argv[i], "-w") == 0 ||
strcmp(argv[i], "--cgi-working") == 0) {
if (i + 1 >= argc) {
printf("ERROR: Not enough arguments for cgi-working\n");
print_help(argv[0]);
} else {
cgi_workdir =
(Tesses::Framework::Filesystem::VFSPath)argv[++i];
}
}
else if (strcmp(argv[i], "-l") == 0 ||
strcmp(argv[i], "--listing") == 0) {
allowListing = true;
} else if (strcmp(argv[i], "-s") == 0 ||
strcmp(argv[i], "--spa") == 0) {
spa = true;
} else if (strcmp(argv[i], "-p") == 0 ||
strcmp(argv[i], "--port") == 0) {
if (i + 1 >= argc) {
printf("ERROR: Not enough arguments for PORT\n");
print_help(argv[0]);
} else {
port = (uint16_t)std::stoul(argv[++i]);
}
} else {
directory = argv[i];
}
}
else
{
directory = argv[i];
}
}
std::cout << "In folder: " << std::filesystem::absolute(directory).string() << std::endl;
std::shared_ptr<IHttpServer> http;
auto fs = std::make_shared<FileServer>(directory,allowListing, spa);
if(cgi_bin)
{
Tesses::Framework::Filesystem::VFSPath dir = *cgi_bin;
dir.relative = true;
auto svr = std::make_shared<MountableServer>(fs);
auto cgi = std::make_shared<CGIServer>(std::filesystem::absolute(directory).string() / dir);
cgi->adminEmail = cgi_admin;
cgi->workingDirectory = cgi_workdir;
svr->Mount(*cgi_bin, cgi);
http = svr;
}
else {
http = fs;
}
HttpServer server(port,http);
server.StartAccepting();
TF_RunEventLoop();
std::cout << "Closing server" << std::endl;
TF_Quit();
}catch(std::exception& ex)
{
TF_LOG(ex.what());
}
std::cout << "In folder: "
<< std::filesystem::absolute(directory).string() << std::endl;
std::shared_ptr<IHttpServer> http;
auto fs = std::make_shared<FileServer>(directory, allowListing, spa);
if (cgi_bin) {
Tesses::Framework::Filesystem::VFSPath dir = *cgi_bin;
dir.relative = true;
auto svr = std::make_shared<MountableServer>(fs);
auto cgi = std::make_shared<CGIServer>(
std::filesystem::absolute(directory).string() / dir);
cgi->adminEmail = cgi_admin;
cgi->workingDirectory = cgi_workdir;
svr->Mount(*cgi_bin, cgi);
http = svr;
} else {
http = fs;
}
HttpServer server(port, http);
server.StartAccepting();
TF_RunEventLoop();
std::cout << "Closing server" << std::endl;
TF_Quit();
} catch (std::exception &ex) {
TF_LOG(ex.what());
}
return 0;
}

View File

@@ -2,44 +2,33 @@
using namespace Tesses::Framework::Streams;
using namespace Tesses::Framework::Serialization::Json;
using namespace Tesses::Framework::TextStreams;
std::shared_ptr<FileStream> OpenWrite(std::string dest)
{
if(dest == "-")
{
return std::make_shared<FileStream>(stdout,false,"w");
}
else
{
auto strm = std::make_shared<FileStream>(dest,"w");
if(!strm->CanWrite())
{
std::shared_ptr<FileStream> OpenWrite(std::string dest) {
if (dest == "-") {
return std::make_shared<FileStream>(stdout, false, "w");
} else {
auto strm = std::make_shared<FileStream>(dest, "w");
if (!strm->CanWrite()) {
return nullptr;
}
return strm;
}
}
std::shared_ptr<FileStream> OpenRead(std::string src)
{
if(src == "-")
{
return std::make_shared<FileStream>(stdin,false,"r");
}
else
{
auto strm = std::make_shared<FileStream>(src,"r");
if(!strm->CanRead())
{
std::shared_ptr<FileStream> OpenRead(std::string src) {
if (src == "-") {
return std::make_shared<FileStream>(stdin, false, "r");
} else {
auto strm = std::make_shared<FileStream>(src, "r");
if (!strm->CanRead()) {
return nullptr;
}
return strm;
}
}
int main(int argc, char** argv)
{
if(argc < 3)
{
int main(int argc, char **argv) {
if (argc < 3) {
std::cout << "USAGE: " << argv[0] << " SRC DEST" << std::endl;
std::cout << "SRC: json file or - for stdin to convert to json doc" << std::endl;
std::cout << "SRC: json file or - for stdin to convert to json doc"
<< std::endl;
std::cout << "DEST: json doc file or - for stdout" << std::endl;
return 0;
}
@@ -47,14 +36,12 @@ int main(int argc, char** argv)
auto dest = OpenWrite(argv[2]);
if(src == nullptr)
{
if (src == nullptr) {
std::cerr << "ERROR: Input could not be read" << std::endl;
return 1;
}
if(dest == nullptr)
{
if (dest == nullptr) {
std::cerr << "ERROR: Output could not be read" << std::endl;
return 1;
}
@@ -68,6 +55,5 @@ int main(int argc, char** argv)
TryGetJToken(doc, docLs);
writer.WriteLine(Json::DocEncode(docLs));
return 0;
}

View File

@@ -2,44 +2,33 @@
using namespace Tesses::Framework::Streams;
using namespace Tesses::Framework::Serialization::Json;
using namespace Tesses::Framework::TextStreams;
std::shared_ptr<FileStream> OpenWrite(std::string dest)
{
if(dest == "-")
{
return std::make_shared<FileStream>(stdout,false,"w");
}
else
{
auto strm = std::make_shared<FileStream>(dest,"w");
if(!strm->CanWrite())
{
std::shared_ptr<FileStream> OpenWrite(std::string dest) {
if (dest == "-") {
return std::make_shared<FileStream>(stdout, false, "w");
} else {
auto strm = std::make_shared<FileStream>(dest, "w");
if (!strm->CanWrite()) {
return nullptr;
}
return strm;
}
}
std::shared_ptr<FileStream> OpenRead(std::string src)
{
if(src == "-")
{
return std::make_shared<FileStream>(stdin,false,"r");
}
else
{
auto strm = std::make_shared<FileStream>(src,"r");
if(!strm->CanRead())
{
std::shared_ptr<FileStream> OpenRead(std::string src) {
if (src == "-") {
return std::make_shared<FileStream>(stdin, false, "r");
} else {
auto strm = std::make_shared<FileStream>(src, "r");
if (!strm->CanRead()) {
return nullptr;
}
return strm;
}
}
int main(int argc, char** argv)
{
if(argc < 3)
{
int main(int argc, char **argv) {
if (argc < 3) {
std::cout << "USAGE: " << argv[0] << " SRC DEST" << std::endl;
std::cout << "SRC: json file or - for stdin to make pretty" << std::endl;
std::cout << "SRC: json file or - for stdin to make pretty"
<< std::endl;
std::cout << "DEST: prettied file or - for stdout" << std::endl;
return 0;
}
@@ -47,14 +36,12 @@ int main(int argc, char** argv)
auto dest = OpenWrite(argv[2]);
if(src == nullptr)
{
if (src == nullptr) {
std::cerr << "ERROR: Input could not be read" << std::endl;
return 1;
}
if(dest == nullptr)
{
if (dest == nullptr) {
std::cerr << "ERROR: Output could not be read" << std::endl;
return 1;
}
@@ -65,6 +52,5 @@ int main(int argc, char** argv)
auto str = reader.ReadToEnd();
writer.WriteLine(Json::Encode(Json::Decode(str)));
return 0;
}

View File

@@ -2,44 +2,33 @@
using namespace Tesses::Framework::Streams;
using namespace Tesses::Framework::Serialization::Json;
using namespace Tesses::Framework::TextStreams;
std::shared_ptr<FileStream> OpenWrite(std::string dest)
{
if(dest == "-")
{
return std::make_shared<FileStream>(stdout,false,"w");
}
else
{
auto strm = std::make_shared<FileStream>(dest,"w");
if(!strm->CanWrite())
{
std::shared_ptr<FileStream> OpenWrite(std::string dest) {
if (dest == "-") {
return std::make_shared<FileStream>(stdout, false, "w");
} else {
auto strm = std::make_shared<FileStream>(dest, "w");
if (!strm->CanWrite()) {
return nullptr;
}
return strm;
}
}
std::shared_ptr<FileStream> OpenRead(std::string src)
{
if(src == "-")
{
return std::make_shared<FileStream>(stdin,false,"r");
}
else
{
auto strm = std::make_shared<FileStream>(src,"r");
if(!strm->CanRead())
{
std::shared_ptr<FileStream> OpenRead(std::string src) {
if (src == "-") {
return std::make_shared<FileStream>(stdin, false, "r");
} else {
auto strm = std::make_shared<FileStream>(src, "r");
if (!strm->CanRead()) {
return nullptr;
}
return strm;
}
}
int main(int argc, char** argv)
{
if(argc < 3)
{
int main(int argc, char **argv) {
if (argc < 3) {
std::cout << "USAGE: " << argv[0] << " SRC DEST" << std::endl;
std::cout << "SRC: json file or - for stdin to make unpretty" << std::endl;
std::cout << "SRC: json file or - for stdin to make unpretty"
<< std::endl;
std::cout << "DEST: unprettied file or - for stdout" << std::endl;
return 0;
}
@@ -47,14 +36,12 @@ int main(int argc, char** argv)
auto dest = OpenWrite(argv[2]);
if(src == nullptr)
{
if (src == nullptr) {
std::cerr << "ERROR: Input could not be read" << std::endl;
return 1;
}
if(dest == nullptr)
{
if (dest == nullptr) {
std::cerr << "ERROR: Output could not be read" << std::endl;
return 1;
}
@@ -63,8 +50,7 @@ int main(int argc, char** argv)
StreamWriter writer(dest);
auto str = reader.ReadToEnd();
writer.WriteLine(Json::Encode(Json::Decode(str),false));
writer.WriteLine(Json::Encode(Json::Decode(str), false));
return 0;
}

View File

@@ -1,9 +1,7 @@
#include "TessesFramework/TessesFramework.hpp"
int main(int argc, char** argv)
{
if(argc < 2)
{
int main(int argc, char **argv) {
if (argc < 2) {
std::cout << "USAGE: " << argv[0] << " times" << std::endl;
std::cout << "USAGE: " << argv[0] << " times max" << std::endl;
@@ -11,25 +9,19 @@ int main(int argc, char** argv)
return 0;
}
Tesses::Framework::Random random;
int times=std::atoi(argv[1]);
if(argc > 2)
{
int times = std::atoi(argv[1]);
if (argc > 2) {
int32_t min = 0;
int32_t max = std::stoi(argv[2]);
if(argc > 3)
{
if (argc > 3) {
min = max;
max = std::stoi(argv[3]);
}
for(int i = 0; i < times; i++)
{
std::cout << random.Next(min,max) << std::endl;
for (int i = 0; i < times; i++) {
std::cout << random.Next(min, max) << std::endl;
}
}
else {
for(int i = 0; i < times; i++)
{
} else {
for (int i = 0; i < times; i++) {
std::cout << random.Next() << std::endl;
}
}

View File

@@ -1,124 +1,110 @@
#include "TessesFramework/TessesFramework.hpp"
#include "TessesFramework/Platform/Process.hpp"
#include "TessesFramework/TessesFramework.hpp"
using namespace Tesses::Framework;
using namespace Tesses::Framework::Platform;
using namespace Tesses::Framework::TextStreams;
using namespace Tesses::Framework::Filesystem;
void split_command(std::string cmd, std::vector<std::string>& args)
{
bool inStr=false;
std::string cur={};
auto flush=[&]()->void {
if(cur.empty()) return;
void split_command(std::string cmd, std::vector<std::string> &args) {
bool inStr = false;
std::string cur = {};
auto flush = [&]() -> void {
if (cur.empty())
return;
args.push_back(cur);
cur={};
cur = {};
};
for(size_t i = 0; i < cmd.size(); i++)
{
if(inStr)
{
if(cmd[i] == '\"') inStr=false;
else if(cmd[i] == '\\')
{
for (size_t i = 0; i < cmd.size(); i++) {
if (inStr) {
if (cmd[i] == '\"')
inStr = false;
else if (cmd[i] == '\\') {
i++;
if(i < cmd.size())
{
if (i < cmd.size()) {
cmd.push_back(cmd[i]);
}
}
else cur.push_back(cmd[i]);
}
else
{
if(cmd[i] == ' ') flush();
else if(cmd[i] == '\"') {
inStr=true;
}
else {
} else
cur.push_back(cmd[i]);
} else {
if (cmd[i] == ' ')
flush();
else if (cmd[i] == '\"') {
inStr = true;
} else {
cur.push_back(cmd[i]);
}
}
}
flush();
}
int main(int argc,char** argv)
{
int main(int argc, char **argv) {
TF_Init();
while(true)
{
std::cout << VFSPath::GetAbsoluteCurrentDirectory().ToString() << "$ ";
while (true) {
std::cout << VFSPath::GetAbsoluteCurrentDirectory().ToString() << "$ ";
std::string text;
StdIn().ReadLine(text);
std::vector<std::string> args;
split_command(text,args);
if(args.empty()) continue;
if(args[0] == "exit") break;
else if(args[0] == "echo") { if(args.size() > 1) std::cout << args[1] << std::endl;}
else if(args[0] == "cd") {
if(args.size() < 2)
{
VFSPath::SetAbsoluteCurrentDirectory(Environment::SpecialFolders::GetHomeFolder());
}
else {
split_command(text, args);
if (args.empty())
continue;
if (args[0] == "exit")
break;
else if (args[0] == "echo") {
if (args.size() > 1)
std::cout << args[1] << std::endl;
} else if (args[0] == "cd") {
if (args.size() < 2) {
VFSPath::SetAbsoluteCurrentDirectory(
Environment::SpecialFolders::GetHomeFolder());
} else {
VFSPath::SetAbsoluteCurrentDirectory(args[1]);
}
}
else if(args[0] == "printargs")
{
for(size_t i = 1; i < args.size(); i++)
{
std::cout << "\"" << Http::HttpUtils::Replace(args[i],"\"","\\\"") << "\"" << std::endl;
} else if (args[0] == "printargs") {
for (size_t i = 1; i < args.size(); i++) {
std::cout << "\""
<< Http::HttpUtils::Replace(args[i], "\"", "\\\"")
<< "\"" << std::endl;
}
}
else if (args[0] == "sigtermtest")
{
if (args.size() < 2) continue;
} else if (args[0] == "sigtermtest") {
if (args.size() < 2)
continue;
std::vector<std::string> args2(args.begin() + 1, args.end());
auto path = Environment::GetRealExecutablePath(args2[0]);
Platform::Process p(path.ToString(), args2);
if (p.Start())
{
if (p.Start()) {
std::cout << "Press enter to sigterm" << std::endl;
StdIn().ReadLine();
p.Kill(SIGTERM);
}
}
else if(args[0] == "rstdi")
{
if(args.size()<3) continue;
std::vector<std::string> args2(args.begin()+2,args.end());
auto f = LocalFS->OpenFile(args[1],"rb");
if(f != nullptr)
{
} else if (args[0] == "rstdi") {
if (args.size() < 3)
continue;
std::vector<std::string> args2(args.begin() + 2, args.end());
auto f = LocalFS->OpenFile(args[1], "rb");
if (f != nullptr) {
auto path = Environment::GetRealExecutablePath(args2[0]);
Platform::Process p(path.ToString(),args2);
p.redirectStdIn=true;
if(p.Start())
{
Platform::Process p(path.ToString(), args2);
p.redirectStdIn = true;
if (p.Start()) {
auto strm = p.GetStdinStream();
f->CopyTo(strm);
p.CloseStdInNow();
p.WaitForExit();
}
}
}
else {
} else {
auto path = Environment::GetRealExecutablePath(args[0]);
Platform::Process p(path.ToString(),args);
Platform::Process p(path.ToString(), args);
if (p.Start())
p.WaitForExit();
p.WaitForExit();
else
std::cout << "Failed To Run Process: " << path.ToString() << std::endl;
std::cout << "Failed To Run Process: " << path.ToString()
<< std::endl;
}
}

View File

@@ -3,15 +3,12 @@
using namespace Tesses::Framework;
using namespace Tesses::Framework::Date;
int main(int argc, char** argv)
{
int main(int argc, char **argv) {
TF_Init();
DateTime dt=DateTime::Now();
//dt = dt.ToLocal();
if(argc > 1)
{
if(strcmp(argv[1],"--help") == 0)
{
DateTime dt = DateTime::Now();
// dt = dt.ToLocal();
if (argc > 1) {
if (strcmp(argv[1], "--help") == 0) {
/*
case 'r':
{
@@ -34,15 +31,15 @@ int main(int argc, char** argv)
break;
case 'T':
{
text.append(Http::HttpUtils::LeftPad(std::to_string(hour),2,'0'));
text.push_back(':');
text.append(Http::HttpUtils::LeftPad(std::to_string(minute),2,'0'));
text.push_back(':');
text.append(Http::HttpUtils::LeftPad(std::to_string(second),2,'0'));
}
break;
case 'u':
{
@@ -53,7 +50,7 @@ int main(int argc, char** argv)
break;
case 'w':
{
text.append(std::to_string(weekday));
}
break;
@@ -72,14 +69,13 @@ int main(int argc, char** argv)
text.append(Http::HttpUtils::LeftPad(std::to_string(second),2,'0'));
text.push_back(' ');
text.append(Http::HttpUtils::LeftPad(std::to_string(year),4,'0'));
}
break;
case 'C':
text.append(Http::HttpUtils::LeftPad(std::to_string(year / 100),2,'0'));
break;
case 'Y':
text.append(Http::HttpUtils::LeftPad(std::to_string(year
/ 100),2,'0')); break; case 'Y':
text.append(Http::HttpUtils::LeftPad(std::to_string(year),4,'0'));
break;
case 'p':
@@ -90,7 +86,7 @@ int main(int argc, char** argv)
auto hours = hour % 12;
if(hours == 0) hours=12;
text.append(Http::HttpUtils::LeftPad(std::to_string(hours),2,'0'));
}
}
break;
case 'h':
case 'b':
@@ -110,24 +106,37 @@ int main(int argc, char** argv)
break;
*/
std::cout << argv[0] << " <fmt>" << std::endl;
std::cout << "The fmt is for DateTime::ToString(fmt) just like strftime but just these are supported:" << std::endl;
std::cout << "%a: weekday short eg " << dt.ToString("%a") << std::endl;
std::cout << "%A: weekday long eg " << dt.ToString("%A") << std::endl;
std::cout << "%S: seconds with leading zeros eg " << dt.ToString("%S") << std::endl;
std::cout << "%m: month with leading zeros eg " << dt.ToString("%m") << std::endl;
std::cout << "%d: day with leading zeros eg " << dt.ToString("%d") << std::endl;
std::cout << "%e: day with leading spaces eg " << dt.ToString("%e") << std::endl;
std::cout << "%M: minute with leading zeros eg " << dt.ToString("%M") << std::endl;
std::cout << "%H: 24 hour with leading zeros eg " << dt.ToString("%H") << std::endl;
std::cout << "%F: %Y-%m-%d like this " << dt.ToString("%F") << std::endl;
std::cout << "%D: %m/%d/%y like this " << dt.ToString("%D") << std::endl;
std::cout << "%y: year two digits eg " << dt.ToString("%y") << std::endl;
std::cout << "%Y: year four digits eg " << dt.ToString("%Y") << std::endl;
std::cout << "The fmt is for DateTime::ToString(fmt) just like "
"strftime but just these are supported:"
<< std::endl;
std::cout << "%a: weekday short eg " << dt.ToString("%a")
<< std::endl;
std::cout << "%A: weekday long eg " << dt.ToString("%A")
<< std::endl;
std::cout << "%S: seconds with leading zeros eg "
<< dt.ToString("%S") << std::endl;
std::cout << "%m: month with leading zeros eg " << dt.ToString("%m")
<< std::endl;
std::cout << "%d: day with leading zeros eg " << dt.ToString("%d")
<< std::endl;
std::cout << "%e: day with leading spaces eg " << dt.ToString("%e")
<< std::endl;
std::cout << "%M: minute with leading zeros eg "
<< dt.ToString("%M") << std::endl;
std::cout << "%H: 24 hour with leading zeros eg "
<< dt.ToString("%H") << std::endl;
std::cout << "%F: %Y-%m-%d like this " << dt.ToString("%F")
<< std::endl;
std::cout << "%D: %m/%d/%y like this " << dt.ToString("%D")
<< std::endl;
std::cout << "%y: year two digits eg " << dt.ToString("%y")
<< std::endl;
std::cout << "%Y: year four digits eg " << dt.ToString("%Y")
<< std::endl;
return 1;
}
std::cout << dt.ToString(argv[1]) << std::endl;
}
else
std::cout << dt.ToString() << std::endl;
} else
std::cout << dt.ToString() << std::endl;
return 0;
}

View File

@@ -6,61 +6,67 @@ using namespace Tesses::Framework::Filesystem;
using namespace Tesses::Framework::Serialization::Bencode;
using namespace Tesses::Framework::TextStreams;
using namespace Tesses::Framework::BitTorrent;
void usage(Args& args)
{
std::cout << "USAGE: " << args.filename << " [options] torrent_contents torrent_file.torrent" << std::endl << std::endl;
void usage(Args &args) {
std::cout << "USAGE: " << args.filename
<< " [options] torrent_contents torrent_file.torrent" << std::endl
<< std::endl;
std::cout << "OPTIONS:" << std::endl;
std::cout << "tracker: torrent tracker url (require at least one)" << std::endl;
std::cout << "tracker: torrent tracker url (require at least one)"
<< std::endl;
std::cout << "webseed: url for web seeding" << std::endl;
std::cout << "comment: set the comment" << std::endl;
std::cout << "created_by: set the created by field, defaults to TessesFrameworkTorrent" << std::endl;
std::cout << "piece_length: set the piece length, defaults to " + std::to_string(DEFAULT_PIECE_LENGTH) << std::endl << std::endl;
std::cout << "created_by: set the created by field, defaults to "
"TessesFrameworkTorrent"
<< std::endl;
std::cout << "piece_length: set the piece length, defaults to " +
std::to_string(DEFAULT_PIECE_LENGTH)
<< std::endl
<< std::endl;
std::cout << "FLAGS:" << std::endl;
std::cout << "help: bring this help message up" << std::endl;
std::cout << "private: enable private tracker flag" << std::endl;
exit(1);
}
int main(int argc, char** argv)
{
int main(int argc, char **argv) {
TF_Init();
std::vector<BeString> webseeds;
std::vector<BeString> trackers;
bool isPrivate=false;
bool isPrivate = false;
int64_t pieceLength = DEFAULT_PIECE_LENGTH;
std::string comment="";
std::string comment = "";
std::string created_by = "TessesFrameworkTorrent";
Args args(argc, argv);
if(args.positional.size() < 2)
if (args.positional.size() < 2)
usage(args);
for(auto& opt : args.options)
{
if(opt.first == "tracker")
for (auto &opt : args.options) {
if (opt.first == "tracker")
trackers.push_back(opt.second);
else if(opt.first == "webseed")
else if (opt.first == "webseed")
webseeds.push_back(opt.second);
else if(opt.first == "comment")
else if (opt.first == "comment")
comment = opt.second;
else if(opt.first == "created_by")
else if (opt.first == "created_by")
created_by = opt.second;
else if(opt.first == "piece_length")
else if (opt.first == "piece_length")
pieceLength = std::stoll(opt.second);
}
for(auto& flag : args.flags)
{
if(flag == "help")
for (auto &flag : args.flags) {
if (flag == "help")
usage(args);
if(flag == "private")
if (flag == "private")
isPrivate = true;
}
if(trackers.empty())
if (trackers.empty())
usage(args);
{
auto torrent_file_stream = LocalFS->OpenFile(args.positional[1],"wb");
TorrentFile::CreateTorrent(torrent_file_stream,trackers,webseeds,LocalFS, args.positional[0], isPrivate, pieceLength, comment, created_by);
auto torrent_file_stream = LocalFS->OpenFile(args.positional[1], "wb");
TorrentFile::CreateTorrent(torrent_file_stream, trackers, webseeds,
LocalFS, args.positional[0], isPrivate,
pieceLength, comment, created_by);
}
return 0;
}

View File

@@ -1,9 +1,8 @@
#include "TessesFramework/Uuid.hpp"
#include <iostream>
int main(int argc, char** argv)
{
//e794499c
int main(int argc, char **argv) {
// e794499c
using namespace Tesses::Framework;
Uuid uuid = Uuid::Generate();
@@ -20,5 +19,7 @@ int main(int argc, char** argv)
uuid.node[4] = 0xb4;
uuid.node[5] = 0xac;*/
std::cout << uuid.ToString(Tesses::Framework::UuidStringifyConfig::LowercaseNoCurly) << std::endl;
std::cout << uuid.ToString(
Tesses::Framework::UuidStringifyConfig::LowercaseNoCurly)
<< std::endl;
}

View File

@@ -4,18 +4,16 @@ using namespace Tesses::Framework;
using namespace Tesses::Framework::Filesystem;
using namespace Tesses::Framework::Filesystem::Literals;
int main(int argc, char** argv)
{
int main(int argc, char **argv) {
TF_Init();
if(argc<2)
{
if (argc < 2) {
std::cout << "USAGE " << argv[0] << " <file|dir>" << std::endl;
return 1;
}
auto watcher=FSWatcher::Create(LocalFS,VFSPath{argv[1]});
auto watcher = FSWatcher::Create(LocalFS, VFSPath{argv[1]});
watcher->events = FSWatcherEventType::All;
watcher->event = [](FSWatcherEvent& evt)->void{
watcher->event = [](FSWatcherEvent &evt) -> void {
std::cout << evt.ToString() << std::endl;
};
watcher->SetEnabled(true);