tizen: Packaging
authorAnas Nashif <anas.nashif@intel.com>
Thu, 25 Jan 2024 13:34:10 +0000 (14:34 +0100)
committerKarol Lewandowski <k.lewandowsk@samsung.com>
Wed, 14 Feb 2024 10:08:18 +0000 (11:08 +0100)
Original packaging by Anas Nashif added in commit 5b3ddf662100eaaeed37a914bf7aace55f2891e0.

[ add test-runner, squash tizen patches and rebase to new upstream version ]
Signed-off-by: Karol Lewandowski <k.lewandowsk@samsung.com>
14 files changed:
packaging/LICENSE.MIT [new file with mode: 0644]
packaging/README.Gsettings-overrides [new file with mode: 0644]
packaging/baselibs.conf [new file with mode: 0644]
packaging/coverage.txt [new file with mode: 0644]
packaging/glib2-rpmlintrc [new file with mode: 0644]
packaging/glib2-upstream-gnome_defaults.conf [new file with mode: 0644]
packaging/glib2.changes [new file with mode: 0644]
packaging/glib2.csh [new file with mode: 0644]
packaging/glib2.manifest [new file with mode: 0644]
packaging/glib2.sh [new file with mode: 0644]
packaging/glib2.spec [new file with mode: 0644]
packaging/gtk-doc.m4 [new file with mode: 0644]
packaging/macros.glib2 [new file with mode: 0644]
packaging/test-runner.c [new file with mode: 0644]

