Allow using /dev/stderr as output under GTK, per #9

This commit is contained in:
Alcaro
2018-04-20 18:32:52 +02:00
parent a4274bf35a
commit 55e85b3113
5 changed files with 75 additions and 65 deletions

View File

@@ -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[])

View File

@@ -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 <dir>/.goutputstream-asdfghjkl
if (!ret) ret = filewrite::create_libc(filename); // if it fails (for example /dev/.goutputstream-foobar), try this instead
return ret;
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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