From 3df02058fb3d48a999bbc8d5d56c2910fbc249a4 Mon Sep 17 00:00:00 2001
From: Andreas Wacknitz <A.Wacknitz@gmx.de>
Date: Sun, 24 Mar 2024 23:37:14 +0100
Subject: [PATCH] meld: update to 3.22.2

---
 components/library/gamin/patches/01-FEN.patch |  149 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 138 insertions(+), 11 deletions(-)

diff --git a/components/library/gamin/patches/01-all.patch b/components/library/gamin/patches/01-FEN.patch
similarity index 93%
rename from components/library/gamin/patches/01-all.patch
rename to components/library/gamin/patches/01-FEN.patch
index 6221e5c..e68f126 100644
--- a/components/library/gamin/patches/01-all.patch
+++ b/components/library/gamin/patches/01-FEN.patch
@@ -1,3 +1,111 @@
+Solaris FEN support in Gamin
+
+https://bugzilla.gnome.org/show_bug.cgi?id=730679
+http://osdyson.org/issues/172
+http://hg.osdyson.org/solaris-desktop-spec-files/raw-file/8f7c0cd200a9/patches/gamin-01-all.diff
+
+Fixed issues after the initial integration:
+1) Using freed node_t pointer in node_add function.
+Mitigation: When a node is removed, we also remove all the events in the
+event queue that contain a reference to this node to avoid future memory errors.
+2) A missing call to node_lstat before calling port_add function.
+When the system is under load, the timing of callbacks might cause that port_add is
+called on a node which access, change, and modification time was not read/updated.
+Mitigation: Call node_lstat before port_add in node_add_event function.
+
+diff --git a/configure.in b/configure.in
+index e4b684e..5836bb7 100644
+--- a/configure.in
++++ b/configure.in
+@@ -42,6 +42,12 @@ if test -z "$ENV_CFLAGS"; then
+ 	CFLAGS=""
+ fi
+ 
++dnl If the user set no CFLAGS, then don't assume the autotools defaults of
++dnl "-g -O2". We set default CFLAGS later based on the --disable-debug flag.
++if test -z "$ENV_CFLAGS"; then
++	CFLAGS=""
++fi
++
+ dnl for the spec file
+ RELDATE=`date +'%a %b %e %Y'`
+ AC_SUBST(RELDATE)
+@@ -279,6 +285,43 @@ if test x$kqueue = xtrue; then
+ 	backends="${backends}, kqueue"
+ fi
+ 
++case "$os" in
++    solaris*)
++	AM_CONDITIONAL(ON_SOLARIS, true)
++	AC_COMPILE_IFELSE([
++		#include <port.h>
++		#ifndef PORT_SOURCE_FILE
++		#error "Please upgrade to Nevada 72 or above to suppoert FEN"
++		#endif
++		int main() { return 0; }
++		],[have_fen=1],)
++	if test x$have_fen = x1 ; then
++            AC_ARG_ENABLE(fen,
++		AC_HELP_STRING([--disable-fen], [Disable the FEN backend]),
++                       [fen="${enableval}"], [fen=true])
++
++		if test x$fen = xyes; then
++                       fen=true
++		elif test x$fen = xno; then
++                       fen=false
++		elif test x$fen != xtrue; then
++                       AC_MSG_ERROR(bad value ${enableval} for --disable-fen)
++		fi
++	fi
++	break;
++	;;
++    *)
++	fen=false
++	break;
++	;;
++esac
++
++AM_CONDITIONAL(ENABLE_FEN, test x$fen = xtrue)
++if test x$fen = xtrue; then
++	AC_DEFINE(ENABLE_FEN,1,[Use Solaris FEN as backend])
++	backends="${backends}, FEN"
++fi
++
+ dnl pthread support for reentrance of the client library.
+ AC_ARG_WITH(threads,
+ [  --with-threads          add multithread support(on)])
+@@ -385,6 +428,14 @@ if test x$dbus_have_struct_cmsgcred = xyes; then
+     AC_DEFINE(HAVE_CMSGCRED,1,[Have cmsgcred structure])
+ fi
+ 
++dnl Check for getpeerucred support - Solaris
++
++AC_CHECK_HEADER(ucred.h,
++    AC_CHECK_LIB(c, getpeerucred,[
++        AC_DEFINE([HAVE_GETPEERUCRED],[],[Define if has getpeerucred])
++        AC_DEFINE([HAVE_UCRED_H],[],[Define if <ucred.h> exists])]))
++
++
+ #### Abstract sockets
+ 
+ AC_MSG_CHECKING(abstract socket namespace)
+@@ -529,6 +580,16 @@ AC_SUBST(PYTHON_VERSION)
+ AC_SUBST(PYTHON_INCLUDES)
+ AC_SUBST(PYTHON_SITE_PACKAGES)
+ 
++dnl Check for -lsocket -lnsl
++
++AC_CHECK_FUNC(gethostent, , AC_CHECK_LIB(nsl, gethostent))
++AC_CHECK_FUNC(setsockopt, , AC_CHECK_LIB(socket, setsockopt))
++
++dnl Check for <sys/mnttab.h>
++
++AC_CHECK_HEADER(sys/mnttab.h,
++	AC_DEFINE([HAVE_SYS_MNTTAB_H], [], [Define if <sys/mnttab.h> is there]))
++
+ dnl After all config-related tweaking of CFLAGS, set it to its "build" value
+ 
+ AC_MSG_CHECKING(for more compiler warnings)
 diff --git a/libgamin/Makefile.am b/libgamin/Makefile.am
 index 35aa740..4f725a2 100644
 --- a/libgamin/Makefile.am