diff --git a/packaging/LICENSE.MIT b/packaging/LICENSE.MIT
new file mode 100644 (file)
index 0000000..c9998ac
--- /dev/null
@@ -0,0 +1,16 @@
+ MIT License
+
+ Copyright (c) 2016 Samsung Electronics Co., Ltd
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+
diff --git a/packaging/README.Gsettings-overrides b/packaging/README.Gsettings-overrides
new file mode 100644 (file)
index 0000000..1244df3
--- /dev/null
@@ -0,0 +1,19 @@
+Quoting the "Vendor overrides" section from [1]:
+
+Default values are defined in the schemas that get installed by an application.
+Sometimes, it is necessary for a vendor or distributor to adjust these
+defaults. Since patching the XML source for the schema is inconvenient and
+error-prone, glib-compile-schemas reads so-called 'vendor override' files.
+These are keyfiles in the same directory as the XML schema sources which can
+override default values. The schema id serves as the group name in the key
+file, and the values are expected in serialized GVariant form, as in the
+following example:
+
+       [org.gtk.Example]
+       key1='string'
+       key2=1.5
+
+glib-compile-schemas expects schema files to have the extension
+.gschema.override
+
+[1] http://developer.gnome.org/gio/stable/GSettings.html
diff --git a/packaging/baselibs.conf b/packaging/baselibs.conf
new file mode 100644 (file)
index 0000000..f2977fd
--- /dev/null
@@ -0,0 +1,22 @@
+glib2-tools
+  +/usr/bin/gio-querymodules(-64)?
+libglib
+  obsoletes "glib2-<targettype> <= <version>"
+  provides "glib2-<targettype> = <version>"
+libgmodule
+libgio
+libgthread
+libgobject
+libgio-fam
+  requires "glib2-tools-<targettype>"
+  post "%if "%_lib" == "lib64""
+  post "<prefix>%{_bindir}/gio-querymodules-64 <prefix>%{_libdir}/gio/modules"
+  post "%else"
+  post "<prefix>%{_bindir}/gio-querymodules <prefix>%{_libdir}/gio/modules"
+  post "%endif"
+  postun "%if "%_lib" == "lib64""
+  postun "<prefix>%{_bindir}/gio-querymodules-64 <prefix>%{_libdir}/gio/modules"
+  postun "%else"
+  postun "<prefix>%{_bindir}/gio-querymodules <prefix>%{_libdir}/gio/modules"
+  postun "%endif"
+
diff --git a/packaging/coverage.txt b/packaging/coverage.txt
new file mode 100644 (file)
index 0000000..ef5e4d4
--- /dev/null
@@ -0,0 +1,19 @@
+How to analyze coverage:
+1. gbs build adding --define '_with_coverage 1'
+2. take *.o and *.gcno files from compilation (
+               <gbs-build-root>/home/abuild/rpmbuild/BUILD/glib2-2.44.1/gio/.libs
+               <gbs-build-root>/home/abuild/rpmbuild/BUILD/glib2-2.44.1/glib/.libs
+               <gbs-build-root>/home/abuild/rpmbuild/BUILD/glib2-2.44.1/gmodule/.libs
+               <gbs-build-root>/home/abuild/rpmbuild/BUILD/glib2-2.44.1/gobject/.libs
+               <gbs-build-root>/home/abuild/rpmbuild/BUILD/glib2-2.44.1/gthread/.libs
+               ) into a /safe/place
+       you may also use generated rpm package glib2-coverage-objects.
+3. install coverage package (glib2-coverage) on the target
+4. run test programs adding LD_LIBRARY_PATH=/usr/lib/dbus-tests/coverage-libs
+       Data gathering is cumulative, so you can run multiple programs one after another.
+       Use GCOV_PREFIX and GCOV_PREFIX_STRIP environment variables to set output directory.
+       If not set, data files (*.gcda) will be generated in /home/abuild/rpmbuild/BUILD/glib2-2.44.1/.
+5. download generated gcda files from the target to /safe/place
+6. put source code *.c files together with object files into a /safe/place
+7. run gcov /safe/place/*.o
+       or gcov -r /safe/place/*.o for only local source code output
diff --git a/packaging/glib2-rpmlintrc b/packaging/glib2-rpmlintrc
new file mode 100644 (file)
index 0000000..5a39ef6
--- /dev/null
@@ -0,0 +1,2 @@
+addFilter(".*shlib-fixed-dependency.*glib2")
+
diff --git a/packaging/glib2-upstream-gnome_defaults.conf b/packaging/glib2-upstream-gnome_defaults.conf
new file mode 100644 (file)
index 0000000..599ee82
--- /dev/null
@@ -0,0 +1,46 @@
+# GNOME Default Applications Source
+# /etc/gnome-defaults.conf
+#
+# WARNING: This is a dumb file, which provides only upstream GNOME
+# packages as preferred defaults. You most probably don't want this
+# package!
+# You probably want to install distribution glib2-branding and prefer
+# distribution wise GNOME defaults.
+#
+# After any change of this file run
+# SuSEconfig --module glib2
+#
+# This list is a source for defaults.list.
+#
+# If application in this list is installed, it is used as default in GNOME.
+# It works in following way:
+# 1. Read this file.
+# 2. Collect all available desktop files.
+# 3. Go through all declared MIME types and search for default application
+#    for defaults.list in following order:
+# 3.1 Installed application listed here for certain MIME type.
+# 3.2 Installed application listed here as preferred default.
+# 3.3 Installed application listed here as default.
+# 3.4 Installed application with GNOME in Categories.
+# 3.5 Installed application with GTK in Categories.
+# 3.6 Installed application.
+# If there are more applications in the same order, it uses pseudo-randomly
+# one of them (last in aplhabetical order).
+#
+# Syntax:
+# Use xxx as default for all MIME types it declares (see 3.3):
+# xxx.desktop
+# Use xxx as preferred default for all MIME types it declares (see 3.2):
+# !xxx.desktop
+# Use xxx as default for mime/type (see 3.1):
+# mime/type=xxx.desktop
+
+# Upstream GNOME default applications
+eog.desktop
+evince.desktop
+gedit.desktop
+file-roller.desktop
+epiphany.desktop
+nautilus-folder-handler.desktop
+# evince supports multi-page tiff, but most people will prefer eog:
+image/tiff=eog.desktop
diff --git a/packaging/glib2.changes b/packaging/glib2.changes
new file mode 100644 (file)
index 0000000..806157b
--- /dev/null
@@ -0,0 +1,47 @@
+* Tue Aug 13 2013 Anas Nashif <anas.nashif@intel.com> 2.36.3@0540f90
+- add .gbs.conf and update to 2.36.4
+
+* Tue Aug 13 2013 Anas Nashif <anas.nashif@intel.com> accepted/tizen/20130520.095512@84a55be
+- Remove empty docs package
+
+* Fri Jul 19 2013 Philippe Coval <philippe.coval@eurogiciel.fr> accepted/tizen/20130710.220535@5c863cc
+- gdesktopappinfo: Allow getting the desktop ID from the filename
+  Bug-Tizen: TZPC-3317 (... remove the fav apps icon ...)
+  Origin: upstream, https://git.gnome.org/browse/glib/commit/?id=c0af442909e1304b799a4b6c145f8444c752e3da
+- resetting manifest requested domain to floor
+- GSocks5Proxy: don't crash if parsing negotiation reply fails
+  Applied-upstream: 2.36.2, commit:0ba982e05
+  Bug: https://bugzilla.gnome.org/show_bug.cgi?id=699493
+  Bug-Tizen: TZPC-34 (Empathy / Telepathy - Proxy support)
+
+* Sat Apr 27 2013 Anas Nashif <anas.nashif@intel.com> 2.36.1@1b0d9ca
+- Update to 2.36.1
+
+* Wed Mar 27 2013 Anas Nashif <anas.nashif@intel.com> 2.36.0@3e8939c
+- Update to 2.36.0
+
+* Fri Mar 22 2013 Anas Nashif <anas.nashif@intel.com> 2.35.9@14fe501
+- Update to 2.35.9
+
+* Tue Mar 05 2013 Anas Nashif <anas.nashif@intel.com> 2.35.8@89b88e0
+- Remove previous crash fix (TZPC-453)
+
+* Tue Feb 26 2013 Anas Nashif <anas.nashif@intel.com> 2.35.8@8aed25e
+- Update to 2.35.8
+
+* Thu Feb 07 2013 Anas Nashif <anas.nashif@intel.com> 2.35.7@c7a2158
+- Update to 2.35.7
+
+* Thu Jan 31 2013 Anas Nashif <anas.nashif@intel.com> submit/trunk/20130131.165010@88f28c3
+- Update to 2.35.4
+
+* Thu Jan 03 2013 jbollo <jose.bollo@eurogiciel.fr> accepted/trunk/20121220.211950@7fcf93d
+- Avoiding SIGSEGV when running gio-querymodules
+
+* Tue Dec 18 2012 Anas Nashif <anas.nashif@intel.com> 2.35.3@28d76f3
+- update to 2.35.3
+
+* Sun Dec 09 2012 Anas Nashif <anas.nashif@intel.com> submit/devel/20121210.025910@9a11327
+- package license file
+- update to 2.35.2
+
diff --git a/packaging/glib2.csh b/packaging/glib2.csh
new file mode 100644 (file)
index 0000000..7c96a88
--- /dev/null
@@ -0,0 +1,468 @@
+# GLib filename encoding guesser.
+# Author: Stanislav Brabec <sbrabec@suse.cz>
+# Additions are welcome.
+# This script must be executed after setting LANG variable.
+
+# Try filenames which are invalid in UTF-8 as locale specific.
+# For selected locales, G_FILENAME_ENCODING takes precedence.
+setenv G_BROKEN_FILENAMES 1
+
+# In West Europe there was used both ISO-8859-15 and ISO-8859-1.
+# There is no chance to recognize it, so we must guess.
+#set west_europe_legacy_encoding=ISO-8859-1
+set west_europe_legacy_encoding=ISO-8859-15
+
+# In Russia, "official" encoding is ISO-8859-5, but most GNOME users
+# preferred KOI8-R. We must guess.
+#set russian_legacy_encoding=ISO-8859-5
+set russian_legacy_encoding=KOI8-R
+
+# In former Yugoslavia sr_YU have covered two different alphabets -
+# one Latin and on Cyrillic. No chance to guess.
+set sr_YU_legacy_encoding=ISO-8859-2,CP1250
+#set sr_YU_legacy_encoding=ISO-8859-5
+
+# Japanese uses two legacy encodings. Guess sometimes fails, sometimes not.
+# Defining preferred encoding increases chance for success.
+set japanese_legacy_encoding=EUC-JP
+#set japanese_legacy_encoding=SHIFT_JIS
+
+if (! ${?LANG} ) goto skip
+
+switch ( $LANG )
+    case aa_DJ*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case af_ZA*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case an_ES*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-15,CP1252
+       breaksw
+    case ar_AE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_BH*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_DZ*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_EG*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_IQ*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_JO*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_KW*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_LB*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_LY*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_MA*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_OM*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_QA*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_SA*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_SD*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_SY*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_TN*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case ar_YE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-6
+       breaksw
+    case be_BY*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,CP1251
+       breaksw
+    case bg_BG*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,CP1251
+       breaksw
+    case br_FR*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case bs_BA*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-2,CP1250
+       breaksw
+    case ca_ES*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case cs_CZ*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-2,CP1250
+       breaksw
+    case cy_GB*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-14,CP1252
+       breaksw
+    case da_DK*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case de_AT*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case de_BE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case de_DE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case de_CH*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case de_LU*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case el_GR*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-7
+       breaksw
+    case en_AU*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case en_BE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case en_BW*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case en_CA*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case en_DK*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case en_GB*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case en_HK*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case en_IE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case en_NZ*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case en_PH*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case en_SG*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case en_US*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case en_ZA*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case en_ZW*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_AR*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_BO*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_CL*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_CO*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_CR*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_DO*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_EC*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_ES*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case es_GT*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_HN*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_MX*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_NI*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_PA*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_PE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_PR*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_PY*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_SV*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_US*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_UY*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case es_VE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case et_EE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case eu_ES*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case fa_IR*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,CP1256
+       breaksw
+    case fi_FI*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case fo_FO*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case fr_BE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case fr_CA*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case fr_FR*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case fr_CH*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case fr_LU*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case ga_IE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case gd_GB*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-15,CP1252
+       breaksw
+    case gl_ES*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case gv_GB*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case he_IL*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-8
+       breaksw
+    case hr_HR*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-2,CP1250
+       breaksw
+    case hu_HU*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-2,CP1250
+       breaksw
+    case hy_AM*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ARMSCII-8
+       breaksw
+    case id_ID*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case is_IS*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case it_CH*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case it_IT*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case iw_IL*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-8
+       breaksw
+    case ja_JP*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$japanese_legacy_encoding,EUC-JP,SHIFT_JIS,ISO-8859-1
+       breaksw
+    case ka_GE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,GEORGIAN-PS
+       breaksw
+    case kl_GL*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case km_KH*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,GB18030
+       breaksw
+    case ko_KR*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,EUC-KR,ISO-8859-1
+       breaksw
+    case kw_GB*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case lg_UG*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-10,CP1252
+       breaksw
+    case lt_LT*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-13,CP1252
+       breaksw
+    case lv_LV*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-13,CP1252
+       breaksw
+    case mi_NZ*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-13,CP1252
+       breaksw
+    case mk_MK*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-5,CP1251
+       breaksw
+    case ms_MY*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case mt_MT*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-3
+       breaksw
+    case nb_NO*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case nl_BE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case nl_NL*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case nn_NO*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case no_NO*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case oc_FR*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case om_KE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case pl_PL*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-2,CP1250
+       breaksw
+    case pt_BR*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case pt_PT*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case ro_RO*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-2,CP1250
+       breaksw
+    case ru_RU*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$russian_legacy_encoding,CP1251
+       breaksw
+    case ru_UA*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,KOI8-U
+       breaksw
+    case sh_YU*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-2,CP1250
+       breaksw
+    case sk_SK*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-2,CP1250
+       breaksw
+    case sl_SI*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-2,CP1250
+       breaksw
+    case so_DJ*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case so_KE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case so_SO*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case sq_AL*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case sr_YU*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$sr_YU_legacy_encoding
+       breaksw
+    case st_ZA*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case sv_FI*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case sv_SE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case tg_TJ*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,KOI8-T
+       breaksw
+    case th_TH*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,TIS-620,ISO-8859-1
+       breaksw
+    case tl_PH*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case tr_TR*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-9
+       breaksw
+    case uk_UA*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,KOI8-U
+       breaksw
+    case uz_UZ*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case vi_VN*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,TCVN5712-1,ISO-8859-1
+       breaksw
+    case wa_BE*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       breaksw
+    case xh_ZA*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+    case yi_US*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,CP1255
+       breaksw
+    case zh_CN*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,GB2312,GB18030,GBK,ISO-8859-1
+       breaksw
+    case zh_HK*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,BIG5-HKSCS,ISO-8859-1
+       breaksw
+    case zh_SG*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,GB2312,GB18030,GBK,ISO-8859-1
+       breaksw
+    case zh_TW*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,BIG5,EUC-TW,ISO-8859-1
+       breaksw
+    case zu_ZA*:
+       setenv G_FILENAME_ENCODING @locale,UTF-8,ISO-8859-1,CP1252
+       breaksw
+endsw
+
+skip:
+
+unset west_europe_legacy_encoding
+unset russian_legacy_encoding
+unset sr_YU_legacy_encoding
diff --git a/packaging/glib2.manifest b/packaging/glib2.manifest
new file mode 100644 (file)
index 0000000..017d22d
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+ <request>
+    <domain name="_"/>
+ </request>
+</manifest>
diff --git a/packaging/glib2.sh b/packaging/glib2.sh
new file mode 100644 (file)
index 0000000..9f63db1
--- /dev/null
@@ -0,0 +1,465 @@
+# GLib filename encoding guesser.
+# Author: Stanislav Brabec <sbrabec@suse.cz>
+# Additions are welcome.
+# This script must be executed after setting LANG variable.
+
+# Try filenames which are invalid in UTF-8 as locale specific.
+# For selected locales, G_FILENAME_ENCODING takes precedence.
+export G_BROKEN_FILENAMES=1
+
+# In West Europe there was used both ISO-8859-15 and ISO-8859-1.
+# There is no chance to recognize it, so we must guess.
+#west_europe_legacy_encoding=ISO-8859-1
+west_europe_legacy_encoding=ISO-8859-15
+
+# In Russia, "official" encoding is ISO-8859-5, but most GNOME users
+# preferred KOI8-R. We must guess.
+#russian_legacy_encoding=ISO-8859-5
+russian_legacy_encoding=KOI8-R
+
+# In former Yugoslavia sr_YU have covered two different alphabets -
+# one Latin and on Cyrillic. No chance to guess.
+sr_YU_legacy_encoding=ISO-8859-2,CP1250
+#sr_YU_legacy_encoding=ISO-8859-5
+
+# Japanese uses two legacy encodings. Guess sometimes fails, sometimes not.
+# Defining preferred encoding increases chance for success.
+japanese_legacy_encoding=EUC-JP
+#japanese_legacy_encoding=SHIFT_JIS
+
+case $LANG in
+    aa_DJ* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    af_ZA* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    an_ES* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-15,CP1252
+       ;;
+    ar_AE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_BH* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_DZ* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_EG* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_IQ* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_JO* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_KW* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_LB* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_LY* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_MA* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_OM* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_QA* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_SA* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_SD* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_SY* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_TN* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    ar_YE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-6
+       ;;
+    be_BY* )
+       G_FILENAME_ENCODING=@locale,UTF-8,CP1251
+       ;;
+    bg_BG* )
+       G_FILENAME_ENCODING=@locale,UTF-8,CP1251
+       ;;
+    br_FR* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    bs_BA* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-2,CP1250
+       ;;
+    ca_ES* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    cs_CZ* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-2,CP1250
+       ;;
+    cy_GB* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-14,CP1252
+       ;;
+    da_DK* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    de_AT* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    de_BE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    de_DE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    de_CH* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    de_LU* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    el_GR* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-7
+       ;;
+    en_AU* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    en_BE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    en_BW* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    en_CA* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    en_DK* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    en_GB* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    en_HK* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    en_IE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    en_NZ* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    en_PH* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    en_SG* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    en_US* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    en_ZA* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    en_ZW* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_AR* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_BO* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_CL* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_CO* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_CR* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_DO* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_EC* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_ES* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    es_GT* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_HN* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_MX* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_NI* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_PA* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_PE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_PR* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_PY* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_SV* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_US* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_UY* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    es_VE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    et_EE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    eu_ES* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    fa_IR* )
+       G_FILENAME_ENCODING=@locale,UTF-8,CP1256
+       ;;
+    fi_FI* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    fo_FO* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    fr_BE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    fr_CA* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    fr_FR* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    fr_CH* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    fr_LU* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    ga_IE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    gd_GB* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-15,CP1252
+       ;;
+    gl_ES* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    gv_GB* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    he_IL* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-8
+       ;;
+    hr_HR* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-2,CP1250
+       ;;
+    hu_HU* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-2,CP1250
+       ;;
+    hy_AM* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ARMSCII-8
+       ;;
+    id_ID* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    is_IS* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    it_CH* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    it_IT* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    iw_IL* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-8
+       ;;
+    ja_JP* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$japanese_legacy_encoding,EUC-JP,SHIFT_JIS,ISO-8859-1
+       ;;
+    ka_GE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,GEORGIAN-PS
+       ;;
+    kl_GL* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    km_KH* )
+       G_FILENAME_ENCODING=@locale,UTF-8,GB18030
+       ;;
+    ko_KR* )
+       G_FILENAME_ENCODING=@locale,UTF-8,EUC-KR,ISO-8859-1
+       ;;
+    kw_GB* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    lg_UG* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-10,CP1252
+       ;;
+    lt_LT* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-13,CP1252
+       ;;
+    lv_LV* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-13,CP1252
+       ;;
+    mi_NZ* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-13,CP1252
+       ;;
+    mk_MK* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-5,CP1251
+       ;;
+    ms_MY* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    mt_MT* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-3
+       ;;
+    nb_NO* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    nl_BE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    nl_NL* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    nn_NO* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    no_NO* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    oc_FR* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    om_KE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    pl_PL* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-2,CP1250
+       ;;
+    pt_BR* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    pt_PT* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    ro_RO* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-2,CP1250
+       ;;
+    ru_RU* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$russian_legacy_encoding,CP1251
+       ;;
+    ru_UA* )
+       G_FILENAME_ENCODING=@locale,UTF-8,KOI8-U
+       ;;
+    sh_YU* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-2,CP1250
+       ;;
+    sk_SK* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-2,CP1250
+       ;;
+    sl_SI* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-2,CP1250
+       ;;
+    so_DJ* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    so_KE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    so_SO* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    sq_AL* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    sr_YU* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$sr_YU_legacy_encoding
+       ;;
+    st_ZA* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    sv_FI* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    sv_SE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    tg_TJ* )
+       G_FILENAME_ENCODING=@locale,UTF-8,KOI8-T
+       ;;
+    th_TH* )
+       G_FILENAME_ENCODING=@locale,UTF-8,TIS-620,ISO-8859-1
+       ;;
+    tl_PH* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    tr_TR* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-9
+       ;;
+    uk_UA* )
+       G_FILENAME_ENCODING=@locale,UTF-8,KOI8-U
+       ;;
+    uz_UZ* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    vi_VN* )
+       G_FILENAME_ENCODING=@locale,UTF-8,TCVN5712-1,ISO-8859-1
+       ;;
+    wa_BE* )
+       G_FILENAME_ENCODING=@locale,UTF-8,$west_europe_legacy_encoding,CP1252
+       ;;
+    xh_ZA* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+    yi_US* )
+       G_FILENAME_ENCODING=@locale,UTF-8,CP1255
+       ;;
+    zh_CN* )
+       G_FILENAME_ENCODING=@locale,UTF-8,GB2312,GB18030,GBK,ISO-8859-1
+       ;;
+    zh_HK* )
+       G_FILENAME_ENCODING=@locale,UTF-8,BIG5-HKSCS,ISO-8859-1
+       ;;
+    zh_SG* )
+       G_FILENAME_ENCODING=@locale,UTF-8,GB2312,GB18030,GBK,ISO-8859-1
+       ;;
+    zh_TW* )
+       G_FILENAME_ENCODING=@locale,UTF-8,BIG5,EUC-TW,ISO-8859-1
+       ;;
+    zu_ZA* )
+       G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-1,CP1252
+       ;;
+esac
+export G_FILENAME_ENCODING
+
+unset west_europe_legacy_encoding
+unset russian_legacy_encoding
+unset sr_YU_legacy_encoding
diff --git a/packaging/glib2.spec b/packaging/glib2.spec
new file mode 100644 (file)
index 0000000..c3b9299
--- /dev/null
@@ -0,0 +1,429 @@
+# Do not create provides from extension .so files because the main package
+# should anchor any reverse-dependencies
+%global __provides_exclude_from ^(.*\\.extension-symbolic)$
+
+%define baseline 2.78.4
+%define with_systemtap 0
+%define keepstatic 1
+%define build_dir _build
+%define build_dir_symbolic _build_symbolic
+
+%define relative_dbus_tests_base_dir %{_libdir}/dbus-tests
+
+Name:           glib2
+Version:        2.78.4
+Release:        0
+# FIXME: find out if tapsets should really be in devel package or in main package
+Summary:        General-Purpose Utility Library
+License:        LGPL-2.1+
+Group:          Base/Libraries
+Url:            http://www.gtk.org/
+Source:         http://download.gnome.org/sources/glib/%{baseline}/%{name}-%{version}.tar.xz
+Source1:        glib2.sh
+Source2:        glib2.csh
+Source3:        test-runner.c
+# Not upstream file. Only proposes upstream packages:
+Source4:        glib2-upstream-gnome_defaults.conf
+Source6:        macros.glib2
+# Not depending on gtk-doc shortens bootstrap compilation path.
+# Please update this file from the latest gtk-doc package:
+Source7:        gtk-doc.m4
+Source8:        LICENSE.MIT
+Source99:       baselibs.conf
+Source1001:    glib2.manifest
+BuildRequires:  automake
+BuildRequires:  fdupes
+BuildRequires:  gcc-c++
+BuildRequires:  m4
+BuildRequires:  cmake
+BuildRequires:  meson >= 0.49.2
+BuildRequires:  pkg-config
+BuildRequires:  python3
+BuildRequires:  gettext-tools
+# gdbus-codegen is run during the build, so we need python-xml
+BuildRequires:  python3-xml
+%if 0%{?with_systemtap}
+BuildRequires:  systemtap-sdt-devel
+%endif
+# Needed for gresource
+BuildRequires:  pkgconfig(libelf) >= 0.8.12
+BuildRequires:  pkgconfig(libffi)
+BuildRequires:  pkgconfig(libpcre2-8) >= 10.32
+BuildRequires:  pkgconfig(mount) >= 2.28
+BuildRequires:  pkgconfig(zlib)
+
+%description
+GLib is a general-purpose utility library, which provides many useful
+data types, macros, type conversions, string utilities, file utilities,
+a main loop abstraction, and so on.
+
+%package tools
+Summary:        General-Purpose Utility Library -- Tools
+
+%description tools
+GLib is a general-purpose utility library, which provides many useful
+data types, macros, type conversions, string utilities, file utilities,
+a main loop abstraction, and so on.
+
+%package -n gio-branding-upstream
+Summary:        Upstream definitions of default settings and applications
+Requires:       libgio = %{version}
+Provides:       %{name}-branding-upstream = %{version}
+Obsoletes:      %{name}-branding-upstream < %{version}
+Provides:       gio-branding = %{version}
+Conflicts:      otherproviders(gio-branding)
+Supplements:    packageand(libgio:branding-upstream)
+BuildArch:      noarch
+#BRAND: The /etc/gnome_defaults.conf allows to define arbitrary
+#BRAND: applications as preferred defaults.
+#BRAND: A /usr/share/glib-2.0/schemas/$NAME.gschema.override file can
+#BRAND: be used to override the default value for GSettings keys. See
+#BRAND: README.Gsettings-overrides for more details. The branding
+#BRAND: package should then have proper Requires for features changed
+#BRAND: with such an override file.
+# NOTE: gnome_defaults is not an upstream feature, but a SuSE
+# enhancement, but to conform branding conventions, the package is named
+# as gio-branding-upstream.
+
+%description -n gio-branding-upstream
+This package provides upstream defaults for settings stored with
+GSettings and applications used by the MIME system.
+
+%package devel
+#'
+Requires:       %{name} = %{version}
+Requires:       glibc-devel
+Requires:       pkg-config
+# Now require the subpackages too
+Requires:       glib2-tools = %{version}
+Requires:       libgio = %{version}
+Requires:       libglib = %{version}
+Requires:       libgmodule = %{version}
+Requires:       libgobject = %{version}
+Requires:       libgthread = %{version}
+# Required by gdbus-codegen
+Requires:       python3-xml
+Requires:       python3
+Provides:       glib2-doc = 2.19.6
+Obsoletes:      glib2-doc < 2.19.6
+Summary:        General-Purpose Utility Library -- Development Files
+
+%description devel
+GLib is a general-purpose utility library, which provides many useful
+data types, macros, type conversions, string utilities, file utilities,
+a main loop abstraction, and so on.
+
+This package contains the development files for GLib.
+
+%package devel-static
+Summary:        Static libraries for glib, a general-purpose utility library
+Group:          Development/Libraries/C and C++
+Requires:       %{name}-devel = %{version}
+
+%description devel-static
+GLib is a general-purpose utility library, which provides many useful
+data types, macros, type conversions, string utilities, file utilities,
+a main loop abstraction, and so on.
+
+This package contains static versions of the GLib libraries.
+
+%package -n libglib
+Summary:        General-Purpose Utility Library
+Provides:       %{name} = %{version}
+Obsoletes:      %{name} < %{version}
+
+%description -n libglib
+GLib is a general-purpose utility library, which provides many useful
+data types, macros, type conversions, string utilities, file utilities,
+a main loop abstraction, and so on.
+
+%package -n libgmodule
+Summary:        General-Purpose Utility Library -- Library for Modules
+
+%description -n libgmodule
+GLib is a general-purpose utility library, which provides many useful
+data types, macros, type conversions, string utilities, file utilities,
+a main loop abstraction, and so on.
+
+The libgmodule library provides a portable way to dynamically load
+object files (commonly known as 'plug-ins').
+
+%package -n libgio
+Summary:        General-Purpose Utility Library -- Library for VFS
+Requires:       gio-branding = %{version}
+# bnc#555605: shared-mime-info is required by libgio to properly detect mime types.
+Requires:       shared-mime-info
+# bnc#678518: libgio interacts with others by means of dbus-launch
+#Requires:       dbus-1-x11
+Provides:       gio = %{version}
+
+%description -n libgio
+GLib is a general-purpose utility library, which provides many useful
+data types, macros, type conversions, string utilities, file utilities,
+a main loop abstraction, and so on.
+
+GIO provides a modern, easy-to-use VFS API.
+
+%package -n libglib-extension-symbolic
+Summary:       Extension for libglib to allow the override of internal defined global function.
+Requires:      libglib = %{version}-%{release}
+
+%description -n libglib-extension-symbolic
+This modifies libglib to allow the override of internal defined global function.
+
+%package -n libgthread
+Summary:        General-Purpose Utility Library -- Library for Threads
+
+%description -n libgthread
+GLib is a general-purpose utility library, which provides many useful
+data types, macros, type conversions, string utilities, file utilities,
+a main loop abstraction, and so on.
+
+The libgthread library provides a portable way to write multi-threaded
+software.
+
+%package -n libgobject
+Summary:        General-Purpose Utility Library -- Object-Oriented Framework for C
+
+%description -n libgobject
+GLib is a general-purpose utility library, which provides many useful
+data types, macros, type conversions, string utilities, file utilities,
+a main loop abstraction, and so on.
+
+The GObject library provides an object-oriented framework for C.
+
+%package tests
+License:        LGPL-2.0+ and MIT
+Summary:        Set of tests for gdbus component
+Requires:       %{name} = %{version}
+
+%description tests
+This package is part of 'dbus-integration-tests' framework and contains set of tests
+for gdbus component.
+
+%prep
+%setup -q -n %{name}-%{version}
+
+%build
+cp %{SOURCE3} .
+cp %{SOURCE8} .
+cp %{SOURCE1001} .
+cp -a %{SOURCE1} %{SOURCE2} .
+cp -a %{SOURCE4} gnome_defaults.conf
+if ! test -f %{_datadir}/aclocal/gtk-doc.m4 ; then
+    cp -a %{SOURCE7} m4macros/
+fi
+
+%define _vpath_srcdir .
+
+# Normal build
+%define _vpath_builddir %{build_dir}
+%meson \
+       --default-library=both \
+       -Dinstalled_tests=true \
+       -Dselinux=disabled \
+       -Db_pie=true
+%meson_build
+
+# Configure symbolic_functions disabled build
+%define _vpath_builddir %{build_dir_symbolic}
+%meson \
+       --default-library=both \
+       -Dinstalled_tests=true \
+       -Dselinux=disabled \
+       -Dbsymbolic_functions=false \
+       -Db_pie=true
+%meson_build
+
+# compile test-runner for 'dbus-integration-test' framework
+%__cc %{_builddir}/%{name}-%{version}/test-runner.c -DTESTS_DIR='"'%{relative_dbus_tests_base_dir}/test-suites/glib-tests'"' -fPIC -pie -o %{_builddir}/%{name}-%{version}/glib-tests
+
+%install
+# symbolic diabled install and gather required files
+%define _vpath_builddir %{build_dir_symbolic}
+%meson_install
+for FILE in %{buildroot}%{_libdir}/libglib*; do mv "$FILE" "$FILE.extension-symbolic"; done
+
+# normal install
+%define _vpath_builddir %{build_dir}
+%meson_install
+%find_lang glib20 %{?no_lang_C}
+
+mkdir -p %{buildroot}%{_sysconfdir}/profile.d
+install -D -m0644 glib2.sh %{buildroot}%{_sysconfdir}/profile.d/zzz-glib2.sh
+install -D -m0644 glib2.csh %{buildroot}%{_sysconfdir}/profile.d/zzz-glib2.csh
+install -D -m0644 gnome_defaults.conf %{buildroot}%{_sysconfdir}/gnome_defaults.conf
+
+# gio-querymodules magic
+%if "%{_lib}" == "lib64"
+mv %{buildroot}%{_bindir}/gio-querymodules %{buildroot}%{_bindir}/gio-querymodules-64
+%endif
+
+# prepare tests for 'dbus-integration-test' framework
+%define dbus_tests_base_dir %{buildroot}%{relative_dbus_tests_base_dir}
+
+install -D -m 755 %{_builddir}/%{name}-%{version}/glib-tests %{dbus_tests_base_dir}/runner/glib-tests
+mkdir -p %{dbus_tests_base_dir}/test-suites/glib-tests/
+mv %{buildroot}%{_prefix}/libexec/installed-tests/glib/*gdbus-* %{dbus_tests_base_dir}/test-suites/glib-tests/
+# workaround for UNIX fd passing test (gdbus-peer)
+echo "Testfile - check for UNIX fd passing" > %{dbus_tests_base_dir}/test-suites/glib-tests/file.c
+rm %{dbus_tests_base_dir}/test-suites/glib-tests/gdbus-testserver
+rm -Rf %{buildroot}%{_prefix}/libexec/installed-tests/glib/
+rm -Rf %{buildroot}%{_prefix}/share/installed-tests/glib/
+
+# Install rpm macros
+mkdir -p %{buildroot}%{_sysconfdir}/rpm
+cp %{SOURCE6} %{buildroot}%{_sysconfdir}/rpm
+
+mkdir -p %{buildroot}%{_libdir}/gio/modules
+mkdir -p %{buildroot}%{_datadir}/glib-2.0/schemas/
+
+chmod 755 %{buildroot}%{_bindir}/*
+
+%post -n libglib -p /sbin/ldconfig
+%post -n libgobject -p /sbin/ldconfig
+%post -n libgthread -p /sbin/ldconfig
+%post -n libgio -p /sbin/ldconfig
+%post -n libgmodule -p /sbin/ldconfig
+
+%postun -n libglib -p /sbin/ldconfig
+%postun -n libgobject -p /sbin/ldconfig
+%postun -n libgthread -p /sbin/ldconfig
+%postun -n libgio -p /sbin/ldconfig
+%postun -n libgmodule -p /sbin/ldconfig
+
+%files tools
+%manifest %{name}.manifest
+%defattr(-,root,root)
+%license COPYING
+%dir %{_datadir}/bash-completion
+%dir %{_datadir}/bash-completion/completions
+%{_datadir}/bash-completion/completions/gresource
+%{_datadir}/bash-completion/completions/gsettings
+%{_bindir}/gapplication
+%{_bindir}/gdbus
+%{_bindir}/gio
+%{_bindir}/gio-querymodules*
+%{_bindir}/glib-compile-schemas
+%{_bindir}/gresource
+%{_bindir}/gsettings
+%{_libexecdir}/gio-launch-desktop
+
+# We put those files here, but they don't really belong here. They just don't
+# have a better home... The zzz-glib2 scripts could arguably be in
+# libglib but that would break the shared library policy.
+%{_sysconfdir}/profile.d/zzz-glib2.*
+
+%files -n gio-branding-upstream
+%manifest %{name}.manifest
+%defattr(-,root,root)
+%license COPYING
+%config (noreplace) %{_sysconfdir}/gnome_defaults.conf
+
+%files -n libglib
+%manifest %{name}.manifest
+%defattr(-, root, root)
+%license COPYING
+%exclude %{_libdir}/libglib*.so.*.extension-symbolic
+%{_libdir}/libglib*.so.*
+
+%files -n libgmodule
+%manifest %{name}.manifest
+%defattr(-, root, root)
+%license COPYING
+%{_libdir}/libgmodule*.so.*
+
+%files -n libgobject
+%manifest %{name}.manifest
+%defattr(-, root, root)
+%license COPYING
+%{_libdir}/libgobject*.so.*
+
+%files -n libgthread
+%manifest %{name}.manifest
+%defattr(-, root, root)
+%license COPYING
+%{_libdir}/libgthread*.so.*
+
+%files -n libgio
+%manifest %{name}.manifest
+%defattr(-, root, root)
+%license COPYING
+%{_libdir}/libgio*.so.*
+%dir %{_libdir}/gio
+%dir %{_libdir}/gio/modules
+%ghost %{_libdir}/gio/modules/giomodule.cache
+%dir %{_datadir}/glib-2.0/
+%dir %{_datadir}/glib-2.0/schemas/
+%dir %{_datadir}/glib-2.0/dtds/
+
+%lang_package -f glib20
+
+%post -n libglib-extension-symbolic
+pushd %{_libdir}
+for FILE in libglib*.so.*.extension-symbolic; do mv "$FILE" "${FILE%.extension-symbolic}"; done
+popd
+
+%files -n libglib-extension-symbolic
+%manifest %{name}.manifest
+%license COPYING
+%{_libdir}/libglib*.so.*.extension-symbolic
+
+%files devel
+%manifest %{name}.manifest
+%defattr(-,root,root)
+%license COPYING
+
+%{_bindir}/gdbus-codegen
+%{_datadir}/bash-completion/completions/*
+%_datadir/glib-2.0/codegen
+
+%{_bindir}/glib-compile-resources
+%{_bindir}/glib-genmarshal
+%{_bindir}/glib-gettextize
+%{_bindir}/glib-mkenums
+%{_bindir}/gobject-query
+%{_bindir}/gtester
+%{_bindir}/gtester-report
+%dir %{_datadir}/aclocal
+%{_datadir}/aclocal/glib-2.0.m4
+%{_datadir}/aclocal/glib-gettext.m4
+%{_datadir}/aclocal/gsettings.m4
+%dir %{_datadir}/glib-2.0/
+%{_datadir}/glib-2.0/gdb/
+%{_datadir}/glib-2.0/gettext/
+%{_datadir}/glib-2.0/schemas/gschema.dtd
+%{_datadir}/glib-2.0/dtds/gresource.dtd
+%{_datadir}/glib-2.0/valgrind/glib.supp
+%{_includedir}/glib-2.0
+%{_includedir}/gio-unix-2.0
+%{_libdir}/lib*.so
+%dir %{_libdir}/glib-2.0/
+%{_libdir}/glib-2.0/include/
+%{_libdir}/pkgconfig/*.pc
+%{_datadir}/gdb/auto-load/%{_libdir}/*-gdb.py
+%{_datadir}/gettext/its/gschema.*
+%if 0%{?with_systemtap}
+%{_datadir}/systemtap/tapset/*.stp
+%endif
+%{_sysconfdir}/rpm/macros.glib2
+# Own these directories to not depend on gdb
+%dir %{_datadir}/gdb
+%dir %{_datadir}/gdb/auto-load
+%dir %{_datadir}/gdb/auto-load%{_prefix}
+%dir %{_datadir}/gdb/auto-load%{_libdir}
+
+%files devel-static
+%manifest %{name}.manifest
+%defattr(-,root,root)
+%license COPYING
+%{_libdir}/lib*.a
+%{_libdir}/lib*.a.extension-symbolic
+
+%files tests
+%manifest %{name}.manifest
+%license COPYING LICENSE.MIT
+%{relative_dbus_tests_base_dir}/test-suites/glib-tests/
+%{relative_dbus_tests_base_dir}/runner/glib-tests
+
+%changelog
diff --git a/packaging/gtk-doc.m4 b/packaging/gtk-doc.m4
new file mode 100644 (file)
index 0000000..0ada151
--- /dev/null
@@ -0,0 +1,67 @@
+dnl -*- mode: autoconf -*-
+
+# serial 1
+
+dnl Usage:
+dnl   GTK_DOC_CHECK([minimum-gtk-doc-version])
+AC_DEFUN([GTK_DOC_CHECK],
+[
+  AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+  AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
+  AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first
+
+  dnl check for tools we added during development
+  AC_PATH_PROG([GTKDOC_CHECK],[gtkdoc-check])
+  AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true])
+  AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf])
+
+  dnl for overriding the documentation installation directory
+  AC_ARG_WITH([html-dir],
+    AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),,
+    [with_html_dir='${datadir}/gtk-doc/html'])
+  HTML_DIR="$with_html_dir"
+  AC_SUBST([HTML_DIR])
+
+  dnl enable/disable documentation building
+  AC_ARG_ENABLE([gtk-doc],
+    AS_HELP_STRING([--enable-gtk-doc],
+                   [use gtk-doc to build documentation [[default=no]]]),,
+    [enable_gtk_doc=no])
+
+  if test x$enable_gtk_doc = xyes; then
+    ifelse([$1],[],
+      [PKG_CHECK_EXISTS([gtk-doc],,
+                        AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))],
+      [PKG_CHECK_EXISTS([gtk-doc >= $1],,
+                        AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build $PACKAGE_NAME]))])
+    dnl don't check for glib if we build glib
+    if test "x$PACKAGE_NAME" != "xglib"; then
+      dnl don't fail if someone does not have glib
+      PKG_CHECK_MODULES(GTKDOC_DEPS, glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0,,)
+    fi
+  fi
+
+  AC_MSG_CHECKING([whether to build gtk-doc documentation])
+  AC_MSG_RESULT($enable_gtk_doc)
+
+  dnl enable/disable output formats
+  AC_ARG_ENABLE([gtk-doc-html],
+    AS_HELP_STRING([--enable-gtk-doc-html],
+                   [build documentation in html format [[default=yes]]]),,
+    [enable_gtk_doc_html=yes])
+    AC_ARG_ENABLE([gtk-doc-pdf],
+      AS_HELP_STRING([--enable-gtk-doc-pdf],
+                     [build documentation in pdf format [[default=no]]]),,
+      [enable_gtk_doc_pdf=no])
+
+  if test -z "$GTKDOC_MKPDF"; then
+    enable_gtk_doc_pdf=no
+  fi
+
+
+  AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes])
+  AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes])
+  AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes])
+  AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"])
+  AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"])
+])
diff --git a/packaging/macros.glib2 b/packaging/macros.glib2
new file mode 100644 (file)
index 0000000..f682995
--- /dev/null
@@ -0,0 +1,73 @@
+# RPM macros for packages installing a GSettings schema or GIO module
+#
+###
+#
+# When a package installs a GSettings schemas, it should use all
+# three macros:
+#
+#  - %glib2_gsettings_schema_requires in the preamble
+#  - %glib2_gsettings_schema_post in %post
+#  - %glib2_gsettings_schema_postun in %postun
+#
+###
+#
+# When a package installs a GIO module, it should use all
+# three macros:
+#
+#  - %glib2_gio_module_requires in the preamble
+#  - %glib2_gio_module_post in %post
+#  - %glib2_gio_module_postun in %postun
+#
+# Note that %glib2_gio_module_post and %glib2_gio_module_postun can
+# optionally take the path to the directory where modules live. This
+# is useful for applications using the GIO module system on their own,
+# since they will install modules in their own directory. If no
+# argument is passed, the path for the modules for GIO itself is used.
+#
+###
+
+%glib2_gsettings_schema_requires                                \
+Requires(post): glib2-tools                                     \
+Requires(postun): glib2-tools
+
+%glib2_gsettings_schema_post                                    \
+%{_bindir}/glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
+
+# Note: we ignore upgrades (already handled in %post of the new package).
+%glib2_gsettings_schema_postun                                  \
+if [ $1 -eq 0 ]; then                                           \
+  %{_bindir}/glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || : \
+fi
+
+%glib2_gio_module_requires                                      \
+Requires(post): glib2-tools                                     \
+Requires(postun): glib2-tools
+
+# On install, update the cache
+%glib2_gio_module_post()                                        \
+%if "x%1" != "x%%1"                                             \
+  GIO_MODULES_DIR="%1"                                          \
+%else                                                           \
+  GIO_MODULES_DIR="%{_libdir}/gio/modules"                      \
+%endif                                                          \
+%if "%{_lib}" == "lib64"                                        \
+  %{_bindir}/gio-querymodules-64 "${GIO_MODULES_DIR}"           \
+%else                                                           \
+  %{_bindir}/gio-querymodules "${GIO_MODULES_DIR}"              \
+%endif
+
+# On uninstall, update the cache. Note: we ignore upgrades (already
+# handled in %post of the new package).
+%glib2_gio_module_postun()                                      \
+if [ $1 -eq 0 ]; then                                           \
+  %if "x%1" != "x%%1"                                           \
+    GIO_MODULES_DIR="%1"                                        \
+  %else                                                         \
+    GIO_MODULES_DIR="%{_libdir}/gio/modules"                    \
+  %endif                                                        \
+  %if "%_lib" == "lib64"                                        \
+    %{_bindir}/gio-querymodules-64 "${GIO_MODULES_DIR}"         \
+  %else                                                         \
+    %{_bindir}/gio-querymodules "${GIO_MODULES_DIR}"            \
+  %endif                                                        \
+fi
diff --git a/packaging/test-runner.c b/packaging/test-runner.c
new file mode 100644 (file)
index 0000000..c0fc198
--- /dev/null
@@ -0,0 +1,532 @@
+/*
+ * This file contains standalone test-runner.
+ * This file is NOT part of GLib project.
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ * Author: Kazimierz Krosman <k.krosman@samsung.com>
+ *
+ * MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/select.h>
+#include <sys/time.h>
+#include <ctype.h>
+#include <time.h>
+#include <sys/select.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <assert.h>
+#include <stdbool.h>
+
+#define MAX_TC_NUM 1024
+#define MAX_BUFFER (64*1024)
+#define MAX_COMMENT 1024
+
+enum {
+        INIT_TEST,
+        NEW_STDOUT,
+        NEW_STDERR,
+        RESULT_CODE,
+        RESULT_SIGNAL,
+        RESULT_ERROR,
+        RESULT_TIMEOUT
+};
+
+struct test_result {
+        bool is_positive;
+        char comment[MAX_COMMENT];
+        char result[MAX_COMMENT];
+        char name[MAX_COMMENT];
+};
+
+struct test_case {
+        const char* name;
+        const char* description;
+};
+
+struct binary {
+        const char* path;
+        const char* name;
+        struct test_case* test_cases;
+        int timeout;
+
+        char** (*prepare_args) (const struct binary* b, const char* test_name);
+        void (*parse) (const struct binary* b, const char* test_name, char* buffer, int state_change, int state_option);
+        int (*init)(void);
+        int (*clean)(void);
+};
+
+char* get_test_id(char* dest, const struct binary* b, const char* test_name);
+void add_test_result(const char* test_id, const char* result, const char* comment, int res);
+
+enum {
+        PIPE_READ,
+        PIPE_WRITE,
+};
+
+void parse_test_state(const struct binary* b, const char* test_name, char* buffer, int state_change, int state_option);
+void parse_one_test_one_binary(const struct binary* b, const char* test_name, char* buffer, int state_change, int state_option);
+char** prepare_args_for_binary(const struct binary* b, const char* test_name);
+
+static struct test_case test_case_desc_01[] = {
+        {"", "Checks if the library supports format of addresses described in the D-Bus specification (key/value pairs for each transport are valid)"},
+        {NULL, NULL}
+};
+
+static struct test_case test_case_desc_02[] = {
+        {"", "Test case for GNOME #662395"},
+        {NULL, NULL}
+};
+
+static struct test_case test_case_desc_03[] = {
+        {"", "Test dbus authentication methods"},
+        {NULL, NULL}
+};
+
+static struct test_case test_case_desc_04[] = {
+        {"", "Test 'lock' and 'copy' operations on GDBusMessage object"},
+        {NULL, NULL}
+};
+
+static struct test_case test_case_desc_05[] = {
+        {"", "Test 'non-socket' connections (connection via pipes and GIOStreams objects)"},
+        {NULL, NULL}
+};
+
+static struct test_case test_case_desc_06[] = {
+        {"", "Test overflowing socket buffer in producer/consumer scenario (UNIX sockets as a transport mechanism)"},
+        {NULL, NULL}
+};
+
+static struct test_case test_case_desc_07[] = {
+        {"", "Test that peer-to-peer connections work"},
+        {NULL, NULL}
+};
+
+static struct test_case test_case_desc_08[] = {
+        {"", "Test that peer-to-peer connections work (using GDBusObjectManagerServer and GDBusObjectManager objects)"},
+        {NULL, NULL}
+};
+
+/* This table is used to start binaries */
+struct binary tests[] = {
+        /*path, name, TC_table, timeout in us, prepare_args_handler, parse_function_handler, init_handler, clean_handler*/
+        {TESTS_DIR "/gdbus-addresses",               "gdbus-addresses",               test_case_desc_01, 5000*1000, prepare_args_for_binary, parse_one_test_one_binary, NULL, NULL},
+        {TESTS_DIR "/gdbus-connection-flush",        "gdbus-connection-flush",        test_case_desc_02, 5000*1000, prepare_args_for_binary, parse_one_test_one_binary, NULL, NULL},
+        {TESTS_DIR "/gdbus-server-auth",             "gdbus-server-auth",             test_case_desc_03, 5000*1000, prepare_args_for_binary, parse_one_test_one_binary, NULL, NULL},
+        {TESTS_DIR "/gdbus-message",                 "gdbus-message",                 test_case_desc_04, 5000*1000, prepare_args_for_binary, parse_one_test_one_binary, NULL, NULL},
+        {TESTS_DIR "/gdbus-non-socket",              "gdbus-non-socket",              test_case_desc_05, 5000*1000, prepare_args_for_binary, parse_one_test_one_binary, NULL, NULL},
+        {TESTS_DIR "/gdbus-overflow",                "gdbus-overflow",                test_case_desc_06, 5000*1000, prepare_args_for_binary, parse_one_test_one_binary, NULL, NULL},
+        {TESTS_DIR "/gdbus-peer",                    "gdbus-peer",                    test_case_desc_07, 5000*1000, prepare_args_for_binary, parse_one_test_one_binary, NULL, NULL},
+        {TESTS_DIR "/gdbus-peer-object-manager",     "gdbus-peer-object-manager",     test_case_desc_08, 5000*1000, prepare_args_for_binary, parse_one_test_one_binary, NULL, NULL},
+};
+
+static char* args[3];
+char** prepare_args_for_binary(const struct binary* b, const char* test_name)
+{
+        args[0] = (char*)b->name;
+        args[1] = NULL;
+        return args;
+}
+
+void parse_one_test_one_binary(const struct binary* b, const char* test_name, char* buffer, int state_change, int state_option)
+{
+        char test_id[MAX_COMMENT];
+
+        switch(state_change) {
+        case INIT_TEST:
+                break;
+        case NEW_STDOUT:
+                buffer[state_option] = 0;
+                get_test_id(test_id, b, test_name);
+                fprintf(stderr, "[stdout][%s]%s\n",test_id, buffer);
+                break;
+        case NEW_STDERR:
+                buffer[state_option] = 0;
+                get_test_id(test_id, b, test_name);
+                fprintf(stderr, "[stderr][%s]%s\n",test_id, buffer);
+                break;
+        case RESULT_CODE:
+                get_test_id(test_id, b, test_name);
+                if (state_option == 0)
+                        add_test_result(test_id, "PASS", "", 1);
+                else if (state_option == 77)
+                        add_test_result(test_id, "SKIP", "", 0);
+                else
+                        add_test_result(test_id, "FAIL", "", 0);
+                break;
+        case RESULT_SIGNAL:
+                get_test_id(test_id, b, test_name);
+                add_test_result(test_id, "FAIL", "Finished by SIGNAL", 0);
+                break;
+        case RESULT_TIMEOUT:
+                get_test_id(test_id, b, test_name);
+                add_test_result(test_id, "FAIL", "Test TIMEOUT", 0);
+                break;
+        }
+}
+
+static struct option long_options[] = {
+        {"list",        no_argument,       0, 'l'},
+        {"run",         required_argument, 0, 'r'},
+        {"description", required_argument, 0, 'd'},
+        {0,             0,                 0,  0 }
+};
+
+static int stdin_pipe[2];
+static int stdout_pipe[2];
+static int stderr_pipe[2];
+static int gravedigger_pipe[2];
+static char buffer[MAX_BUFFER];
+static const char* requested_tc[MAX_TC_NUM];
+
+char* get_test_id(char* dest, const struct binary* b, const char* test_name)
+{
+        int len = strlen(b->name);
+        memcpy(dest, b->name, len);
+        memcpy(dest + len, test_name, strlen(test_name)+1);
+        return dest;
+}
+
+static void print_description(const char* name, const char* description)
+{
+        printf("%s;%s\n",name, description);
+}
+
+static void print_list(const char* test_name)
+{
+        unsigned int i;
+        char full_name[MAX_COMMENT];
+        for (i = 0;i < sizeof(tests)/sizeof(struct binary); i++) {
+                int j = 0;
+                int l = strlen(tests[i].name);
+                memcpy(full_name, tests[i].name, l+1);
+                if (test_name && strncmp(test_name, full_name, l) != 0)
+                        continue;
+
+                while (tests[i].test_cases[j].name) {
+                        memcpy(full_name + l, tests[i].test_cases[j].name, strlen(tests[i].test_cases[j].name) + 1);
+                        if (!test_name || strncmp(full_name, test_name, sizeof(full_name)) == 0)
+                                print_description(full_name,tests[i].test_cases[j].description);
+                        j++;
+                }
+        }
+}
+
+
+static void stop_binary(const struct binary* b, pid_t pid, const char* test_name, int w_res)
+{
+        int status = 0;
+        int res = 0;
+        if (w_res == 0)
+                res = waitpid(pid, &status, WNOHANG);
+        else
+                res = waitpid(pid, &status, 0);
+
+        if (res == 0) {
+                //timeouted
+                kill(pid, SIGKILL);
+                res = waitpid(pid, &status, WNOHANG);
+                b->parse(b, test_name, buffer, RESULT_TIMEOUT, res);
+        } else if (res < 0) {
+                //errno check
+                kill(pid, SIGKILL);
+                res = waitpid(pid, &status, WNOHANG);
+                b->parse(b, test_name, buffer, RESULT_ERROR, res);
+        } else if (res > 0) {
+                if (WIFEXITED(status)) {
+                        b->parse(b, test_name, buffer, RESULT_CODE, WEXITSTATUS(status));
+                } else if (WIFSIGNALED(status)) {
+                        b->parse(b, test_name, buffer, RESULT_SIGNAL, WTERMSIG(status));
+                } else if (WIFSTOPPED(status)) {
+                        b->parse(b, test_name, buffer, RESULT_SIGNAL, WSTOPSIG(status));
+        } else if (WIFCONTINUED(status)) {
+                        kill(pid, SIGKILL);
+                        b->parse(b, test_name, buffer, RESULT_SIGNAL, -1);
+                }
+        }
+}
+
+static void parse_output_with_timeout(const struct binary* b, pid_t pid, const char* test_name)
+{
+        struct timeval tv;
+        fd_set rfds;
+        int nfds;
+        int res;
+        int w_res = 0;
+        tv.tv_sec = b->timeout/(1000*1000);
+        tv.tv_usec = (b->timeout-tv.tv_sec*1000*1000);
+        while (1) {
+                FD_ZERO(&rfds);
+                if (stdout_pipe[PIPE_READ] > -1) {
+                        assert(stdout_pipe[PIPE_READ] > -1);
+                        assert(stdout_pipe[PIPE_READ] < 1024);
+                        FD_SET(stdout_pipe[PIPE_READ], &rfds);
+                }
+                if (stderr_pipe[PIPE_READ] > -1) {
+                        assert(stderr_pipe[PIPE_READ] > -1);
+                        assert(stderr_pipe[PIPE_READ] < 1024);
+                        FD_SET(stderr_pipe[PIPE_READ], &rfds);
+                }
+                FD_SET(gravedigger_pipe[PIPE_READ], &rfds);
+
+                nfds = select(FD_SETSIZE, &rfds, NULL, NULL, &tv);
+                if (nfds == -1) {
+                        if (errno != EINTR) {
+                                w_res = 0;
+                                break;
+                        }
+                } else if (nfds > 0) {
+                        if (stdout_pipe[PIPE_READ] > -1 && FD_ISSET(stdout_pipe[PIPE_READ], &rfds)) {
+                                res = read(stdout_pipe[PIPE_READ], buffer, MAX_BUFFER-1);
+                                if (res == 0 || (res < 0 && errno != EINTR)) {
+                                        close (stdout_pipe[PIPE_READ]);
+                                        stdout_pipe[PIPE_READ] = -1;
+                                        continue;
+                                } else if (res >=0) {
+                                        b->parse(b, test_name, buffer, NEW_STDOUT, res);
+                                }
+                        }
+
+                        if (stderr_pipe[PIPE_READ] > -1 && FD_ISSET(stderr_pipe[PIPE_READ], &rfds)) {
+                                res = read(stderr_pipe[PIPE_READ], buffer, MAX_BUFFER-1);
+                                if (res == 0 || (res < 0 && errno != EINTR)) {
+                                        close (stderr_pipe[PIPE_READ]);
+                                        stderr_pipe[PIPE_READ] = -1;
+                                        continue;
+                                }
+                                b->parse(b, test_name, buffer, NEW_STDERR, res);
+                        }
+
+                        if (FD_ISSET(gravedigger_pipe[PIPE_READ], &rfds)) {
+                                w_res = 1;
+                                break; //it has ended
+                        }
+                } else {
+                        //timeout
+                        w_res = 0;
+                        break;
+                }
+        }
+        stop_binary(b, pid, test_name, w_res);
+}
+
+static int create_child(const char* path, char* const arguments[])
+{
+        int child;
+        int nResult;
+        if (pipe(gravedigger_pipe) < 0) {
+                perror("allocating pipe for gravedigger failed");
+                goto error1;
+        }
+
+        if (pipe(stdin_pipe) < 0) {
+                perror("allocating pipe for child input redirect failed");
+                goto error1;
+        }
+
+        if (pipe(stdout_pipe) < 0) {
+                perror("allocating pipe for child output redirect failed");
+                goto error2;
+        }
+
+        if (pipe(stderr_pipe) < 0) {
+                perror("allocating pipe for child output redirect failed");
+                goto error3;
+        }
+
+        child = fork();
+        if (!child) {
+                char ld_path[512];
+                sprintf(ld_path, TESTS_DIR ":");
+                // redirect stdin
+                if (dup2(stdin_pipe[PIPE_READ], STDIN_FILENO) == -1) {
+                        perror("redirecting stdin failed");
+                        return -1;
+                }
+
+                if (dup2(stdout_pipe[PIPE_WRITE], STDOUT_FILENO) == -1) {
+                        perror("redirecting stdout failed");
+                        return -1;
+                }
+
+                if (dup2(stderr_pipe[PIPE_WRITE], STDERR_FILENO) == -1) {
+                        perror("redirecting stderr failed");
+                        return -1;
+                }
+
+                close(stdin_pipe[PIPE_READ]);
+                close(stdin_pipe[PIPE_WRITE]);
+                close(stdout_pipe[PIPE_READ]);
+                close(stdout_pipe[PIPE_WRITE]);
+                close(stderr_pipe[PIPE_READ]);
+                close(stderr_pipe[PIPE_WRITE]);
+                close(gravedigger_pipe[PIPE_READ]);
+
+                char* ld_path_b = getenv("LD_LIBRARY_PATH");
+                if (ld_path_b != NULL)
+                        memcpy(ld_path + strlen(ld_path), ld_path_b, strlen(ld_path_b)+1);
+                setenv("LD_LIBRARY_PATH", ld_path, 1);
+                setenv("G_TEST_SRCDIR", TESTS_DIR, 1);
+
+                // run child process image
+                nResult = execv(path, arguments);
+
+                // if we get here at all, an error occurred, but we are in the child
+                // process, so just exit
+                perror("exec of the child process  failed");
+                exit(nResult);
+        } else if (child > 0) {
+                // close unused file descriptors, these are for child only
+                close(stdin_pipe[PIPE_READ]);
+                close(stdout_pipe[PIPE_WRITE]);
+                close(stderr_pipe[PIPE_WRITE]);
+                close(gravedigger_pipe[PIPE_WRITE]);
+        } else {
+                // failed to create child
+                goto error4;
+        }
+
+        return child;
+
+error4:
+        close(stderr_pipe[PIPE_READ]);
+        close(stderr_pipe[PIPE_WRITE]);
+error3:
+        close(stdout_pipe[PIPE_READ]);
+        close(stdout_pipe[PIPE_WRITE]);
+error2:
+        close(stdin_pipe[PIPE_READ]);
+        close(stdin_pipe[PIPE_WRITE]);
+error1:
+        return -1;
+}
+
+static void run_test(const struct binary* b, const char* test_name)
+{
+        int res = -1;
+        char** arg;
+        char test_id[MAX_COMMENT];
+
+        assert(b);
+        assert(b->name);
+        assert(b->path);
+        assert(test_name);
+
+        arg = b->prepare_args(b, test_name);
+
+        if (b->init)
+                if (!b->init()) {
+                        add_test_result(get_test_id(test_id, b, test_name), "ERROR", "Cannot init test", 0);
+                        return;
+                }
+
+        res = create_child(b->path, arg);
+        if (res > 0)
+                parse_output_with_timeout(b, res, test_name);
+        else
+                add_test_result(get_test_id(test_id, b, test_name), "ERROR", "Cannot start test", 0);
+
+        if (b->clean)
+                b->clean();
+}
+
+static void parse_run_test(const char* tc) {
+        unsigned int i = 0;
+        for (i = 0;i < sizeof(tests)/sizeof(struct binary); i++) {
+                int len = strlen(tests[i].name);
+                if (strncmp(tc, tests[i].name, len) == 0) {
+                        if (tc[len] == '*' || tc[len] == '\0')
+                                run_test(&tests[i], "");
+            else
+                                run_test(&tests[i], tc + len);
+                }
+        }
+}
+
+static int parse_option(int argc, char* argv[])
+{
+        int ch = 0;
+        int c = 0;
+        while ((ch = getopt_long(argc, argv, "lr:d:", long_options, NULL)) != -1) {
+                switch (ch) {
+                case 'l':
+                        print_list(NULL);
+                        return 1;
+                case 'r':
+                        if (c >= MAX_TC_NUM - 1) //NULL at the end
+                                return 0;
+
+                        if (optarg)
+                                requested_tc[c++] = optarg;
+
+                        break;
+                case 'd':
+                        print_list(optarg);
+            return 1;
+                }
+        }
+        return 0;
+}
+
+void add_test_result(const char* test_id, const char* result, const char* comment, int res)
+{
+       printf("%s;%s;%s\n", test_id, result, comment);
+       fflush(stdout);
+}
+
+static void prepare_results(void)
+{
+}
+
+int main(int argc, char* argv[])
+{
+        unsigned int i;
+        signal(SIGPIPE, SIG_IGN);
+        if (parse_option(argc, argv))
+                return 0;
+
+        prepare_results();
+
+        if (!requested_tc[0]) {
+                for (i = 0;i < sizeof(tests)/sizeof(struct binary); i++)
+                    run_test(&tests[i], "");
+        } else {
+                i = 0;
+                while(requested_tc[i]) {
+                    parse_run_test(requested_tc[i]);
+                        i++;
+                }
+        }
+
+        return 0;
+}