From 55e85b31138494fb6d085c4aea37a50999df69af Mon Sep 17 00:00:00 2001 From: Alcaro Date: Fri, 20 Apr 2018 18:32:52 +0200 Subject: [PATCH] Allow using /dev/stderr as output under GTK, per #9 --- flips-cli.cpp | 62 +++------------------------------------------- flips-gtk.cpp | 7 +++++- flips.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++++++ global.h | 2 ++ profile/profile.sh | 7 ++---- 5 files changed, 75 insertions(+), 65 deletions(-) diff --git a/flips-cli.cpp b/flips-cli.cpp index 5c9f156..332b20b 100644 --- a/flips-cli.cpp +++ b/flips-cli.cpp @@ -1,69 +1,13 @@ //Module name: Floating IPS, command line frontend //Author: Alcaro -//Date: December 22, 2014 +//Date: See Git history //Licence: GPL v3.0 or higher #include "flips.h" #ifdef FLIPS_CLI -class file_libc : public file { - size_t size; - FILE* io; - -public: - static file* create(const char * filename) - { - FILE* f = fopen(filename, "rb"); - if (!f) return NULL; - return new file_libc(f); - } - -private: - file_libc(FILE* io) : io(io) - { - fseek(io, 0, SEEK_END); - size = ftell(io); - } - -public: - size_t len() { return size; } - - bool read(uint8_t* target, size_t start, size_t len) - { - fseek(io, start, SEEK_SET); - return (fread(target, 1,len, io) == len); - } - - ~file_libc() { fclose(io); } -}; - -file* file::create(const char * filename) { return file_libc::create(filename); } - - -class filewrite_libc : public filewrite { - FILE* io; - -public: - static filewrite* create(const char * filename) - { - FILE* f = fopen(filename, "wb"); - if (!f) return NULL; - return new filewrite_libc(f); - } - -private: - filewrite_libc(FILE* io) : io(io) {} - -public: - bool append(const uint8_t* data, size_t len) - { - return (fwrite(data, 1,len, io)==len); - } - - ~filewrite_libc() { fclose(io); } -}; - -filewrite* filewrite::create(const char * filename) { return filewrite_libc::create(filename); } +file* file::create(const char * filename) { return file::create_libc(filename); } +filewrite* filewrite::create(const char * filename) { return filewrite::create_libc(filename); } int main(int argc, char * argv[]) diff --git a/flips-gtk.cpp b/flips-gtk.cpp index cca1cb9..5c4fecf 100644 --- a/flips-gtk.cpp +++ b/flips-gtk.cpp @@ -84,7 +84,12 @@ public: ~filewrite_gtk() { g_object_unref(io); } }; -filewrite* filewrite::create(const char * filename) { return filewrite_gtk::create(filename); } +filewrite* filewrite::create(const char * filename) +{ + filewrite* ret = filewrite_gtk::create(filename); // g_file_create tries to create /.goutputstream-asdfghjkl + if (!ret) ret = filewrite::create_libc(filename); // if it fails (for example /dev/.goutputstream-foobar), try this instead + return ret; +} diff --git a/flips.cpp b/flips.cpp index 21d2f02..673a441 100644 --- a/flips.cpp +++ b/flips.cpp @@ -41,6 +41,68 @@ void FreeFileMemory(struct mem mem) +class file_libc : public file { + size_t size; + FILE* io; + +public: + static file* create(const char * filename) + { + FILE* f = fopen(filename, "rb"); + if (!f) return NULL; + return new file_libc(f); + } + +private: + file_libc(FILE* io) : io(io) + { + fseek(io, 0, SEEK_END); + size = ftell(io); + } + +public: + size_t len() { return size; } + + bool read(uint8_t* target, size_t start, size_t len) + { + fseek(io, start, SEEK_SET); + return (fread(target, 1,len, io) == len); + } + + ~file_libc() { fclose(io); } +}; +file* file::create_libc(const char * filename) { return file_libc::create(filename); } + + +class filewrite_libc : public filewrite { + FILE* io; + +public: + static filewrite* create(const char * filename) + { + FILE* f = fopen(filename, "wb"); + if (!f) return NULL; + return new filewrite_libc(f); + } + +private: + filewrite_libc(FILE* io) : io(io) {} + +public: + bool append(const uint8_t* data, size_t len) + { + return (fwrite(data, 1,len, io)==len); + } + + ~filewrite_libc() { fclose(io); } +}; + +filewrite* filewrite::create_libc(const char * filename) { return filewrite_libc::create(filename); } + + + + + LPWSTR GetExtension(LPCWSTR fname) { LPWSTR ptr1=(LPWSTR)fname; diff --git a/global.h b/global.h index d0034fb..ae8acbe 100644 --- a/global.h +++ b/global.h @@ -29,6 +29,7 @@ struct mem { class file { public: static file* create(LPCWSTR filename); + static file* create_libc(const char * filename); virtual size_t len() = 0; virtual bool read(uint8_t* target, size_t start, size_t len) = 0; @@ -43,6 +44,7 @@ public: class filewrite { public: static filewrite* create(LPCWSTR filename); + static filewrite* create_libc(const char * filename); virtual bool append(const uint8_t* data, size_t len) = 0; diff --git a/profile/profile.sh b/profile/profile.sh index 5222a6b..cf0da69 100755 --- a/profile/profile.sh +++ b/profile/profile.sh @@ -6,8 +6,5 @@ export OMP_NUM_THREADS=1 FX45=profile/firefox-45.0esr.tar FX52=profile/firefox-52.0esr.tar -#silly grep because GOutputStream can't write to /dev/null, so write fails -#the error is harmless, but confuses users, so let's hide it -#also ||true to mask Flips itself failing; doesn't really do anything, but no reason not to -$1 --create --bps-delta $FX45 $FX52 /dev/null | sed 's/.*read-only.*/The patch was created successfully!/' || true -$1 --create --bps-delta-moremem $FX45 $FX52 /dev/null | sed 's/.*read-only.*/The patch was created successfully!/' || true +$1 --create --bps-delta $FX45 $FX52 /dev/null +$1 --create --bps-delta-moremem $FX45 $FX52 /dev/null