Fix lacking code for limitation of pipe buf size

This commit is contained in:
jun7 2018-06-16 14:12:35 +09:00
parent cd76ec7d11
commit 8a85e3a2e4
2 changed files with 25 additions and 12 deletions

View File

@ -23,12 +23,12 @@ wyebab: ab.c ephy-uri-tester.c ephy-uri-tester.h librun.o makefile
librun.o: wyebrun.c wyebrun.h makefile librun.o: wyebrun.c wyebrun.h makefile
$(CC) $(CFLAGS) $(LDFLAGS) -c -o $@ $< -fPIC\ $(CC) $(CFLAGS) $(LDFLAGS) -c -o $@ $< -fPIC\
`pkg-config --cflags --libs glib-2.0` \ `pkg-config --cflags --libs glib-2.0` \
-DDEBUG=0 $(DDEBUG)
testrun: wyebrun.c wyebrun.h makefile testrun: wyebrun.c wyebrun.h makefile
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< \ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< \
`pkg-config --cflags --libs glib-2.0 gio-2.0` \ `pkg-config --cflags --libs glib-2.0 gio-2.0` \
-DDEBUG=1 -DDEBUG=1 -DTESTER=1
clean: clean:
rm -f adblock.so rm -f adblock.so

View File

@ -27,6 +27,7 @@ along with wyebrun. If not, see <http://www.gnu.org/licenses/>.
//monitor //monitor
#include <gio/gio.h> #include <gio/gio.h>
#include "wyebrun.h" #include "wyebrun.h"
#define ROOTNAME "wyebrun" #define ROOTNAME "wyebrun"
@ -98,23 +99,33 @@ static bool ipcsend(char *exe, char *name,
static GMutex m; static GMutex m;
g_mutex_lock(&m); g_mutex_lock(&m);
//D(ipcsend exe:%s name:%s, exe, name)
char *path = preparepp(exe, name); char *path = preparepp(exe, name);
char *esc = g_strescape(data ?: "", ""); char *esc = g_strescape(data ?: "", "");
D(ipcsend exe:%s name:%s type:%c sizs:%lu, exe, name, type, strlen(esc ?: ""))
char *line = g_strdup_printf("%c%s:%s\n", type, caller ?: "", esc); char *line = g_strdup_printf("%c%s:%s\n", type, caller ?: "", esc);
int len = strlen(line);
g_free(esc); g_free(esc);
bool ret = false;
int pp = open(path, O_WRONLY | O_NONBLOCK); int pp = open(path, O_WRONLY | O_NONBLOCK);
if (pp > -1)
bool ret = write(pp, line, strlen(line)) != -1; {
if (len > PIPE_BUF) //4096 => len is atomic
{
flock(pp, LOCK_EX);
fcntl(pp, F_SETFL, 0); //clear O_NONBLOCK to write len > 65536;
}
ret = write(pp, line, len) == len;
close(pp);
}
g_free(line); g_free(line);
close(pp);
g_free(path); g_free(path);
g_mutex_unlock(&m); g_mutex_unlock(&m);
D(ipcsend ret %d, ret)
return ret; return ret;
} }
@ -559,6 +570,7 @@ void wyebclient(char *exe)
//@ipccb //@ipccb
gboolean ipccb(GIOChannel *ch, GIOCondition c, gpointer p) gboolean ipccb(GIOChannel *ch, GIOCondition c, gpointer p)
{ {
//D(ipccb %c, svrexe ? 'S':'C')
char *line; char *line;
g_io_channel_read_line(ch, &line, NULL, NULL, NULL); g_io_channel_read_line(ch, &line, NULL, NULL, NULL);
if (!line) return true; if (!line) return true;
@ -570,8 +582,8 @@ gboolean ipccb(GIOChannel *ch, GIOCondition c, gpointer p)
g_strchomp(data); g_strchomp(data);
#if DEBUG #if DEBUG
// static int i = 0; static int i = 0;
// D(%c ipccb%d %c/%s/%s;, svrexe ? 'S':'C', i++, type ,id ,data) D(%c ipccb%d %c/%s/%lu;, svrexe ? 'S':'C', i++, type ,id, strlen(data))
#endif #endif
switch (type) { switch (type) {
@ -619,7 +631,7 @@ gboolean ipccb(GIOChannel *ch, GIOCondition c, gpointer p)
//test //test
#if DEBUG #if TESTER
static char *testdata(char *data) static char *testdata(char *data)
{ {
//sleep(9); //sleep(9);
@ -629,10 +641,11 @@ static char *testdata(char *data)
return g_strdup_printf("%d th test data. req is %s", ++i, data); return g_strdup_printf("%d th test data. req is %s", ++i, data);
} }
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
#if DEBUG
start = g_get_monotonic_time(); start = g_get_monotonic_time();
#endif
// gint64 now = g_get_monotonic_time(); // gint64 now = g_get_monotonic_time();
// D(time %ld %ld, now - start, now) // D(time %ld %ld, now - start, now)