@@ -491,9 +599,9 @@
 diff --git a/server/fen-kernel.c b/server/fen-kernel.c
 new file mode 100644
 index 0000000..8b9c58b
---- /dev/null
-+++ b/server/fen-kernel.c
-@@ -0,0 +1,557 @@
+--- /dev/null	2019-12-10 11:10:35.000000000 +0000
++++ gamin-0.1.10/server/fen-kernel.c	2019-12-10 11:10:23.000742017 +0000
+@@ -0,0 +1,574 @@
 +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
 +/* vim:set expandtab ts=4 shiftwidth=4: */
 +/* 
@@ -905,6 +1013,23 @@
 +}
 +
 +/**
++ * When a node is deleted, we need to remove
++ * all events referencing this node from event queue.
++ *
++ * Unsafe, need lock fen_lock.
++ */
++void prune_queue (node_t *f)
++{
++    node_event_t* ev;
++    GQueue *c = g_queue_copy(g_eventq);
++    while (ev = (node_event_t*) g_queue_pop_head(c))    {
++        if (ev->user_data == f || ev->pair_data == f)
++            g_queue_remove(g_eventq, ev);
++    }
++    g_queue_free(c);
++}
++
++/**
 + * Get Solaris resouce values.
 + *
 + */
@@ -1054,9 +1179,9 @@
 diff --git a/server/fen-kernel.h b/server/fen-kernel.h
 new file mode 100644
 index 0000000..6d2c49b
---- /dev/null
-+++ b/server/fen-kernel.h
-@@ -0,0 +1,43 @@
+--- /dev/null	2019-12-10 11:10:35.000000000 +0000
++++ gamin-0.1.10/server/fen-kernel.h	2019-12-10 11:10:22.999527865 +0000
+@@ -0,0 +1,44 @@
 +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
 +/* vim:set expandtab ts=4 shiftwidth=4: */
 +/* 
@@ -1096,6 +1221,7 @@
 +
 +gint port_add (node_t* f);
 +void port_remove (node_t *f);
++void prune_queue (node_t *f);
 +
 +gboolean port_class_init ();
 +
@@ -1103,9 +1229,9 @@
 diff --git a/server/fen-node.c b/server/fen-node.c
 new file mode 100644
 index 0000000..d4d7ddb
---- /dev/null
-+++ b/server/fen-node.c
-@@ -0,0 +1,642 @@
+--- /dev/null	2019-12-10 11:10:35.000000000 +0000
++++ gamin-0.1.10/server/fen-node.c	2019-12-10 11:10:23.002327705 +0000
+@@ -0,0 +1,643 @@
 +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
 +/* vim:set expandtab ts=4 shiftwidth=4: */
 +/* 
@@ -1399,10 +1525,11 @@
 +        /* Actually ignore the ROOT node. */
 +        if (node->state == 0 && NODE_PARENT(node)) {
 +            children_remove(NODE_PARENT(node), node);
++            /* Remove the pending events in the queue. */
++            prune_queue(node);
 +            /* Do clean instead of returning TRUE. */
 +            node_delete (node);
 +        }
-+        /* else, we have events, clean event queue? */
 +    }
 +    return FALSE;
 +}
@@ -1610,7 +1737,7 @@
 +     */
 +    if (NODE_NEED_MONITOR(f)) {
 +        if (HAS_NO_EXCEPTION_EVENTS(ev->e)) {
-+            if (NODE_HAS_STATE(f, NODE_STATE_ASSOCIATED) || port_add(f) == 0) {
++            if (NODE_HAS_STATE(f, NODE_STATE_ASSOCIATED) || (node_lstat(f) == 0 && port_add(f) == 0)) {
 +                if ((ev->e & FILE_MODIFIED) && NODE_HAS_FLAG(f, NODE_FLAG_DIR)) {
 +                    if (f->dir_subs) {
 +                        node_create_children_snapshot(f, FN_EVENT_CREATED, TRUE);

--
Gitblit v1.9.3