From b8f4c9fd746faebf730bd8c744200d1a0b5e2940 Mon Sep 17 00:00:00 2001
From: Till Wegmüller <toasterson@gmail.com>
Date: Sun, 24 Mar 2024 21:54:02 +0100
Subject: [PATCH] Add support for FEN in the file monitor

---
 components/library/gamin/patches/01-FEN.patch          |  149 ++++++++++++++++++++++++++++++++++++++++++++++---
 components/library/gamin/Makefile                      |    7 +-
 components/library/gamin/gamin.p5m                     |   11 ++-
 components/library/gamin/manifests/sample-manifest.p5m |    8 +-
 components/library/gamin/pkg5                          |    4 -
 5 files changed, 153 insertions(+), 26 deletions(-)

diff --git a/components/library/gamin/Makefile b/components/library/gamin/Makefile
index ea6330f..932bac3 100644
--- a/components/library/gamin/Makefile
+++ b/components/library/gamin/Makefile
@@ -18,7 +18,7 @@
 
 COMPONENT_NAME= gamin
 COMPONENT_VERSION= 0.1.10
-COMPONENT_REVISION= 4
+COMPONENT_REVISION= 5
 COMPONENT_SUMMARY= Library providing the FAM File Alteration Monitor API
 COMPONENT_SRC= $(COMPONENT_NAME)-$(COMPONENT_VERSION)
 COMPONENT_ARCHIVE= $(COMPONENT_SRC).tar.gz
@@ -46,12 +46,13 @@
 	$(MV) $(PROTO_DIR)$(PYTHON_LIB)/_gamin.so $(PROTO_DIR)$(PYTHON_LIB)/_gamin$$EXT_SUFFIX ;
 
 CONFIGURE_OPTIONS += --sysconfdir=/etc
-CONFIGURE_OPTIONS += --libexecdir=$(CONFIGURE_LIBDIR.$(BITS))
 CONFIGURE_OPTIONS += --disable-static
 CONFIGURE_OPTIONS.32 += --with-python=no
 CONFIGURE_OPTIONS.64 += --with-python=/usr
+CONFIGURE_OPTIONS += DAEMON_LIBS="-lglib-2.0 -lgobject-2.0 -lgio-2.0"
+
+PYTHON_REQUIRED_PACKAGES  += runtime/python
 
 # Auto-generated dependencies
-PYTHON_REQUIRED_PACKAGES += runtime/python
 REQUIRED_PACKAGES += library/glib2
 REQUIRED_PACKAGES += system/library
diff --git a/components/library/gamin/gamin.p5m b/components/library/gamin/gamin.p5m
index b7a5b5e..380af2c 100644
--- a/components/library/gamin/gamin.p5m
+++ b/components/library/gamin/gamin.p5m
@@ -25,23 +25,24 @@
 license $(COMPONENT_LICENSE_FILE) license='$(COMPONENT_LICENSE)'
 
 file path=usr/include/fam.h
-file path=usr/lib/$(MACH64)/gam_server mode=0555
 link path=usr/lib/$(MACH64)/libfam.so target=libfam.so.0.0.0
 link path=usr/lib/$(MACH64)/libfam.so.0 target=libfam.so.0.0.0
 file path=usr/lib/$(MACH64)/libfam.so.0.0.0
-link path=usr/lib/$(MACH64)/libgamin-1.so \
-    target=libgamin-1.so.$(HUMAN_VERSION)
+link path=usr/lib/$(MACH64)/libgamin-1.so target=libgamin-1.so.$(HUMAN_VERSION)
 file path=usr/lib/$(MACH64)/libgamin-1.so.$(HUMAN_VERSION)
 link path=usr/lib/$(MACH64)/libgamin-1.so.0 \
     target=libgamin-1.so.$(HUMAN_VERSION)
+file path=usr/lib/$(MACH64)/libgamin_shared.a
 file path=usr/lib/$(MACH64)/pkgconfig/gamin.pc
