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