mirror of
https://github.com/Alcaro/Flips.git
synced 2026-09-07 10:06:09 -05:00
Allow using /dev/stderr as output under GTK, per #9
This commit is contained in:
@@ -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[])
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
62
flips.cpp
62
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;
|
||||
|
||||
2
global.h
2
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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user