-file path=usr/lib/gam_server mode=0555
 link path=usr/lib/libfam.so target=libfam.so.0.0.0
 link path=usr/lib/libfam.so.0 target=libfam.so.0.0.0
 file path=usr/lib/libfam.so.0.0.0
 link path=usr/lib/libgamin-1.so target=libgamin-1.so.$(HUMAN_VERSION)
 file path=usr/lib/libgamin-1.so.$(HUMAN_VERSION)
 link path=usr/lib/libgamin-1.so.0 target=libgamin-1.so.$(HUMAN_VERSION)
+file path=usr/lib/libgamin_shared.a
 file path=usr/lib/pkgconfig/gamin.pc
-file path=usr/lib/python$(PYVER)/vendor-packages/_gamin.so
+file path=usr/lib/python$(PYVER)/vendor-packages/_gamin.cpython-$(PYV).so
 file path=usr/lib/python$(PYVER)/vendor-packages/gamin.py
+file path=usr/libexec/$(MACH64)/gam_server
+file path=usr/libexec/gam_server
diff --git a/components/library/gamin/manifests/sample-manifest.p5m b/components/library/gamin/manifests/sample-manifest.p5m
index 9576e91..fd3889c 100644
--- a/components/library/gamin/manifests/sample-manifest.p5m
+++ b/components/library/gamin/manifests/sample-manifest.p5m
@@ -10,7 +10,7 @@
 #
 
 #
-# Copyright 2023 <contributor>
+# Copyright 2024 <contributor>
 #
 
 set name=pkg.fmri value=pkg:/$(COMPONENT_FMRI)@$(IPS_COMPONENT_VERSION),$(BUILD_VERSION)
@@ -24,7 +24,6 @@
 license $(COMPONENT_LICENSE_FILE) license='$(COMPONENT_LICENSE)'
 
 file path=usr/include/fam.h
-file path=usr/lib/$(MACH64)/gam_server
 link path=usr/lib/$(MACH64)/libfam.so target=libfam.so.0.0.0
 link path=usr/lib/$(MACH64)/libfam.so.0 target=libfam.so.0.0.0
 file path=usr/lib/$(MACH64)/libfam.so.0.0.0
@@ -34,7 +33,6 @@
     target=libgamin-1.so.$(HUMAN_VERSION)
 file path=usr/lib/$(MACH64)/libgamin_shared.a
 file path=usr/lib/$(MACH64)/pkgconfig/gamin.pc
-file path=usr/lib/gam_server
 link path=usr/lib/libfam.so target=libfam.so.0.0.0
 link path=usr/lib/libfam.so.0 target=libfam.so.0.0.0
 file path=usr/lib/libfam.so.0.0.0
@@ -43,5 +41,7 @@
 link path=usr/lib/libgamin-1.so.0 target=libgamin-1.so.$(HUMAN_VERSION)
 file path=usr/lib/libgamin_shared.a
 file path=usr/lib/pkgconfig/gamin.pc
-file path=usr/lib/python$(PYVER)/vendor-packages/_gamin.so
+file path=usr/lib/python$(PYVER)/vendor-packages/_gamin.cpython-$(PYV).so
 file path=usr/lib/python$(PYVER)/vendor-packages/gamin.py
+file path=usr/libexec/$(MACH64)/gam_server
+file path=usr/libexec/gam_server
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);
diff --git a/components/library/gamin/pkg5 b/components/library/gamin/pkg5
index a886cfd..296e557 100644
--- a/components/library/gamin/pkg5
+++ b/components/library/gamin/pkg5
@@ -1,13 +1,11 @@
 {
     "dependencies": [
-        "SUNWcs",
         "library/glib2",
         "runtime/python-39",
-        "shell/ksh93",
         "system/library"
     ],
     "fmris": [
         "library/file-monitor/gamin"
     ],
     "name": "gamin"
-}
\ No newline at end of file
+}

--
Gitblit v1.9.3