summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitlab-ci.yml4
-rwxr-xr-x.gitlab-ci/meson-junit-report.py2
-rwxr-xr-x.gitlab-ci/run-style-check-diff.sh2
-rwxr-xr-x.gitlab-ci/search-common-ancestor.sh8
-rw-r--r--CONTRIBUTING.md2
-rw-r--r--README.md13
-rw-r--r--SECURITY.md4
-rw-r--r--docs/reference/gio/gio-sections-common.txt13
-rw-r--r--docs/reference/glib/compiling.xml12
-rw-r--r--docs/reference/glib/glib-sections.txt4
-rw-r--r--docs/reference/glib/running.xml7
-rw-r--r--fuzzing/README.md2
-rw-r--r--fuzzing/meson.build2
-rw-r--r--gio/gapplication.c8
-rw-r--r--gio/gapplicationcommandline.c6
-rw-r--r--gio/gdbusauth.c2
-rw-r--r--gio/gdbusconnection.c46
-rw-r--r--gio/gdbusintrospection.c14
-rw-r--r--gio/gdbusmessage.c6
-rw-r--r--gio/gdbusnameowning.c2
-rw-r--r--gio/gdbusnamewatching.c2
-rw-r--r--gio/gdbusobjectmanager.c4
-rw-r--r--gio/gdbusobjectmanagerserver.c2
-rw-r--r--gio/gdbusprivate.c2
-rw-r--r--gio/gdbusprivate.h2
-rw-r--r--gio/gdbusproxy.c14
-rw-r--r--gio/gdbusserver.c14
-rw-r--r--gio/gdbusutils.c16
-rw-r--r--gio/gdtlsconnection.c96
-rw-r--r--gio/gdtlsconnection.h6
-rw-r--r--gio/gioenums.h45
-rw-r--r--gio/glocalfileoutputstream.c31
-rw-r--r--gio/gsettings.c24
-rw-r--r--gio/gsettingsschema-internal.h3
-rw-r--r--gio/gsettingsschema.c18
-rw-r--r--gio/gtestdbus.c2
-rw-r--r--gio/gtlscertificate.c243
-rw-r--r--gio/gtlscertificate.h18
-rw-r--r--gio/gtlsconnection.c96
-rw-r--r--gio/gtlsconnection.h6
-rw-r--r--gio/inotify/inotify-path.c1
-rw-r--r--gio/tests/file.c123
-rw-r--r--gio/tests/gdbus-exit-on-close.c2
-rw-r--r--gio/tests/gsettings.c11
-rw-r--r--gio/tests/gtesttlsbackend.c36
-rw-r--r--gio/tests/org.gtk.schemasourcecheck.gschema.xml3
-rw-r--r--gio/tests/socket.c14
-rw-r--r--gio/tests/testfilemonitor.c8
-rw-r--r--gio/tests/tls-certificate.c177
-rw-r--r--glib.doap2
-rw-r--r--glib.supp2
-rw-r--r--glib/garray.c21
-rw-r--r--glib/gatomic.h22
-rw-r--r--glib/gbitlock.c98
-rw-r--r--glib/gbookmarkfile.c2
-rw-r--r--glib/gerror.c24
-rw-r--r--glib/gerror.h5
-rw-r--r--glib/glib-typeof.h43
-rw-r--r--glib/glib.h1
-rw-r--r--glib/gmacros.h22
-rw-r--r--glib/gmem.h10
-rw-r--r--glib/grcbox.h8
-rw-r--r--glib/gregex.c30
-rw-r--r--glib/gstrvbuilder.c44
-rw-r--r--glib/gstrvbuilder.h11
-rw-r--r--glib/gunicollate.c2
-rw-r--r--glib/gutils.c12
-rw-r--r--glib/gwin32-private.c30
-rw-r--r--glib/gwin32.c275
-rw-r--r--glib/meson.build1
-rw-r--r--glib/tests/atomic.c7
-rw-r--r--glib/tests/error.c22
-rw-r--r--glib/tests/once.c2
-rw-r--r--glib/tests/regex.c5
-rw-r--r--glib/tests/strvbuilder.c37
-rw-r--r--glib/tests/utils.c26
-rw-r--r--glib/tests/win32.c62
-rw-r--r--gmodule/gmodule-dl.c54
-rw-r--r--gobject/gobject.c5
-rw-r--r--gobject/gobject.h7
-rw-r--r--gobject/gtype.c3
-rw-r--r--po/he.po1788
-rw-r--r--subprojects/gtk-doc.wrap2
-rw-r--r--tests/gobject/references.c3
-rw-r--r--tests/slice-threadinit.c2
85 files changed, 2475 insertions, 1393 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 05e473138..3c8e7c834 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -170,7 +170,7 @@ installed-tests:
# FIXME install newer gobject-introspection
# with GMemoryMonitor support, see:
# https://gitlab.gnome.org/GNOME/gobject-introspection/merge_requests/193
- - git clone --branch master --depth 1 --no-tags https://gitlab.gnome.org/GNOME/gobject-introspection.git
+ - git clone --single-branch --depth 1 --no-tags https://gitlab.gnome.org/GNOME/gobject-introspection.git
- cd gobject-introspection
- /usr/bin/meson _build --prefix=/usr --libdir=/usr/lib64
- ninja -C _build
@@ -513,7 +513,7 @@ coverity:
pages:
stage: deploy
only:
- - master
+ - main
needs: ['coverage', 'style-check-diff']
script:
- mv _coverage/ public/
diff --git a/.gitlab-ci/meson-junit-report.py b/.gitlab-ci/meson-junit-report.py
index 1855b4907..1d57ead50 100755
--- a/.gitlab-ci/meson-junit-report.py
+++ b/.gitlab-ci/meson-junit-report.py
@@ -27,7 +27,7 @@ aparser.add_argument(
"--branch",
metavar="NAME",
help="Branch of the project being tested",
- default="master",
+ default="main",
)
aparser.add_argument(
"--output",
diff --git a/.gitlab-ci/run-style-check-diff.sh b/.gitlab-ci/run-style-check-diff.sh
index a04bd0731..929cf28a4 100755
--- a/.gitlab-ci/run-style-check-diff.sh
+++ b/.gitlab-ci/run-style-check-diff.sh
@@ -25,7 +25,7 @@ exit_status=$?
# style with the changes they’re making.)
echo ""
echo "Note that clang-format output is advisory and cannot always match the GLib coding style, documented at"
-echo " https://gitlab.gnome.org/GNOME/gtk/blob/master/docs/CODING-STYLE"
+echo " https://gitlab.gnome.org/GNOME/gtk/blob/HEAD/docs/CODING-STYLE.md"
echo "Warnings from this tool can be ignored in favour of the documented coding style,"
echo "or in favour of matching the style of existing surrounding code."
diff --git a/.gitlab-ci/search-common-ancestor.sh b/.gitlab-ci/search-common-ancestor.sh
index a7a3ac44c..96f45fe69 100755
--- a/.gitlab-ci/search-common-ancestor.sh
+++ b/.gitlab-ci/search-common-ancestor.sh
@@ -9,7 +9,7 @@ ancestor_horizon=28 # days (4 weeks)
# branches.
#
# Limit the fetch to a certain date horizon to limit the amount of data we get.
-# If the branch was forked from origin/master before this horizon, it should
+# If the branch was forked from origin/main before this horizon, it should
# probably be rebased.
if ! git ls-remote --exit-code upstream >/dev/null 2>&1 ; then
git remote add upstream https://gitlab.gnome.org/GNOME/glib.git
@@ -18,7 +18,7 @@ git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%
# Work out the newest common ancestor between the detached HEAD that this CI job
# has checked out, and the upstream target branch (which will typically be
-# `upstream/master` or `upstream/glib-2-62`).
+# `upstream/main` or `upstream/glib-2-62`).
# `${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}` or `${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}`
# are only defined if we’re running in a merge request pipeline,
# fall back to `${CI_DEFAULT_BRANCH}` or `${CI_COMMIT_BRANCH}` respectively
@@ -29,8 +29,8 @@ git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%
newest_common_ancestor_sha=$(diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "upstream/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_DEFAULT_BRANCH}}") <(git rev-list --first-parent "origin/${source_branch}") | head -1)
if [ -z "${newest_common_ancestor_sha}" ]; then
- echo "Couldn’t find common ancestor with upstream master. This typically"
- echo "happens if you branched from master a long time ago. Please update"
+ echo "Couldn’t find common ancestor with upstream main branch. This typically"
+ echo "happens if you branched from main a long time ago. Please update"
echo "your clone, rebase, and re-push your branch."
exit 1
fi
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 52f17b1d9..ba8039d4c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -256,7 +256,7 @@ to avoid unnecessary breakage, and to take advantage of the knowledge about GLib
that has been built up over the years, we’d like to ask people contributing to
GLib to follow a few rules:
-0. Never push to the `master` branch, or any stable branches, directly; you
+0. Never push to the `main` branch, or any stable branches, directly; you
should always go through a merge request, to ensure that the code is
tested on the CI infrastructure at the very least. A merge request is
also the proper place to get a comprehensive code review from the core
diff --git a/README.md b/README.md
index 9ef3b3d6b..c53dd6f4d 100644
--- a/README.md
+++ b/README.md
@@ -47,3 +47,16 @@ Closes: #123
Otherwise, create a new merge request that introduces the change, filing a
separate issue is not required.
+
+## Default branch renamed to `main`
+
+The default development branch of GLib has been renamed to `main`. To update
+your local checkout, use:
+```sh
+git checkout master
+git branch -m master main
+git fetch
+git branch --unset-upstream
+git branch -u origin/main
+git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main
+```
diff --git a/SECURITY.md b/SECURITY.md
index 4817af76c..3505b2abf 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -63,5 +63,5 @@ additionally be made via
## Acknowledgements
This text was partially based on the
-[github.com/containers security policy](https://github.com/containers/common/blob/master/SECURITY.md),
-and partially based on the [flatpak security policy](https://github.com/flatpak/flatpak/blob/master/SECURITY.md).
+[github.com/containers security policy](https://github.com/containers/common/blob/HEAD/SECURITY.md),
+and partially based on the [flatpak security policy](https://github.com/flatpak/flatpak/blob/HEAD/SECURITY.md).
diff --git a/docs/reference/gio/gio-sections-common.txt b/docs/reference/gio/gio-sections-common.txt
index e38971c12..5151a9d75 100644
--- a/docs/reference/gio/gio-sections-common.txt
+++ b/docs/reference/gio/gio-sections-common.txt
@@ -3667,16 +3667,19 @@ GTlsChannelBindingError
<SUBSECTION>
GTlsAuthenticationMode
GTlsCertificateFlags
+GTlsProtocolVersion
<SUBSECTION Standard>
G_TYPE_TLS_AUTHENTICATION_MODE
G_TYPE_TLS_CERTIFICATE_FLAGS
G_TYPE_TLS_CHANNEL_BINDING_ERROR
G_TYPE_TLS_ERROR
+G_TYPE_TLS_PROTOCOL_VERSION
g_tls_authentication_mode_get_type
g_tls_certificate_flags_get_type
g_tls_channel_binding_error_get_type
g_tls_channel_binding_error_quark
g_tls_error_get_type
+g_tls_protocol_version_get_type
</SECTION>
<SECTION>
@@ -3715,7 +3718,13 @@ g_tls_certificate_new_from_file
g_tls_certificate_new_from_files
g_tls_certificate_new_from_pkcs11_uris
g_tls_certificate_list_new_from_file
+g_tls_certificate_get_dns_names
+g_tls_certificate_get_ip_addresses
g_tls_certificate_get_issuer
+g_tls_certificate_get_issuer_name
+g_tls_certificate_get_not_valid_before
+g_tls_certificate_get_not_valid_after
+g_tls_certificate_get_subject_name
g_tls_certificate_verify
g_tls_certificate_is_same
<SUBSECTION Standard>
@@ -3754,6 +3763,8 @@ g_tls_connection_get_database
g_tls_connection_set_database
g_tls_connection_get_interaction
g_tls_connection_set_interaction
+g_tls_connection_get_protocol_version
+g_tls_connection_get_ciphersuite_name
<SUBSECTION>
g_tls_connection_handshake
g_tls_connection_handshake_async
@@ -3948,6 +3959,8 @@ g_dtls_connection_get_database
g_dtls_connection_set_database
g_dtls_connection_get_interaction
g_dtls_connection_set_interaction
+g_dtls_connection_get_protocol_version
+g_dtls_connection_get_ciphersuite_name
<SUBSECTION>
g_dtls_connection_handshake
g_dtls_connection_handshake_async
diff --git a/docs/reference/glib/compiling.xml b/docs/reference/glib/compiling.xml
index 02971a60f..c7a058c5f 100644
--- a/docs/reference/glib/compiling.xml
+++ b/docs/reference/glib/compiling.xml
@@ -60,13 +60,13 @@ The difference between the two is that gmodule-2.0 adds
which is often not needed.
</para>
<para>
-The simplest way to compile a program is to use the "backticks"
-feature of the shell. If you enclose a command in backticks
-(<emphasis>not single quotes</emphasis>), then its output will
-be substituted into the command line before execution. So to
-compile a GLib Hello, World, you would type the following:
+The simplest way to compile a program is to use command substitution
+feature of a shell. A command written in the format
+<literal>$(command)</literal> gets substituted into the command line
+before execution. So to compile a GLib Hello, World, you would type
+the following:
<programlisting>
-$ cc hello.c `pkg-config --cflags --libs glib-2.0` -o hello
+$ cc hello.c $(pkg-config --cflags --libs glib-2.0) -o hello
</programlisting>
</para>
<note><para>
diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt
index d8a8d7d95..74f7b2149 100644
--- a/docs/reference/glib/glib-sections.txt
+++ b/docs/reference/glib/glib-sections.txt
@@ -749,7 +749,6 @@ G_ANALYZER_ANALYZING
G_ANALYZER_NORETURN
g_autoptr_cleanup_generic_gfree
glib_typeof
-glib_typeof_2_68
g_macro__has_attribute
g_macro__has_builtin
g_macro__has_feature
@@ -786,6 +785,7 @@ g_set_error_literal
g_propagate_error
g_clear_error
g_prefix_error
+g_prefix_error_literal
g_propagate_prefixed_error
<SUBSECTION>
GErrorInitFunc
@@ -1865,6 +1865,8 @@ g_strv_builder_new
g_strv_builder_ref
g_strv_builder_unref
g_strv_builder_add
+g_strv_builder_addv
+g_strv_builder_add_many
g_strv_builder_end
<SUBSECTION>
diff --git a/docs/reference/glib/running.xml b/docs/reference/glib/running.xml
index aaafddf1d..80a8da097 100644
--- a/docs/reference/glib/running.xml
+++ b/docs/reference/glib/running.xml
@@ -201,8 +201,11 @@ How to run and debug your GLib application
reproduced with <literal>G_SLICE=always-malloc</literal>, but will
be caught by <literal>G_SLICE=debug-blocks</literal> is as follows:
<programlisting>
- void *slist = g_slist_alloc (); /* void* gives up type-safety */
- g_list_free (slist); /* corruption: sizeof (GSList) != sizeof (GList) */
+ /* void* gives up type-safety */
+ void *slist = g_slist_alloc ();
+
+ /* corruption: sizeof (GSList) != sizeof (GList) */
+ g_list_free (slist);
</programlisting></para>
</listitem>
</varlistentry>
diff --git a/fuzzing/README.md b/fuzzing/README.md
index 16f5a05bc..21565e396 100644
--- a/fuzzing/README.md
+++ b/fuzzing/README.md
@@ -40,7 +40,7 @@ $ DIR/fuzzing/fuzz_target_name FILE
Correct MSAN instrumentation is [difficult to achieve](https://clang.llvm.org/docs/MemorySanitizer.html#handling-external-code) locally, so false positives are very likely to mask the actual bug.
-If need be, [you can still reproduce](https://github.com/google/oss-fuzz/blob/master/docs/reproducing.md#building-using-docker) those bugs with the oss-fuzz provided docker images.
+If need be, [you can still reproduce](https://google.github.io/oss-fuzz/advanced-topics/reproducing/#building-using-docker) those bugs with the oss-fuzz provided docker images.
###### There are no file/function names in the stack trace.
diff --git a/fuzzing/meson.build b/fuzzing/meson.build
index 32e6c4269..c60dcf446 100644
--- a/fuzzing/meson.build
+++ b/fuzzing/meson.build
@@ -24,7 +24,7 @@ extra_sources = []
extra_c_args = cc.get_supported_arguments('-Werror=unused-function')
# Links in a static library provided by oss-fuzz, else a standalone driver.
-# https://github.com/google/oss-fuzz/blob/master/docs/new_project_guide.md#buildsh-script-environment
+# https://google.github.io/oss-fuzz/getting-started/new-project-guide/#buildsh-script-environment
fuzzing_engine = cxx.find_library('FuzzingEngine', required : get_option('oss_fuzz'))
if fuzzing_engine.found()
deps += fuzzing_engine
diff --git a/gio/gapplication.c b/gio/gapplication.c
index fbb9d4ebe..cbc467a92 100644
--- a/gio/gapplication.c
+++ b/gio/gapplication.c
@@ -155,13 +155,13 @@
* respectively.
*
* For an example of opening files with a GApplication, see
- * [gapplication-example-open.c](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gapplication-example-open.c).
+ * [gapplication-example-open.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gapplication-example-open.c).
*
* For an example of using actions with GApplication, see
- * [gapplication-example-actions.c](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gapplication-example-actions.c).
+ * [gapplication-example-actions.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gapplication-example-actions.c).
*
* For an example of using extra D-Bus hooks with GApplication, see
- * [gapplication-example-dbushooks.c](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gapplication-example-dbushooks.c).
+ * [gapplication-example-dbushooks.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gapplication-example-dbushooks.c).
*/
/**
@@ -2399,7 +2399,7 @@ g_application_open (GApplication *application,
* and override local_command_line(). In this case, you most likely want
* to return %TRUE from your local_command_line() implementation to
* suppress the default handling. See
- * [gapplication-example-cmdline2.c][https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gapplication-example-cmdline2.c]
+ * [gapplication-example-cmdline2.c][https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gapplication-example-cmdline2.c]
* for an example.
*
* If, after the above is done, the use count of the application is zero
diff --git a/gio/gapplicationcommandline.c b/gio/gapplicationcommandline.c
index 5055cf9c1..741aa97f1 100644
--- a/gio/gapplicationcommandline.c
+++ b/gio/gapplicationcommandline.c
@@ -104,7 +104,7 @@
* }
* ]|
* The complete example can be found here:
- * [gapplication-example-cmdline.c](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gapplication-example-cmdline.c)
+ * [gapplication-example-cmdline.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gapplication-example-cmdline.c)
*
* In more complicated cases, the handling of the comandline can be
* split between the launcher and the primary instance.
@@ -155,7 +155,7 @@
* instance.
*
* The complete example can be found here:
- * [gapplication-example-cmdline2.c](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gapplication-example-cmdline2.c)
+ * [gapplication-example-cmdline2.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gapplication-example-cmdline2.c)
*
* If handling the commandline requires a lot of work, it may
* be better to defer it.
@@ -197,7 +197,7 @@
* hold the application until you are done with the commandline.
*
* The complete example can be found here:
- * [gapplication-example-cmdline3.c](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gapplication-example-cmdline3.c)
+ * [gapplication-example-cmdline3.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gapplication-example-cmdline3.c)
*/
/**
diff --git a/gio/gdbusauth.c b/gio/gdbusauth.c
index 534dca2d1..74c178dbf 100644
--- a/gio/gdbusauth.c
+++ b/gio/gdbusauth.c
@@ -960,7 +960,7 @@ _g_dbus_auth_run_server (GDBusAuth *auth,
g_set_error (error,
G_IO_ERROR,
G_IO_ERROR_FAILED,
- "The given guid '%s' is not valid",
+ "The given GUID '%s' is not valid",
guid);
goto out;
}
diff --git a/gio/gdbusconnection.c b/gio/gdbusconnection.c
index 7c20462eb..8ce70a93d 100644
--- a/gio/gdbusconnection.c
+++ b/gio/gdbusconnection.c
@@ -166,22 +166,22 @@
* ## An example D-Bus server # {#gdbus-server}
*
* Here is an example for a D-Bus server:
- * [gdbus-example-server.c](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gdbus-example-server.c)
+ * [gdbus-example-server.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-server.c)
*
* ## An example for exporting a subtree # {#gdbus-subtree-server}
*
* Here is an example for exporting a subtree:
- * [gdbus-example-subtree.c](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gdbus-example-subtree.c)
+ * [gdbus-example-subtree.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-subtree.c)
*
* ## An example for file descriptor passing # {#gdbus-unix-fd-client}
*
* Here is an example for passing UNIX file descriptors:
- * [gdbus-unix-fd-client.c](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gdbus-example-unix-fd-client.c)
+ * [gdbus-unix-fd-client.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-unix-fd-client.c)
*
* ## An example for exporting a GObject # {#gdbus-export}
*
* Here is an example for exporting a #GObject:
- * [gdbus-example-export.c](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gdbus-example-export.c)
+ * [gdbus-example-export.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-export.c)
*/
/* ---------------------------------------------------------------------------------------------------- */
@@ -386,7 +386,7 @@ struct _GDBusConnection
*/
gchar *bus_unique_name;
- /* The GUID returned by the other side if we authenticed as a client or
+ /* The GUID returned by the other side if we authenticated as a client or
* the GUID to use if authenticating as a server.
* Read-only after initable_init(), so it may be read if you either
* hold @init_lock or check for initialization first.
@@ -902,6 +902,15 @@ g_dbus_connection_class_init (GDBusConnectionClass *klass)
* of the other peer here after the connection has been successfully
* initialized.
*
+ * Note that the
+ * [D-Bus specification](https://dbus.freedesktop.org/doc/dbus-specification.html#addresses)
+ * uses the term ‘UUID’ to refer to this, whereas GLib consistently uses the
+ * term ‘GUID’ for historical reasons.
+ *
+ * Despite its name, the format of #GDBusConnection:guid does not follow
+ * [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122) or the Microsoft
+ * GUID format.
+ *
* Since: 2.26
*/
g_object_class_install_property (gobject_class,
@@ -5052,7 +5061,8 @@ validate_and_maybe_schedule_method_call (GDBusConnection *connection,
static gboolean
obj_message_func (GDBusConnection *connection,
ExportedObject *eo,
- GDBusMessage *message)
+ GDBusMessage *message,
+ gboolean *object_found)
{
const gchar *interface_name;
const gchar *member;
@@ -5088,6 +5098,10 @@ obj_message_func (GDBusConnection *connection,
ei->user_data);
goto out;
}
+ else
+ {
+ *object_found = TRUE;
+ }
}
if (g_strcmp0 (interface_name, "org.freedesktop.DBus.Introspectable") == 0 &&
@@ -7113,6 +7127,7 @@ distribute_method_call (GDBusConnection *connection,
const gchar *path;
gchar *subtree_path;
gchar *needle;
+ gboolean object_found = FALSE;
g_assert (g_dbus_message_get_message_type (message) == G_DBUS_MESSAGE_TYPE_METHOD_CALL);
@@ -7154,7 +7169,7 @@ distribute_method_call (GDBusConnection *connection,
eo = g_hash_table_lookup (connection->map_object_path_to_eo, object_path);
if (eo != NULL)
{
- if (obj_message_func (connection, eo, message))
+ if (obj_message_func (connection, eo, message, &object_found))
goto out;
}
@@ -7179,11 +7194,22 @@ distribute_method_call (GDBusConnection *connection,
goto out;
/* if we end up here, the message has not been not handled - so return an error saying this */
- reply = g_dbus_message_new_method_error (message,
+ if (object_found == TRUE)
+ {
+ reply = g_dbus_message_new_method_error (message,
+ "org.freedesktop.DBus.Error.UnknownMethod",
+ _("No such interface “%s” on object at path %s"),
+ interface_name,
+ object_path);
+ }
+ else
+ {
+ reply = g_dbus_message_new_method_error (message,
"org.freedesktop.DBus.Error.UnknownMethod",
- _("No such interface “%s” on object at path %s"),
- interface_name,
+ _("Object does not exist at path “%s”"),
object_path);
+ }
+
g_dbus_connection_send_message_unlocked (connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL);
g_object_unref (reply);
diff --git a/gio/gdbusintrospection.c b/gio/gdbusintrospection.c
index f35b2fb44..d6aa445d5 100644
--- a/gio/gdbusintrospection.c
+++ b/gio/gdbusintrospection.c
@@ -98,7 +98,7 @@ typedef struct
* If @info is statically allocated does nothing. Otherwise increases
* the reference count.
*
- * Returns: The same @info.
+ * Returns: (not nullable): The same @info.
*
* Since: 2.26
*/
@@ -118,7 +118,7 @@ g_dbus_node_info_ref (GDBusNodeInfo *info)
* If @info is statically allocated does nothing. Otherwise increases
* the reference count.
*
- * Returns: The same @info.
+ * Returns: (not nullable): The same @info.
*
* Since: 2.26
*/
@@ -138,7 +138,7 @@ g_dbus_interface_info_ref (GDBusInterfaceInfo *info)
* If @info is statically allocated does nothing. Otherwise increases
* the reference count.
*
- * Returns: The same @info.
+ * Returns: (not nullable): The same @info.
*
* Since: 2.26
*/
@@ -158,7 +158,7 @@ g_dbus_method_info_ref (GDBusMethodInfo *info)
* If @info is statically allocated does nothing. Otherwise increases
* the reference count.
*
- * Returns: The same @info.
+ * Returns: (not nullable): The same @info.
*
* Since: 2.26
*/
@@ -178,7 +178,7 @@ g_dbus_signal_info_ref (GDBusSignalInfo *info)
* If @info is statically allocated does nothing. Otherwise increases
* the reference count.
*
- * Returns: The same @info.
+ * Returns: (not nullable): The same @info.
*
* Since: 2.26
*/
@@ -198,7 +198,7 @@ g_dbus_property_info_ref (GDBusPropertyInfo *info)
* If @info is statically allocated does nothing. Otherwise increases
* the reference count.
*
- * Returns: The same @info.
+ * Returns: (not nullable): The same @info.
*
* Since: 2.26
*/
@@ -218,7 +218,7 @@ g_dbus_arg_info_ref (GDBusArgInfo *info)
* If @info is statically allocated does nothing. Otherwise increases
* the reference count.
*
- * Returns: The same @info.
+ * Returns: (not nullable): The same @info.
*
* Since: 2.26
*/
diff --git a/gio/gdbusmessage.c b/gio/gdbusmessage.c
index bc9386ee7..e36d1fe88 100644
--- a/gio/gdbusmessage.c
+++ b/gio/gdbusmessage.c
@@ -3216,7 +3216,9 @@ g_dbus_message_set_error_name (GDBusMessage *message,
*
* Convenience getter for the %G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE header field.
*
- * Returns: The value.
+ * This will always be non-%NULL, but may be an empty string.
+ *
+ * Returns: (not nullable): The value.
*
* Since: 2.26
*/
@@ -3488,7 +3490,7 @@ _sort_keys_func (gconstpointer a,
* fd 12: dev=0:10,mode=020620,ino=5,uid=500,gid=5,rdev=136:2,size=0,atime=1273085037,mtime=1273085851,ctime=1272982635
* ]|
*
- * Returns: A string that should be freed with g_free().
+ * Returns: (not nullable): A string that should be freed with g_free().
*
* Since: 2.26
*/
diff --git a/gio/gdbusnameowning.c b/gio/gdbusnameowning.c
index a667d6ff5..328354be4 100644
--- a/gio/gdbusnameowning.c
+++ b/gio/gdbusnameowning.c
@@ -39,7 +39,7 @@
* Convenience API for owning bus names.
*
* A simple example for owning a name can be found in
- * [gdbus-example-own-name.c](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gdbus-example-own-name.c)
+ * [gdbus-example-own-name.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-own-name.c)
*/
G_LOCK_DEFINE_STATIC (lock);
diff --git a/gio/gdbusnamewatching.c b/gio/gdbusnamewatching.c
index f6209ecab..40aee5a3c 100644
--- a/gio/gdbusnamewatching.c
+++ b/gio/gdbusnamewatching.c
@@ -40,7 +40,7 @@
* Convenience API for watching bus names.
*
* A simple example for watching a name can be found in
- * [gdbus-example-watch-name.c](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gdbus-example-watch-name.c)
+ * [gdbus-example-watch-name.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-watch-name.c)
*/
G_LOCK_DEFINE_STATIC (lock);
diff --git a/gio/gdbusobjectmanager.c b/gio/gdbusobjectmanager.c
index 87634cd83..169e7d16f 100644
--- a/gio/gdbusobjectmanager.c
+++ b/gio/gdbusobjectmanager.c
@@ -213,7 +213,7 @@ g_dbus_object_manager_get_objects (GDBusObjectManager *manager)
*
* Gets the #GDBusObjectProxy at @object_path, if any.
*
- * Returns: (transfer full): A #GDBusObject or %NULL. Free with
+ * Returns: (transfer full) (nullable): A #GDBusObject or %NULL. Free with
* g_object_unref().
*
* Since: 2.30
@@ -236,7 +236,7 @@ g_dbus_object_manager_get_object (GDBusObjectManager *manager,
* Gets the interface proxy for @interface_name at @object_path, if
* any.
*
- * Returns: (transfer full): A #GDBusInterface instance or %NULL. Free
+ * Returns: (transfer full) (nullable): A #GDBusInterface instance or %NULL. Free
* with g_object_unref().
*
* Since: 2.30
diff --git a/gio/gdbusobjectmanagerserver.c b/gio/gdbusobjectmanagerserver.c
index 0a0cea84a..a68594765 100644
--- a/gio/gdbusobjectmanagerserver.c
+++ b/gio/gdbusobjectmanagerserver.c
@@ -318,7 +318,7 @@ g_dbus_object_manager_server_set_connection (GDBusObjectManagerServer *manager,
*
* Gets the #GDBusConnection used by @manager.
*
- * Returns: (transfer full): A #GDBusConnection object or %NULL if
+ * Returns: (transfer full) (nullable): A #GDBusConnection object or %NULL if
* @manager isn't exported on a connection. The returned object should
* be freed with g_object_unref().
*
diff --git a/gio/gdbusprivate.c b/gio/gdbusprivate.c
index 282678f3b..7e62fa89e 100644
--- a/gio/gdbusprivate.c
+++ b/gio/gdbusprivate.c
@@ -2292,7 +2292,7 @@ turn_off_the_starting_cursor (void)
}
}
-__declspec(dllexport) void __stdcall
+void __stdcall
g_win32_run_session_bus (void* hwnd, void* hinst, const char* cmdline, int cmdshow)
{
GDBusDaemon *daemon;
diff --git a/gio/gdbusprivate.h b/gio/gdbusprivate.h
index 8f8a93ba7..72d2c32a9 100644
--- a/gio/gdbusprivate.h
+++ b/gio/gdbusprivate.h
@@ -117,7 +117,7 @@ gchar *_g_dbus_win32_get_user_sid (void);
* Initially this function was introduces for usage with rundll,
* so the signature is kept rundll-compatible, though parameters aren't used.
*/
-__declspec(dllexport) void __stdcall
+_GLIB_EXTERN void __stdcall
g_win32_run_session_bus (void* hwnd, void* hinst, const char* cmdline, int cmdshow);
gchar *_g_dbus_win32_get_session_address_dbus_launch (GError **error);
#endif
diff --git a/gio/gdbusproxy.c b/gio/gdbusproxy.c
index 09b3a6584..7a2289bd4 100644
--- a/gio/gdbusproxy.c
+++ b/gio/gdbusproxy.c
@@ -92,7 +92,7 @@
* of the thread where the instance was constructed.
*
* An example using a proxy for a well-known name can be found in
- * [gdbus-example-watch-proxy.c](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gdbus-example-watch-proxy.c)
+ * [gdbus-example-watch-proxy.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-watch-proxy.c)
*/
/* lock protecting the mutable properties: name_owner, timeout_msec,
@@ -2246,7 +2246,7 @@ g_dbus_proxy_new_for_bus_sync (GBusType bus_type,
*
* Gets the connection @proxy is for.
*
- * Returns: (transfer none): A #GDBusConnection owned by @proxy. Do not free.
+ * Returns: (transfer none) (not nullable): A #GDBusConnection owned by @proxy. Do not free.
*
* Since: 2.26
*/
@@ -2280,7 +2280,11 @@ g_dbus_proxy_get_flags (GDBusProxy *proxy)
*
* Gets the name that @proxy was constructed for.
*
- * Returns: A string owned by @proxy. Do not free.
+ * When connected to a message bus, this will usually be non-%NULL.
+ * However, it may be %NULL for a proxy that communicates using a peer-to-peer
+ * pattern.
+ *
+ * Returns: (nullable): A string owned by @proxy. Do not free.
*
* Since: 2.26
*/
@@ -2324,7 +2328,7 @@ g_dbus_proxy_get_name_owner (GDBusProxy *proxy)
*
* Gets the object path @proxy is for.
*
- * Returns: A string owned by @proxy. Do not free.
+ * Returns: (not nullable): A string owned by @proxy. Do not free.
*
* Since: 2.26
*/
@@ -2341,7 +2345,7 @@ g_dbus_proxy_get_object_path (GDBusProxy *proxy)
*
* Gets the D-Bus interface name @proxy is for.
*
- * Returns: A string owned by @proxy. Do not free.
+ * Returns: (not nullable): A string owned by @proxy. Do not free.
*
* Since: 2.26
*/
diff --git a/gio/gdbusserver.c b/gio/gdbusserver.c
index e3a436fbb..3fdded58a 100644
--- a/gio/gdbusserver.c
+++ b/gio/gdbusserver.c
@@ -77,7 +77,7 @@
* session or system bus, you should instead use g_bus_own_name().
*
* An example of peer-to-peer communication with GDBus can be found
- * in [gdbus-example-peer.c](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gdbus-example-peer.c).
+ * in [gdbus-example-peer.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-peer.c).
*
* Note that a minimal #GDBusServer will accept connections from any
* peer. In many use-cases it will be necessary to add a #GDBusAuthObserver
@@ -320,7 +320,9 @@ g_dbus_server_class_init (GDBusServerClass *klass)
/**
* GDBusServer:guid:
*
- * The guid of the server.
+ * The GUID of the server.
+ *
+ * See #GDBusConnection:guid for more details.
*
* Since: 2.26
*/
@@ -542,7 +544,9 @@ g_dbus_server_new_sync (const gchar *address,
* [D-Bus address](https://dbus.freedesktop.org/doc/dbus-specification.html#addresses)
* string that can be used by clients to connect to @server.
*
- * Returns: A D-Bus address string. Do not free, the string is owned
+ * This is valid and non-empty if initializing the #GDBusServer succeeded.
+ *
+ * Returns: (not nullable): A D-Bus address string. Do not free, the string is owned
* by @server.
*
* Since: 2.26
@@ -558,9 +562,9 @@ g_dbus_server_get_client_address (GDBusServer *server)
* g_dbus_server_get_guid:
* @server: A #GDBusServer.
*
- * Gets the GUID for @server.
+ * Gets the GUID for @server, as provided to g_dbus_server_new_sync().
*
- * Returns: A D-Bus GUID. Do not free this string, it is owned by @server.
+ * Returns: (not nullable): A D-Bus GUID. Do not free this string, it is owned by @server.
*
* Since: 2.26
*/
diff --git a/gio/gdbusutils.c b/gio/gdbusutils.c
index bb34e2d58..cd52208d2 100644
--- a/gio/gdbusutils.c
+++ b/gio/gdbusutils.c
@@ -280,8 +280,14 @@ g_dbus_is_interface_name (const gchar *string)
* Generate a D-Bus GUID that can be used with
* e.g. g_dbus_connection_new().
*
- * See the D-Bus specification regarding what strings are valid D-Bus
- * GUID (for example, D-Bus GUIDs are not RFC-4122 compliant).
+ * See the
+ * [D-Bus specification](https://dbus.freedesktop.org/doc/dbus-specification.html#uuids)
+ * regarding what strings are valid D-Bus GUIDs. The specification refers to
+ * these as ‘UUIDs’ whereas GLib (for historical reasons) refers to them as
+ * ‘GUIDs’. The terms are interchangeable.
+ *
+ * Note that D-Bus GUIDs do not follow
+ * [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122).
*
* Returns: A valid D-Bus GUID. Free with g_free().
*
@@ -317,10 +323,10 @@ g_dbus_generate_guid (void)
*
* Checks if @string is a D-Bus GUID.
*
- * See the D-Bus specification regarding what strings are valid D-Bus
- * GUID (for example, D-Bus GUIDs are not RFC-4122 compliant).
+ * See the documentation for g_dbus_generate_guid() for more information about
+ * the format of a GUID.
*
- * Returns: %TRUE if @string is a guid, %FALSE otherwise.
+ * Returns: %TRUE if @string is a GUID, %FALSE otherwise.
*
* Since: 2.26
*/
diff --git a/gio/gdtlsconnection.c b/gio/gdtlsconnection.c
index 136e317b1..880d87d2c 100644
--- a/gio/gdtlsconnection.c
+++ b/gio/gdtlsconnection.c
@@ -88,6 +88,8 @@ enum {
PROP_CERTIFICATE,
PROP_PEER_CERTIFICATE,
PROP_PEER_CERTIFICATE_ERRORS,
+ PROP_PROTOCOL_VERSION,
+ PROP_CIPHERSUITE_NAME,
};
static void
@@ -264,6 +266,37 @@ g_dtls_connection_default_init (GDtlsConnectionInterface *iface)
G_PARAM_STATIC_STRINGS));
/**
+ * GDtlsConnection:protocol-version:
+ *
+ * The DTLS protocol version in use. See g_dtls_connection_get_protocol_version().
+ *
+ * Since: 2.70
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_enum ("protocol-version",
+ P_("Protocol Version"),
+ P_("DTLS protocol version negotiated for this connection"),
+ G_TYPE_TLS_PROTOCOL_VERSION,
+ G_TLS_PROTOCOL_VERSION_UNKNOWN,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GDtlsConnection:ciphersuite-name: (nullable)
+ *
+ * The name of the DTLS ciphersuite in use. See g_dtls_connection_get_ciphersuite_name().
+ *
+ * Since: 2.70
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_string ("ciphersuite-name",
+ P_("Ciphersuite Name"),
+ P_("Name of ciphersuite negotiated for this connection"),
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
* GDtlsConnection::accept-certificate:
* @conn: a #GDtlsConnection
* @peer_cert: the peer's #GTlsCertificate
@@ -1123,3 +1156,66 @@ g_dtls_connection_get_channel_binding_data (GDtlsConnection *conn,
return iface->get_binding_data (conn, type, data, error);
}
+
+/**
+ * g_dtls_connection_get_protocol_version:
+ * @conn: a #GDTlsConnection
+ *
+ * Returns the current DTLS protocol version, which may be
+ * %G_TLS_PROTOCOL_VERSION_UNKNOWN if the connection has not handshaked, or
+ * has been closed, or if the TLS backend has implemented a protocol version
+ * that is not a recognized #GTlsProtocolVersion.
+ *
+ * Returns: The current DTLS protocol version
+ *
+ * Since: 2.70
+ */
+GTlsProtocolVersion
+g_dtls_connection_get_protocol_version (GDtlsConnection *conn)
+{
+ GTlsProtocolVersion protocol_version;
+ GEnumClass *enum_class;
+ GEnumValue *enum_value;
+
+ g_return_val_if_fail (G_IS_DTLS_CONNECTION (conn), G_TLS_PROTOCOL_VERSION_UNKNOWN);
+
+ g_object_get (G_OBJECT (conn),
+ "protocol-version", &protocol_version,
+ NULL);
+
+ /* Convert unknown values to G_TLS_PROTOCOL_VERSION_UNKNOWN. */
+ enum_class = g_type_class_peek_static (G_TYPE_TLS_PROTOCOL_VERSION);
+ enum_value = g_enum_get_value (enum_class, protocol_version);
+ return enum_value ? protocol_version : G_TLS_PROTOCOL_VERSION_UNKNOWN;
+}
+
+/**
+ * g_dtls_connection_get_ciphersuite_name:
+ * @conn: a #GDTlsConnection
+ *
+ * Returns the name of the current DTLS ciphersuite, or %NULL if the
+ * connection has not handshaked or has been closed. Beware that the TLS
+ * backend may use any of multiple different naming conventions, because
+ * OpenSSL and GnuTLS have their own ciphersuite naming conventions that
+ * are different from each other and different from the standard, IANA-
+ * registered ciphersuite names. The ciphersuite name is intended to be
+ * displayed to the user for informative purposes only, and parsing it
+ * is not recommended.
+ *
+ * Returns: (nullable): The name of the current DTLS ciphersuite, or %NULL
+ *
+ * Since: 2.70
+ */
+gchar *
+g_dtls_connection_get_ciphersuite_name (GDtlsConnection *conn)
+{
+ gchar *ciphersuite_name;
+
+ g_return_val_if_fail (G_IS_DTLS_CONNECTION (conn), NULL);
+
+ g_object_get (G_OBJECT (conn),
+ "ciphersuite-name", &ciphersuite_name,
+ NULL);
+
+ return g_steal_pointer (&ciphersuite_name);
+}
diff --git a/gio/gdtlsconnection.h b/gio/gdtlsconnection.h
index e73cf1459..45a16f50a 100644
--- a/gio/gdtlsconnection.h
+++ b/gio/gdtlsconnection.h
@@ -216,6 +216,12 @@ gboolean g_dtls_connection_get_channel_binding_data (GDtlsConnec
GError **error);
G_GNUC_END_IGNORE_DEPRECATIONS
+GLIB_AVAILABLE_IN_2_70
+GTlsProtocolVersion g_dtls_connection_get_protocol_version (GDtlsConnection *conn);
+
+GLIB_AVAILABLE_IN_2_70
+gchar * g_dtls_connection_get_ciphersuite_name (GDtlsConnection *conn);
+
G_END_DECLS
#endif /* __G_DTLS_CONNECTION_H__ */
diff --git a/gio/gioenums.h b/gio/gioenums.h
index f2f66c875..d81ada416 100644
--- a/gio/gioenums.h
+++ b/gio/gioenums.h
@@ -1703,6 +1703,12 @@ typedef enum {
* wrong many times, and the user may not have many chances left.
* @G_TLS_PASSWORD_FINAL_TRY: Hint to the user that this is the last try to get
* this password right.
+ * @G_TLS_PASSWORD_PKCS11_USER: For PKCS #11, the user PIN is required.
+ * Since: 2.70.
+ * @G_TLS_PASSWORD_PKCS11_SECURITY_OFFICER: For PKCS #11, the security officer
+ * PIN is required. Since: 2.70.
+ * @G_TLS_PASSWORD_PKCS11_CONTEXT_SPECIFIC: For PKCS #11, the context-specific
+ * PIN is required. Since: 2.70.
*
* Various flags for the password.
*
@@ -1714,7 +1720,10 @@ typedef enum _GTlsPasswordFlags
G_TLS_PASSWORD_NONE = 0,
G_TLS_PASSWORD_RETRY = 1 << 1,
G_TLS_PASSWORD_MANY_TRIES = 1 << 2,
- G_TLS_PASSWORD_FINAL_TRY = 1 << 3
+ G_TLS_PASSWORD_FINAL_TRY = 1 << 3,
+ G_TLS_PASSWORD_PKCS11_USER = 1 << 4,
+ G_TLS_PASSWORD_PKCS11_SECURITY_OFFICER = 1 << 5,
+ G_TLS_PASSWORD_PKCS11_CONTEXT_SPECIFIC = 1 << 6
} GTlsPasswordFlags;
/**
@@ -1817,6 +1826,40 @@ typedef enum {
} GTlsCertificateRequestFlags;
/**
+ * GTlsProtocolVersion:
+ * @G_TLS_PROTOCOL_VERSION_UNKNOWN: No protocol version or unknown protocol version
+ * @G_TLS_PROTOCOL_VERSION_SSL_3_0: SSL 3.0, which is insecure and should not be used
+ * @G_TLS_PROTOCOL_VERSION_TLS_1_0: TLS 1.0, which is insecure and should not be used
+ * @G_TLS_PROTOCOL_VERSION_TLS_1_1: TLS 1.1, which is insecure and should not be used
+ * @G_TLS_PROTOCOL_VERSION_TLS_1_2: TLS 1.2, defined by [RFC 5246](https://datatracker.ietf.org/doc/html/rfc5246)
+ * @G_TLS_PROTOCOL_VERSION_TLS_1_3: TLS 1.3, defined by [RFC 8446](https://datatracker.ietf.org/doc/html/rfc8446)
+ * @G_TLS_PROTOCOL_VERSION_DTLS_1_0: DTLS 1.0, which is insecure and should not be used
+ * @G_TLS_PROTOCOL_VERSION_DTLS_1_2: DTLS 1.2, defined by [RFC 6347](https://datatracker.ietf.org/doc/html/rfc6347)
+ *
+ * The TLS or DTLS protocol version used by a #GTlsConnection or
+ * #GDtlsConnection. The integer values of these versions are sequential
+ * to ensure newer known protocol versions compare greater than older
+ * known versions. Any known DTLS protocol version will compare greater
+ * than any SSL or TLS protocol version. The protocol version may be
+ * %G_TLS_PROTOCOL_VERSION_UNKNOWN if the TLS backend supports a newer
+ * protocol version that GLib does not yet know about. This means that
+ * it's possible for an unknown DTLS protocol version to compare less
+ * than the TLS protocol versions.
+ *
+ * Since: 2.70
+ */
+typedef enum {
+ G_TLS_PROTOCOL_VERSION_UNKNOWN = 0,
+ G_TLS_PROTOCOL_VERSION_SSL_3_0 = 1,
+ G_TLS_PROTOCOL_VERSION_TLS_1_0 = 2,
+ G_TLS_PROTOCOL_VERSION_TLS_1_1 = 3,
+ G_TLS_PROTOCOL_VERSION_TLS_1_2 = 4,
+ G_TLS_PROTOCOL_VERSION_TLS_1_3 = 5,
+ G_TLS_PROTOCOL_VERSION_DTLS_1_0 = 201,
+ G_TLS_PROTOCOL_VERSION_DTLS_1_2 = 202,
+} GTlsProtocolVersion;
+
+/**
* GIOModuleScopeFlags:
* @G_IO_MODULE_SCOPE_NONE: No module scan flags
* @G_IO_MODULE_SCOPE_BLOCK_DUPLICATES: When using this scope to load or
diff --git a/gio/glocalfileoutputstream.c b/gio/glocalfileoutputstream.c
index 78d3e85a6..71a992668 100644
--- a/gio/glocalfileoutputstream.c
+++ b/gio/glocalfileoutputstream.c
@@ -975,7 +975,36 @@ handle_overwrite_open (const char *filename,
if (etag != NULL)
{
- current_etag = _g_local_file_info_create_etag (&original_stat);
+ GLocalFileStat etag_stat;
+ GLocalFileStat *etag_stat_pointer;
+
+ /* The ETag is calculated on the details of the target file, for symlinks,
+ * so we might need to stat() again. */
+ if (is_symlink)
+ {
+ res = g_local_file_stat (filename,
+ G_LOCAL_FILE_STAT_FIELD_MTIME,
+ G_LOCAL_FILE_STAT_FIELD_ALL, &etag_stat);
+ errsv = errno;
+
+ if (res != 0)
+ {
+ char *display_name = g_filename_display_name (filename);
+ g_set_error (error, G_IO_ERROR,
+ g_io_error_from_errno (errsv),
+ _("Error when getting information for file “%s”: %s"),
+ display_name, g_strerror (errsv));
+ g_free (display_name);
+ goto error;
+ }
+
+ etag_stat_pointer = &etag_stat;
+ }
+ else
+ etag_stat_pointer = &original_stat;
+
+ /* Compare the ETags */
+ current_etag = _g_local_file_info_create_etag (etag_stat_pointer);
if (strcmp (etag, current_etag) != 0)
{
g_set_error_literal (error,
diff --git a/gio/gsettings.c b/gio/gsettings.c
index a2d5a36e2..f7d39c77e 100644
--- a/gio/gsettings.c
+++ b/gio/gsettings.c
@@ -121,7 +121,7 @@
* utility. The input is a schema description in an XML format.
*
* A DTD for the gschema XML format can be found here:
- * [gschema.dtd](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/gschema.dtd)
+ * [gschema.dtd](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/gschema.dtd)
*
* The [glib-compile-schemas][glib-compile-schemas] tool expects schema
* files to have the extension `.gschema.xml`.
@@ -2434,28 +2434,24 @@ GSettings *
g_settings_get_child (GSettings *settings,
const gchar *name)
{
- const gchar *child_schema;
+ GSettingsSchema *child_schema;
gchar *child_path;
- gchar *child_name;
GSettings *child;
g_return_val_if_fail (G_IS_SETTINGS (settings), NULL);
- child_name = g_strconcat (name, "/", NULL);
- child_schema = g_settings_schema_get_string (settings->priv->schema,
- child_name);
+ child_schema = g_settings_schema_get_child_schema (settings->priv->schema,
+ name);
if (child_schema == NULL)
- g_error ("Schema '%s' has no child '%s'",
+ g_error ("Schema '%s' has no child '%s' or child schema not found",
g_settings_schema_get_id (settings->priv->schema), name);
- child_path = g_strconcat (settings->priv->path, child_name, NULL);
- child = g_object_new (G_TYPE_SETTINGS,
- "backend", settings->priv->backend,
- "schema-id", child_schema,
- "path", child_path,
- NULL);
+ child_path = g_strconcat (settings->priv->path, name, "/", NULL);
+ child = g_settings_new_full (child_schema,
+ settings->priv->backend,
+ child_path);
+ g_settings_schema_unref (child_schema);
g_free (child_path);
- g_free (child_name);
return child;
}
diff --git a/gio/gsettingsschema-internal.h b/gio/gsettingsschema-internal.h
index 5f996b4bc..416cf2d8c 100644
--- a/gio/gsettingsschema-internal.h
+++ b/gio/gsettingsschema-internal.h
@@ -50,6 +50,9 @@ const GQuark * g_settings_schema_list (GSettin
const gchar * g_settings_schema_get_string (GSettingsSchema *schema,
const gchar *key);
+GSettingsSchema * g_settings_schema_get_child_schema (GSettingsSchema *schema,
+ const gchar *name);
+
void g_settings_schema_key_init (GSettingsSchemaKey *key,
GSettingsSchema *schema,
const gchar *name);
diff --git a/gio/gsettingsschema.c b/gio/gsettingsschema.c
index a46d5056f..ec0caf655 100644
--- a/gio/gsettingsschema.c
+++ b/gio/gsettingsschema.c
@@ -968,6 +968,24 @@ g_settings_schema_get_string (GSettingsSchema *schema,
return result;
}
+GSettingsSchema *
+g_settings_schema_get_child_schema (GSettingsSchema *schema,
+ const gchar *name)
+{
+ const gchar *child_id;
+ gchar *child_name;
+
+ child_name = g_strconcat (name, "/", NULL);
+ child_id = g_settings_schema_get_string (schema, child_name);
+
+ g_free (child_name);
+
+ if (child_id == NULL)
+ return NULL;
+
+ return g_settings_schema_source_lookup (schema->source, child_id, TRUE);
+}
+
GVariantIter *
g_settings_schema_get_value (GSettingsSchema *schema,
const gchar *key)
diff --git a/gio/gtestdbus.c b/gio/gtestdbus.c
index 0c8a3007f..703a0b3a5 100644
--- a/gio/gtestdbus.c
+++ b/gio/gtestdbus.c
@@ -380,7 +380,7 @@ _g_test_watcher_remove_pid (GPid pid)
*
* An example of a test fixture for D-Bus services can be found
* here:
- * [gdbus-test-fixture.c](https://gitlab.gnome.org/GNOME/glib/-/blob/master/gio/tests/gdbus-test-fixture.c)
+ * [gdbus-test-fixture.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-test-fixture.c)
*
* Note that these examples only deal with isolating the D-Bus aspect of your
* service. To successfully run isolated unit tests on your service you may need
diff --git a/gio/gtlscertificate.c b/gio/gtlscertificate.c
index ae9e88016..aadc562a6 100644
--- a/gio/gtlscertificate.c
+++ b/gio/gtlscertificate.c
@@ -63,6 +63,12 @@ enum
PROP_ISSUER,
PROP_PKCS11_URI,
PROP_PRIVATE_KEY_PKCS11_URI,
+ PROP_NOT_VALID_BEFORE,
+ PROP_NOT_VALID_AFTER,
+ PROP_SUBJECT_NAME,
+ PROP_ISSUER_NAME,
+ PROP_DNS_NAMES,
+ PROP_IP_ADDRESSES,
};
static void
@@ -248,6 +254,101 @@ g_tls_certificate_class_init (GTlsCertificateClass *class)
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GTlsCertificate:not-valid-before: (nullable)
+ *
+ * The time at which this cert is considered to be valid,
+ * %NULL if unavailable.
+ *
+ * Since: 2.70
+ */
+ g_object_class_install_property (gobject_class, PROP_NOT_VALID_BEFORE,
+ g_param_spec_boxed ("not-valid-before",
+ P_("Not Valid Before"),
+ P_("Cert should not be considered valid before this time."),
+ G_TYPE_DATE_TIME,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GTlsCertificate:not-valid-after: (nullable)
+ *
+ * The time at which this cert is no longer valid,
+ * %NULL if unavailable.
+ *
+ * Since: 2.70
+ */
+ g_object_class_install_property (gobject_class, PROP_NOT_VALID_AFTER,
+ g_param_spec_boxed ("not-valid-after",
+ P_("Not Valid after"),
+ P_("Cert should not be considered valid after this time."),
+ G_TYPE_DATE_TIME,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GTlsCertificate:subject-name: (nullable)
+ *
+ * The subject from the cert,
+ * %NULL if unavailable.
+ *
+ * Since: 2.70
+ */
+ g_object_class_install_property (gobject_class, PROP_SUBJECT_NAME,
+ g_param_spec_string ("subject-name",
+ P_("Subject Name"),
+ P_("The subject name from the certificate."),
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+ /**
+ * GTlsCertificate:issuer-name: (nullable)
+ *
+ * The issuer from the certificate,
+ * %NULL if unavailable.
+ *
+ * Since: 2.70
+ */
+ g_object_class_install_property (gobject_class, PROP_ISSUER_NAME,
+ g_param_spec_string ("issuer-name",
+ P_("Issuer Name"),
+ P_("The issuer from the certificate."),
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GTlsCertificate:dns-names: (nullable)
+ *
+ * The DNS names from the certificate's Subject Alternative Names (SANs),
+ * %NULL if unavailable.
+ *
+ * Since: 2.70
+ */
+ g_object_class_install_property (gobject_class, PROP_DNS_NAMES,
+ g_param_spec_boxed ("dns-names",
+ P_("DNS Names"),
+ P_("DNS Names listed on the cert."),
+ G_TYPE_PTR_ARRAY,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GTlsCertificate:ip-addresses: (nullable)
+ *
+ * The IP addresses from the certificate's Subject Alternative Names (SANs),
+ * %NULL if unavailable.
+ *
+ * Since: 2.70
+ */
+ g_object_class_install_property (gobject_class, PROP_IP_ADDRESSES,
+ g_param_spec_boxed ("ip-addresses",
+ P_("IP Addresses"),
+ P_("IP Addresses listed on the cert."),
+ G_TYPE_PTR_ARRAY,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
}
static GTlsCertificate *
@@ -286,6 +387,7 @@ parse_private_key (const gchar *data,
GError **error)
{
const gchar *header_start = NULL, *header_end, *footer_start = NULL, *footer_end;
+ const gchar *data_end = data + data_len;
header_end = g_strstr_len (data, data_len, PEM_PRIVKEY_HEADER_END);
if (header_end)
@@ -322,7 +424,7 @@ parse_private_key (const gchar *data,
footer_end += strlen (PEM_PRIVKEY_FOOTER_END);
- while (*footer_end == '\r' || *footer_end == '\n')
+ while ((footer_end < data_end) && (*footer_end == '\r' || *footer_end == '\n'))
footer_end++;
return g_strndup (header_start, footer_end - header_start);
@@ -356,7 +458,7 @@ parse_next_pem_certificate (const gchar **data,
return NULL;
}
end += strlen (PEM_CERTIFICATE_FOOTER);
- while (*end == '\r' || *end == '\n')
+ while ((end < data_end) && (*end == '\r' || *end == '\n'))
end++;
*data = end;
@@ -388,7 +490,7 @@ parse_and_create_certificate_list (const gchar *data,
/* If we read one certificate successfully, let's see if we can read
* some more. If not, we will simply return a list with the first one.
*/
- while (p && *p)
+ while (p < end && p && *p)
{
gchar *cert_pem;
GError *error = NULL;
@@ -876,3 +978,138 @@ g_tls_certificate_is_same (GTlsCertificate *cert_one,
return equal;
}
+
+
+/**
+ * g_tls_certificate_get_not_valid_before:
+ * @cert: a #GTlsCertificate
+ *
+ * Returns the time at which the certificate became or will become valid.
+ *
+ * Returns: (nullable) (transfer full): The not-valid-before date, or %NULL if it's not available.
+ *
+ * Since: 2.70
+ */
+GDateTime *
+g_tls_certificate_get_not_valid_before (GTlsCertificate *cert)
+{
+ GDateTime *not_valid_before = NULL;
+
+ g_return_val_if_fail (G_IS_TLS_CERTIFICATE (cert), NULL);
+
+ g_object_get (G_OBJECT (cert), "not-valid-before", &not_valid_before, NULL);
+
+ return g_steal_pointer (&not_valid_before);
+}
+
+/**
+ * g_tls_certificate_get_not_valid_after:
+ * @cert: a #GTlsCertificate
+ *
+ * Returns the time at which the certificate became or will become invalid.
+ *
+ * Returns: (nullable) (transfer full): The not-valid-after date, or %NULL if it's not available.
+ *
+ * Since: 2.70
+ */
+GDateTime *
+g_tls_certificate_get_not_valid_after (GTlsCertificate *cert)
+{
+ GDateTime *not_valid_after = NULL;
+
+ g_return_val_if_fail (G_IS_TLS_CERTIFICATE (cert), NULL);
+
+ g_object_get (G_OBJECT (cert), "not-valid-after", &not_valid_after, NULL);
+
+ return g_steal_pointer (&not_valid_after);
+}
+
+/**
+ * g_tls_certificate_get_subject_name:
+ * @cert: a #GTlsCertificate
+ *
+ * Returns the subject name from the certificate.
+ *
+ * Returns: (nullable) (transfer full): The subject name, or %NULL if it's not available.
+ *
+ * Since: 2.70
+ */
+gchar *
+g_tls_certificate_get_subject_name (GTlsCertificate *cert)
+{
+ gchar *subject_name = NULL;
+
+ g_return_val_if_fail (G_IS_TLS_CERTIFICATE (cert), NULL);
+
+ g_object_get (G_OBJECT (cert), "subject-name", &subject_name, NULL);
+
+ return g_steal_pointer (&subject_name);
+}
+
+/**
+ * g_tls_certificate_get_issuer_name:
+ * @cert: a #GTlsCertificate
+ *
+ * Returns the issuer name from the certificate.
+ *
+ * Returns: (nullable) (transfer full): The issuer name, or %NULL if it's not available.
+ *
+ * Since: 2.70
+ */
+gchar *
+g_tls_certificate_get_issuer_name (GTlsCertificate *cert)
+{
+ gchar *issuer_name = NULL;
+
+ g_return_val_if_fail (G_IS_TLS_CERTIFICATE (cert), NULL);
+
+ g_object_get (G_OBJECT (cert), "issuer-name", &issuer_name, NULL);
+
+ return g_steal_pointer (&issuer_name);
+}
+
+/**
+ * g_tls_certificate_get_dns_names:
+ * @cert: a #GTlsCertificate
+ *
+ * Gets the value of #GTlsCertificate:dns-names.
+ *
+ * Returns: (nullable) (element-type GBytes) (transfer container): A #GPtrArray of
+ * #GBytes elements, or %NULL if it's not available.
+ *
+ * Since: 2.70
+ */
+GPtrArray *
+g_tls_certificate_get_dns_names (GTlsCertificate *cert)
+{
+ GPtrArray *dns_names = NULL;
+
+ g_return_val_if_fail (G_IS_TLS_CERTIFICATE (cert), NULL);
+
+ g_object_get (G_OBJECT (cert), "dns-names", &dns_names, NULL);
+
+ return g_steal_pointer (&dns_names);
+}
+
+/**
+ * g_tls_certificate_get_ip_addresses:
+ * @cert: a #GTlsCertificate
+ *
+ * Gets the value of #GTlsCertificate:ip-addresses.
+ *
+ * Returns: (nullable) (element-type GInetAddress) (transfer container): A #GPtrArray
+ * of #GInetAddress elements, or %NULL if it's not available.
+ *
+ * Since: 2.70
+ */
+GPtrArray *
+g_tls_certificate_get_ip_addresses (GTlsCertificate *cert)
+{
+ GPtrArray *ip_addresses = NULL;
+
+ g_return_val_if_fail (G_IS_TLS_CERTIFICATE (cert), NULL);
+
+ g_object_get (G_OBJECT (cert), "ip-addresses", &ip_addresses, NULL);
+
+ return g_steal_pointer (&ip_addresses);
+}
diff --git a/gio/gtlscertificate.h b/gio/gtlscertificate.h
index ead4f015e..3b92b97fc 100644
--- a/gio/gtlscertificate.h
+++ b/gio/gtlscertificate.h
@@ -92,6 +92,24 @@ GLIB_AVAILABLE_IN_2_34
gboolean g_tls_certificate_is_same (GTlsCertificate *cert_one,
GTlsCertificate *cert_two);
+GLIB_AVAILABLE_IN_2_70
+GDateTime *g_tls_certificate_get_not_valid_before (GTlsCertificate *cert);
+
+GLIB_AVAILABLE_IN_2_70
+GDateTime *g_tls_certificate_get_not_valid_after (GTlsCertificate *cert);
+
+GLIB_AVAILABLE_IN_2_70
+gchar *g_tls_certificate_get_subject_name (GTlsCertificate *cert);
+
+GLIB_AVAILABLE_IN_2_70
+gchar *g_tls_certificate_get_issuer_name (GTlsCertificate *cert);
+
+GLIB_AVAILABLE_IN_2_70
+GPtrArray *g_tls_certificate_get_dns_names (GTlsCertificate *cert);
+
+GLIB_AVAILABLE_IN_2_70
+GPtrArray *g_tls_certificate_get_ip_addresses (GTlsCertificate *cert);
+
G_END_DECLS
#endif /* __G_TLS_CERTIFICATE_H__ */
diff --git a/gio/gtlsconnection.c b/gio/gtlsconnection.c
index 5654ca9ee..3bd37ae97 100644
--- a/gio/gtlsconnection.c
+++ b/gio/gtlsconnection.c
@@ -93,6 +93,8 @@ enum {
PROP_PEER_CERTIFICATE_ERRORS,
PROP_ADVERTISED_PROTOCOLS,
PROP_NEGOTIATED_PROTOCOL,
+ PROP_PROTOCOL_VERSION,
+ PROP_CIPHERSUITE_NAME,
};
static void
@@ -296,6 +298,37 @@ g_tls_connection_class_init (GTlsConnectionClass *klass)
G_PARAM_STATIC_STRINGS));
/**
+ * GTlsConnection:protocol-version:
+ *
+ * The TLS protocol version in use. See g_tls_connection_get_protocol_version().
+ *
+ * Since: 2.70
+ */
+ g_object_class_install_property (gobject_class, PROP_PROTOCOL_VERSION,
+ g_param_spec_enum ("protocol-version",
+ P_("Protocol Version"),
+ P_("TLS protocol version negotiated for this connection"),
+ G_TYPE_TLS_PROTOCOL_VERSION,
+ G_TLS_PROTOCOL_VERSION_UNKNOWN,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GTlsConnection:ciphersuite-name: (nullable)
+ *
+ * The name of the TLS ciphersuite in use. See g_tls_connection_get_ciphersuite_name().
+ *
+ * Since: 2.70
+ */
+ g_object_class_install_property (gobject_class, PROP_CIPHERSUITE_NAME,
+ g_param_spec_string ("ciphersuite-name",
+ P_("Ciphersuite Name"),
+ P_("Name of ciphersuite negotiated for this connection"),
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
* GTlsConnection::accept-certificate:
* @conn: a #GTlsConnection
* @peer_cert: the peer's #GTlsCertificate
@@ -1029,6 +1062,69 @@ g_tls_connection_handshake_finish (GTlsConnection *conn,
}
/**
+ * g_tls_connection_get_protocol_version:
+ * @conn: a #GTlsConnection
+ *
+ * Returns the current TLS protocol version, which may be
+ * %G_TLS_PROTOCOL_VERSION_UNKNOWN if the connection has not handshaked, or
+ * has been closed, or if the TLS backend has implemented a protocol version
+ * that is not a recognized #GTlsProtocolVersion.
+ *
+ * Returns: The current TLS protocol version
+ *
+ * Since: 2.70
+ */
+GTlsProtocolVersion
+g_tls_connection_get_protocol_version (GTlsConnection *conn)
+{
+ GTlsProtocolVersion protocol_version;
+ GEnumClass *enum_class;
+ GEnumValue *enum_value;
+
+ g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), G_TLS_PROTOCOL_VERSION_UNKNOWN);
+
+ g_object_get (G_OBJECT (conn),
+ "protocol-version", &protocol_version,
+ NULL);
+
+ /* Convert unknown values to G_TLS_PROTOCOL_VERSION_UNKNOWN. */
+ enum_class = g_type_class_peek_static (G_TYPE_TLS_PROTOCOL_VERSION);
+ enum_value = g_enum_get_value (enum_class, protocol_version);
+ return enum_value ? protocol_version : G_TLS_PROTOCOL_VERSION_UNKNOWN;
+}
+
+/**
+ * g_tls_connection_get_ciphersuite_name:
+ * @conn: a #GTlsConnection
+ *
+ * Returns the name of the current TLS ciphersuite, or %NULL if the
+ * connection has not handshaked or has been closed. Beware that the TLS
+ * backend may use any of multiple different naming conventions, because
+ * OpenSSL and GnuTLS have their own ciphersuite naming conventions that
+ * are different from each other and different from the standard, IANA-
+ * registered ciphersuite names. The ciphersuite name is intended to be
+ * displayed to the user for informative purposes only, and parsing it
+ * is not recommended.
+ *
+ * Returns: (nullable): The name of the current TLS ciphersuite, or %NULL
+ *
+ * Since: 2.70
+ */
+gchar *
+g_tls_connection_get_ciphersuite_name (GTlsConnection *conn)
+{
+ gchar *ciphersuite_name;
+
+ g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), NULL);
+
+ g_object_get (G_OBJECT (conn),
+ "ciphersuite-name", &ciphersuite_name,
+ NULL);
+
+ return g_steal_pointer (&ciphersuite_name);
+}
+
+/**
* g_tls_error_quark:
*
* Gets the TLS error quark.
diff --git a/gio/gtlsconnection.h b/gio/gtlsconnection.h
index 037222733..a40a253a6 100644
--- a/gio/gtlsconnection.h
+++ b/gio/gtlsconnection.h
@@ -155,6 +155,12 @@ gboolean g_tls_connection_handshake_finish (GTlsConnecti
GAsyncResult *result,
GError **error);
+GLIB_AVAILABLE_IN_2_70
+GTlsProtocolVersion g_tls_connection_get_protocol_version (GTlsConnection *conn);
+
+GLIB_AVAILABLE_IN_2_70
+gchar * g_tls_connection_get_ciphersuite_name (GTlsConnection *conn);
+
/**
* G_TLS_ERROR:
*
diff --git a/gio/inotify/inotify-path.c b/gio/inotify/inotify-path.c
index f0528f443..e1129cd72 100644
--- a/gio/inotify/inotify-path.c
+++ b/gio/inotify/inotify-path.c
@@ -208,6 +208,7 @@ ip_watched_file_free (ip_watched_file_t *file)
g_assert (file->subs == NULL);
g_free (file->filename);
g_free (file->path);
+ g_free (file);
}
static void
diff --git a/gio/tests/file.c b/gio/tests/file.c
index 7e99601fa..2f1b7b310 100644
--- a/gio/tests/file.c
+++ b/gio/tests/file.c
@@ -1,3 +1,4 @@
+#include <locale.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
@@ -932,6 +933,125 @@ test_replace_symlink (void)
#endif
}
+static void
+test_replace_symlink_using_etag (void)
+{
+#ifdef G_OS_UNIX
+ gchar *tmpdir_path = NULL;
+ GFile *tmpdir = NULL, *source_file = NULL, *target_file = NULL;
+ GFileOutputStream *stream = NULL;
+ const gchar *old_contents = "this is a test message which should be written to target and then overwritten";
+ gchar *old_etag = NULL;
+ const gchar *new_contents = "this is an updated message";
+ gsize n_written;
+ gchar *contents = NULL;
+ gsize length = 0;
+ GFileInfo *info = NULL;
+ GError *local_error = NULL;
+
+ g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2417");
+ g_test_summary ("Test that ETag checks work when replacing a file through a symlink");
+
+ /* Create a fresh, empty working directory. */
+ tmpdir_path = g_dir_make_tmp ("g_file_replace_symlink_using_etag_XXXXXX", &local_error);
+ g_assert_no_error (local_error);
+ tmpdir = g_file_new_for_path (tmpdir_path);
+
+ g_test_message ("Using temporary directory %s", tmpdir_path);
+ g_free (tmpdir_path);
+
+ /* Create symlink `source` which points to `target`. */
+ source_file = g_file_get_child (tmpdir, "source");
+ target_file = g_file_get_child (tmpdir, "target");
+ g_file_make_symbolic_link (source_file, "target", NULL, &local_error);
+ g_assert_no_error (local_error);
+
+ /* Sleep for at least 1s to ensure the mtimes of `source` and `target` differ,
+ * as that’s what _g_local_file_info_create_etag() uses to create the ETag,
+ * and one failure mode we’re testing for is that the ETags of `source` and
+ * `target` are conflated. */
+ sleep (1);
+
+ /* Create `target` with some arbitrary content. */
+ stream = g_file_create (target_file, G_FILE_CREATE_NONE, NULL, &local_error);
+ g_assert_no_error (local_error);
+ g_output_stream_write_all (G_OUTPUT_STREAM (stream), old_contents, strlen (old_contents),
+ &n_written, NULL, &local_error);
+ g_assert_no_error (local_error);
+ g_assert_cmpint (n_written, ==, strlen (old_contents));
+
+ g_output_stream_close (G_OUTPUT_STREAM (stream), NULL, &local_error);
+ g_assert_no_error (local_error);
+
+ old_etag = g_file_output_stream_get_etag (stream);
+ g_assert_nonnull (old_etag);
+ g_assert_cmpstr (old_etag, !=, "");
+
+ g_clear_object (&stream);
+
+ /* Sleep again to ensure the ETag changes again. */
+ sleep (1);
+
+ /* Write out a new copy of the `target`, checking its ETag first. This should
+ * replace `target` by following the symlink. */
+ stream = g_file_replace (source_file, old_etag, FALSE /* no backup */,
+ G_FILE_CREATE_NONE, NULL, &local_error);
+ g_assert_no_error (local_error);
+
+ g_output_stream_write_all (G_OUTPUT_STREAM (stream), new_contents, strlen (new_contents),
+ &n_written, NULL, &local_error);
+ g_assert_no_error (local_error);
+ g_assert_cmpint (n_written, ==, strlen (new_contents));
+
+ g_output_stream_close (G_OUTPUT_STREAM (stream), NULL, &local_error);
+ g_assert_no_error (local_error);
+
+ g_clear_object (&stream);
+
+ /* At this point, there should be a regular file, `target`, containing
+ * @new_contents; and a symlink `source` which points to `target`. */
+ g_assert_cmpint (g_file_query_file_type (source_file, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL), ==, G_FILE_TYPE_SYMBOLIC_LINK);
+ g_assert_cmpint (g_file_query_file_type (target_file, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL), ==, G_FILE_TYPE_REGULAR);
+
+ /* Check the content of `target`. */
+ g_file_load_contents (target_file,
+ NULL,
+ &contents,
+ &length,
+ NULL,
+ &local_error);
+ g_assert_no_error (local_error);
+ g_assert_cmpstr (contents, ==, new_contents);
+ g_assert_cmpuint (length, ==, strlen (new_contents));
+ g_free (contents);
+
+ /* And check its ETag value has changed. */
+ info = g_file_query_info (target_file, G_FILE_ATTRIBUTE_ETAG_VALUE,
+ G_FILE_QUERY_INFO_NONE, NULL, &local_error);
+ g_assert_no_error (local_error);
+ g_assert_cmpstr (g_file_info_get_etag (info), !=, old_etag);
+
+ g_clear_object (&info);
+ g_free (old_etag);
+
+ /* Tidy up. */
+ g_file_delete (target_file, NULL, &local_error);
+ g_assert_no_error (local_error);
+
+ g_file_delete (source_file, NULL, &local_error);
+ g_assert_no_error (local_error);
+
+ g_file_delete (tmpdir, NULL, &local_error);
+ g_assert_no_error (local_error);
+
+ g_clear_object (&target_file);
+ g_clear_object (&source_file);
+ g_clear_object (&tmpdir);
+#else /* if !G_OS_UNIX */
+ g_test_skip ("Symlink replacement tests can only be run on Unix")
+#endif
+}
+
/* FIXME: These tests have only been checked on Linux. Most of them are probably
* applicable on Windows, too, but that has not been tested yet.
* See https://gitlab.gnome.org/GNOME/glib/-/issues/2325 */
@@ -2889,6 +3009,8 @@ test_build_attribute_list_for_copy (void)
int
main (int argc, char *argv[])
{
+ setlocale (LC_ALL, "");
+
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/file/basic", test_basic);
@@ -2906,6 +3028,7 @@ main (int argc, char *argv[])
g_test_add_func ("/file/replace-load", test_replace_load);
g_test_add_func ("/file/replace-cancel", test_replace_cancel);
g_test_add_func ("/file/replace-symlink", test_replace_symlink);
+ g_test_add_func ("/file/replace-symlink/using-etag", test_replace_symlink_using_etag);
g_test_add_data_func ("/file/replace/write-only", GUINT_TO_POINTER (FALSE), test_replace);
g_test_add_data_func ("/file/replace/read-write", GUINT_TO_POINTER (TRUE), test_replace);
g_test_add_func ("/file/async-delete", test_async_delete);
diff --git a/gio/tests/gdbus-exit-on-close.c b/gio/tests/gdbus-exit-on-close.c
index 4241fc7a4..1bf0ce7dd 100644
--- a/gio/tests/gdbus-exit-on-close.c
+++ b/gio/tests/gdbus-exit-on-close.c
@@ -49,7 +49,7 @@ static const TestData cases[] = {
{ "true", NULL, EXPLICITLY_TRUE, REMOTE },
{ "false", NULL, EXPLICITLY_FALSE, REMOTE },
{ "we-close", "662100", EXPLICITLY_TRUE, LOCAL },
- { NULL }
+ { NULL, NULL, 0, 0 }
};
static gboolean
diff --git a/gio/tests/gsettings.c b/gio/tests/gsettings.c
index b809090e7..42eeccd7a 100644
--- a/gio/tests/gsettings.c
+++ b/gio/tests/gsettings.c
@@ -2572,7 +2572,7 @@ test_schema_source (void)
GSettingsBackend *backend;
GSettingsSchema *schema;
GError *error = NULL;
- GSettings *settings;
+ GSettings *settings, *child;
gboolean enabled;
backend = g_settings_backend_get_default ();
@@ -2628,13 +2628,18 @@ test_schema_source (void)
g_assert_nonnull (schema);
/* try to use it for something */
- settings = g_settings_new_full (schema, backend, g_settings_schema_get_path (schema));
+ settings = g_settings_new_full (schema, backend, "/test/");
g_settings_schema_unref (schema);
enabled = FALSE;
g_settings_get (settings, "enabled", "b", &enabled);
g_assert_true (enabled);
- g_object_unref (settings);
+ /* Check that child schemas are resolved from the correct schema source, see glib#1884 */
+ child = g_settings_get_child (settings, "child");
+ g_settings_get (settings, "enabled", "b", &enabled);
+
+ g_object_unref (child);
+ g_object_unref (settings);
g_settings_schema_source_unref (source);
/* try again, but with no parent */
diff --git a/gio/tests/gtesttlsbackend.c b/gio/tests/gtesttlsbackend.c
index 56d155031..1e07c1e5e 100644
--- a/gio/tests/gtesttlsbackend.c
+++ b/gio/tests/gtesttlsbackend.c
@@ -110,6 +110,12 @@ enum
PROP_CERT_ISSUER,
PROP_CERT_PKCS11_URI,
PROP_CERT_PRIVATE_KEY_PKCS11_URI,
+ PROP_CERT_NOT_VALID_BEFORE,
+ PROP_CERT_NOT_VALID_AFTER,
+ PROP_CERT_SUBJECT_NAME,
+ PROP_CERT_ISSUER_NAME,
+ PROP_CERT_DNS_NAMES,
+ PROP_CERT_IP_ADDRESSES,
};
static void g_test_tls_certificate_initable_iface_init (GInitableIface *iface);
@@ -135,6 +141,8 @@ g_test_tls_certificate_get_property (GObject *object,
GParamSpec *pspec)
{
GTestTlsCertificate *cert = (GTestTlsCertificate *) object;
+ GPtrArray *data = NULL;
+ const gchar *dns_name = "a.example.com";
switch (prop_id)
{
@@ -156,6 +164,28 @@ g_test_tls_certificate_get_property (GObject *object,
case PROP_CERT_PRIVATE_KEY_PKCS11_URI:
g_value_set_string (value, cert->private_key_pkcs11_uri);
break;
+ case PROP_CERT_NOT_VALID_BEFORE:
+ g_value_take_boxed (value, g_date_time_new_from_iso8601 ("2020-10-12T17:49:44Z", NULL));
+ break;
+ case PROP_CERT_NOT_VALID_AFTER:
+ g_value_take_boxed (value, g_date_time_new_from_iso8601 ("2045-10-06T17:49:44Z", NULL));
+ break;
+ case PROP_CERT_SUBJECT_NAME:
+ g_value_set_string (value, "DC=COM,DC=EXAMPLE,CN=server.example.com");
+ break;
+ case PROP_CERT_ISSUER_NAME:
+ g_value_set_string (value, "DC=COM,DC=EXAMPLE,OU=Certificate Authority,CN=ca.example.com,emailAddress=ca@example.com");
+ break;
+ case PROP_CERT_DNS_NAMES:
+ data = g_ptr_array_new_with_free_func ((GDestroyNotify)g_bytes_unref);
+ g_ptr_array_add (data, g_bytes_new_static (dns_name, strlen (dns_name)));
+ g_value_take_boxed (value, data);
+ break;
+ case PROP_CERT_IP_ADDRESSES:
+ data = g_ptr_array_new_with_free_func (g_object_unref);
+ g_ptr_array_add (data, g_inet_address_new_from_string ("192.0.2.1"));
+ g_value_take_boxed (value, data);
+ break;
default:
g_assert_not_reached ();
break;
@@ -230,6 +260,12 @@ g_test_tls_certificate_class_init (GTestTlsCertificateClass *test_class)
g_object_class_override_property (gobject_class, PROP_CERT_ISSUER, "issuer");
g_object_class_override_property (gobject_class, PROP_CERT_PKCS11_URI, "pkcs11-uri");
g_object_class_override_property (gobject_class, PROP_CERT_PRIVATE_KEY_PKCS11_URI, "private-key-pkcs11-uri");
+ g_object_class_override_property (gobject_class, PROP_CERT_NOT_VALID_BEFORE, "not-valid-before");
+ g_object_class_override_property (gobject_class, PROP_CERT_NOT_VALID_AFTER, "not-valid-after");
+ g_object_class_override_property (gobject_class, PROP_CERT_SUBJECT_NAME, "subject-name");
+ g_object_class_override_property (gobject_class, PROP_CERT_ISSUER_NAME, "issuer-name");
+ g_object_class_override_property (gobject_class, PROP_CERT_DNS_NAMES, "dns-names");
+ g_object_class_override_property (gobject_class, PROP_CERT_IP_ADDRESSES, "ip-addresses");
}
static void
diff --git a/gio/tests/org.gtk.schemasourcecheck.gschema.xml b/gio/tests/org.gtk.schemasourcecheck.gschema.xml
index 42c9c5104..b484da1a3 100644
--- a/gio/tests/org.gtk.schemasourcecheck.gschema.xml
+++ b/gio/tests/org.gtk.schemasourcecheck.gschema.xml
@@ -1,7 +1,8 @@
<schemalist>
- <schema id="org.gtk.schemasourcecheck" path="/tests/">
+ <schema id="org.gtk.schemasourcecheck">
<key name="enabled" type="b">
<default>true</default>
</key>
+ <child name="child" schema="org.gtk.schemasourcecheck" />
</schema>
</schemalist>
diff --git a/gio/tests/socket.c b/gio/tests/socket.c
index dd984e2e0..fa96a4087 100644
--- a/gio/tests/socket.c
+++ b/gio/tests/socket.c
@@ -502,7 +502,7 @@ test_ip_sync (GSocketFamily family)
g_assert_cmpstr (testbuf, ==, buf);
{
- GOutputVector v[7] = { { NULL, }, };
+ GOutputVector v[7] = { { NULL, 0 }, };
v[0].buffer = testbuf2 + 0;
v[0].size = 3;
@@ -627,10 +627,10 @@ test_ip_sync_dgram (GSocketFamily family)
g_assert_cmpstr (testbuf, ==, buf);
{
- GOutputMessage m[3] = { { NULL, }, };
- GInputMessage im[3] = { { NULL, }, };
- GOutputVector v[7] = { { NULL, }, };
- GInputVector iv[7] = { { NULL, }, };
+ GOutputMessage m[3] = { { NULL, NULL, 0, 0, NULL, 0 }, };
+ GInputMessage im[3] = { { NULL, NULL, 0, 0, 0, NULL, 0 }, };
+ GOutputVector v[7] = { { NULL, 0 }, };
+ GInputVector iv[7] = { { NULL, 0 }, };
v[0].buffer = testbuf2 + 0;
v[0].size = 3;
@@ -868,8 +868,8 @@ test_ip_sync_dgram_timeouts (GSocketFamily family)
/* Check for timeouts when no server is running. */
{
gint64 start_time;
- GInputMessage im = { NULL, };
- GInputVector iv = { NULL, };
+ GInputMessage im = { NULL, NULL, 0, 0, 0, NULL, 0 };
+ GInputVector iv = { NULL, 0 };
guint8 buf[128];
iv.buffer = buf;
diff --git a/gio/tests/testfilemonitor.c b/gio/tests/testfilemonitor.c
index b7f4a380d..a52ade715 100644
--- a/gio/tests/testfilemonitor.c
+++ b/gio/tests/testfilemonitor.c
@@ -4,8 +4,6 @@
#include <stdlib.h>
#include <gio/gio.h>
-#include "glib/glib-private.h"
-
/* These tests were written for the inotify implementation.
* Other implementations may require slight adjustments in
* the tests, e.g. the length of timeouts
@@ -957,11 +955,6 @@ static void
test_file_hard_links (Fixture *fixture,
gconstpointer user_data)
{
-#ifdef _GLIB_ADDRESS_SANITIZER
- g_test_incomplete ("FIXME: Leaks an inotify data structure, see glib#2311");
- (void) file_hard_links_output;
- (void) file_hard_links_step;
-#else
GError *error = NULL;
TestData data;
@@ -1012,7 +1005,6 @@ test_file_hard_links (Fixture *fixture,
g_object_unref (data.monitor);
g_object_unref (data.file);
g_object_unref (data.output_stream);
-#endif
}
int
diff --git a/gio/tests/tls-certificate.c b/gio/tests/tls-certificate.c
index c0fc80c4b..d0a908530 100644
--- a/gio/tests/tls-certificate.c
+++ b/gio/tests/tls-certificate.c
@@ -201,6 +201,38 @@ pem_parser_handles_chain (const Reference *ref)
}
static void
+pem_parser_no_sentinel (void)
+{
+ GTlsCertificate *cert;
+ gchar *pem;
+ gsize pem_len = 0;
+ gchar *pem_copy;
+ GError *error = NULL;
+
+ /* Check certificate from not-nul-terminated PEM */
+ g_file_get_contents (g_test_get_filename (G_TEST_DIST, "cert-tests", "cert1.pem", NULL), &pem, &pem_len, &error);
+ g_assert_no_error (error);
+ g_assert_nonnull (pem);
+ g_assert_cmpuint (pem_len, >=, 10);
+
+ pem_copy = g_new (char, pem_len);
+ /* Do not copy the terminating nul: */
+ memmove (pem_copy, pem, pem_len);
+ g_free (pem);
+
+ /* Check whether the parser respects the @length parameter.
+ * pem_copy is allocated exactly pem_len bytes, so accessing memory
+ * outside its bounds will be detected by, for example, valgrind or
+ * asan. */
+ cert = g_tls_certificate_new_from_pem (pem_copy, pem_len, &error);
+ g_assert_no_error (error);
+ g_assert_nonnull (cert);
+
+ g_free (pem_copy);
+ g_object_unref (cert);
+}
+
+static void
from_file (const Reference *ref)
{
GTlsCertificate *cert;
@@ -430,6 +462,137 @@ from_unsupported_pkcs11_uri (void)
g_clear_error (&error);
}
+static void
+not_valid_before (void)
+{
+ const gchar *EXPECTED_NOT_VALID_BEFORE = "2020-10-12T17:49:44Z";
+
+ GTlsCertificate *cert;
+ GError *error = NULL;
+ GDateTime *actual;
+ gchar *actual_str;
+
+ cert = g_tls_certificate_new_from_pkcs11_uris ("pkcs11:model=p11-kit-trust;manufacturer=PKCS%2311%20Kit;serial=1;token=ca-bundle.crt", NULL, &error);
+ g_assert_no_error (error);
+ g_assert_nonnull (cert);
+
+ actual = g_tls_certificate_get_not_valid_before (cert);
+ g_assert_nonnull (actual);
+ actual_str = g_date_time_format_iso8601 (actual);
+ g_assert_cmpstr (actual_str, ==, EXPECTED_NOT_VALID_BEFORE);
+ g_free (actual_str);
+ g_date_time_unref (actual);
+ g_object_unref (cert);
+}
+
+static void
+not_valid_after (void)
+{
+ const gchar *EXPECTED_NOT_VALID_AFTER = "2045-10-06T17:49:44Z";
+
+ GTlsCertificate *cert;
+ GError *error = NULL;
+ GDateTime *actual;
+ gchar *actual_str;
+
+ cert = g_tls_certificate_new_from_pkcs11_uris ("pkcs11:model=p11-kit-trust;manufacturer=PKCS%2311%20Kit;serial=1;token=ca-bundle.crt", NULL, &error);
+ g_assert_no_error (error);
+ g_assert_nonnull (cert);
+
+ actual = g_tls_certificate_get_not_valid_after (cert);
+ g_assert_nonnull (actual);
+ actual_str = g_date_time_format_iso8601 (actual);
+ g_assert_cmpstr (actual_str, ==, EXPECTED_NOT_VALID_AFTER);
+ g_free (actual_str);
+ g_date_time_unref (actual);
+ g_object_unref (cert);
+}
+
+static void
+subject_name (void)
+{
+ const gchar *EXPECTED_SUBJECT_NAME = "DC=COM,DC=EXAMPLE,CN=server.example.com";
+
+ GTlsCertificate *cert;
+ GError *error = NULL;
+ gchar *actual;
+
+ cert = g_tls_certificate_new_from_pkcs11_uris ("pkcs11:model=p11-kit-trust;manufacturer=PKCS%2311%20Kit;serial=1;token=ca-bundle.crt", NULL, &error);
+ g_assert_no_error (error);
+ g_assert_nonnull (cert);
+
+ actual = g_tls_certificate_get_subject_name (cert);
+ g_assert_nonnull (actual);
+ g_assert_cmpstr (actual, ==, EXPECTED_SUBJECT_NAME);
+ g_free (actual);
+ g_object_unref (cert);
+}
+
+static void
+issuer_name (void)
+{
+ const gchar *EXPECTED_ISSUER_NAME = "DC=COM,DC=EXAMPLE,OU=Certificate Authority,CN=ca.example.com,emailAddress=ca@example.com";
+
+ GTlsCertificate *cert;
+ GError *error = NULL;
+ gchar *actual;
+
+ cert = g_tls_certificate_new_from_pkcs11_uris ("pkcs11:model=p11-kit-trust;manufacturer=PKCS%2311%20Kit;serial=1;token=ca-bundle.crt", NULL, &error);
+ g_assert_no_error (error);
+ g_assert_nonnull (cert);
+
+ actual = g_tls_certificate_get_issuer_name (cert);
+ g_assert_nonnull (actual);
+ g_assert_cmpstr (actual, ==, EXPECTED_ISSUER_NAME);
+ g_free (actual);
+ g_object_unref (cert);
+}
+
+static void
+dns_names (void)
+{
+ GTlsCertificate *cert;
+ GError *error = NULL;
+ GPtrArray *actual;
+ const gchar *dns_name = "a.example.com";
+ GBytes *expected = g_bytes_new_static (dns_name, strlen (dns_name));
+
+ cert = g_tls_certificate_new_from_pkcs11_uris ("pkcs11:model=p11-kit-trust;manufacturer=PKCS%2311%20Kit;serial=1;token=ca-bundle.crt", NULL, &error);
+ g_assert_no_error (error);
+ g_assert_nonnull (cert);
+
+ actual = g_tls_certificate_get_dns_names (cert);
+ g_assert_nonnull (actual);
+ g_assert_cmpuint (actual->len, ==, 1);
+ g_assert_true (g_ptr_array_find_with_equal_func (actual, expected, (GEqualFunc)g_bytes_equal, NULL));
+
+ g_ptr_array_free (actual, FALSE);
+ g_bytes_unref (expected);
+ g_object_unref (cert);
+}
+
+static void
+ip_addresses (void)
+{
+ GTlsCertificate *cert;
+ GError *error = NULL;
+ GPtrArray *actual;
+ GInetAddress *expected = g_inet_address_new_from_string ("192.0.2.1");
+
+ cert = g_tls_certificate_new_from_pkcs11_uris ("pkcs11:model=p11-kit-trust;manufacturer=PKCS%2311%20Kit;serial=1;token=ca-bundle.crt", NULL, &error);
+ g_assert_no_error (error);
+ g_assert_nonnull (cert);
+
+ actual = g_tls_certificate_get_ip_addresses (cert);
+ g_assert_nonnull (actual);
+ g_assert_cmpuint (actual->len, ==, 1);
+ g_assert_true (g_ptr_array_find_with_equal_func (actual, expected, (GEqualFunc)g_inet_address_equal, NULL));
+
+ g_ptr_array_free (actual, TRUE);
+ g_object_unref (expected);
+ g_object_unref (cert);
+}
+
int
main (int argc,
char *argv[])
@@ -500,6 +663,20 @@ main (int argc,
from_pkcs11_uri);
g_test_add_func ("/tls-certificate/pkcs11-uri-unsupported",
from_unsupported_pkcs11_uri);
+ g_test_add_func ("/tls-certificate/not-valid-before",
+ not_valid_before);
+ g_test_add_func ("/tls-certificate/not-valid-after",
+ not_valid_after);
+ g_test_add_func ("/tls-certificate/subject-name",
+ subject_name);
+ g_test_add_func ("/tls-certificate/issuer-name",
+ issuer_name);
+ g_test_add_func ("/tls-certificate/dns-names",
+ dns_names);
+ g_test_add_func ("/tls-certificate/ip-addresses",
+ ip_addresses);
+ g_test_add_func ("/tls-certificate/pem-parser-no-sentinel",
+ pem_parser_no_sentinel);
rtv = g_test_run();
diff --git a/glib.doap b/glib.doap
index a300f51cb..2d199101e 100644
--- a/glib.doap
+++ b/glib.doap
@@ -56,7 +56,7 @@
<repository>
<GitRepository>
- <browse rdf:resource="https://gitlab.gnome.org/GNOME/glib/tree/master"/>
+ <browse rdf:resource="https://gitlab.gnome.org/GNOME/glib/"/>
<location rdf:resource="https://gitlab.gnome.org/GNOME/glib.git"/>
</GitRepository>
</repository>
diff --git a/glib.supp b/glib.supp
index 283166361..748216850 100644
--- a/glib.supp
+++ b/glib.supp
@@ -700,7 +700,7 @@
fun:g_inet_address_get_type
}
-# From: https://github.com/fredericgermain/valgrind/blob/master/glibc-2.X-drd.supp
+# From: https://github.com/fredericgermain/valgrind/blob/HEAD/glibc-2.X-drd.supp
{
drd-libc-stdio
drd:ConflictingAccess
diff --git a/glib/garray.c b/glib/garray.c
index 609a21038..025747ee5 100644
--- a/glib/garray.c
+++ b/glib/garray.c
@@ -299,6 +299,27 @@ g_array_sized_new (gboolean zero_terminated,
* functions, @clear_func is expected to clear the contents of
* the array element it is given, but not free the element itself.
*
+ * |[<!-- language="C" -->
+ * typedef struct
+ * {
+ * gchar *str;
+ * GObject *obj;
+ * } ArrayElement;
+ *
+ * static void
+ * array_element_clear (ArrayElement *element)
+ * {
+ * g_clear_pointer (&element->str, g_free);
+ * g_clear_object (&element->obj);
+ * }
+ *
+ * // main code
+ * GArray *garray = g_array_new (FALSE, FALSE, sizeof (ArrayElement));
+ * g_array_set_clear_func (garray, (GDestroyNotify) array_element_clear);
+ * // assign data to the structure
+ * g_array_free (garray, TRUE);
+ * ]|
+ *
* Since: 2.32
*/
void
diff --git a/glib/gatomic.h b/glib/gatomic.h
index 2ad648aad..5583fb0c9 100644
--- a/glib/gatomic.h
+++ b/glib/gatomic.h
@@ -25,11 +25,7 @@
#endif
#include <glib/gtypes.h>
-
-#if defined(glib_typeof_2_68) && GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68
-/* for glib_typeof */
-#include <type_traits>
-#endif
+#include <glib/glib-typeof.h>
G_BEGIN_DECLS
@@ -108,7 +104,7 @@ G_END_DECLS
__atomic_store ((gint *)(atomic), &gais_temp, __ATOMIC_SEQ_CST); \
}))
-#if defined(glib_typeof) && (!defined(glib_typeof_2_68) || GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68)
+#if defined(glib_typeof)
#define g_atomic_pointer_get(atomic) \
(G_GNUC_EXTENSION ({ \
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
@@ -125,7 +121,7 @@ G_END_DECLS
(void) (0 ? (gpointer) * (atomic) : NULL); \
__atomic_store (gaps_temp_atomic, &gaps_temp_newval, __ATOMIC_SEQ_CST); \
}))
-#else /* if !(defined(glib_typeof) && (!defined(glib_typeof_2_68) || GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68)) */
+#else /* if !(defined(glib_typeof) */
#define g_atomic_pointer_get(atomic) \
(G_GNUC_EXTENSION ({ \
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
@@ -142,7 +138,7 @@ G_END_DECLS
(void) (0 ? (gpointer) *(atomic) : NULL); \
__atomic_store (gaps_temp_atomic, &gaps_temp_newval, __ATOMIC_SEQ_CST); \
}))
-#endif /* if defined(glib_typeof) && (!defined(glib_typeof_2_68) || GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68) */
+#endif /* if defined(glib_typeof) */
#define g_atomic_int_inc(atomic) \
(G_GNUC_EXTENSION ({ \
@@ -307,7 +303,7 @@ G_END_DECLS
__asm__ __volatile__ ("" : : : "memory"); \
gapg_result; \
}))
-#if defined(glib_typeof) && (!defined(glib_typeof_2_68) || GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68)
+#if defined(glib_typeof)
#define g_atomic_pointer_set(atomic, newval) \
(G_GNUC_EXTENSION ({ \
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
@@ -316,7 +312,7 @@ G_END_DECLS
__asm__ __volatile__ ("" : : : "memory"); \
*(atomic) = (glib_typeof (*(atomic))) (gsize) (newval); \
}))
-#else /* if !(defined(glib_typeof) && (!defined(glib_typeof_2_68) || GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68)) */
+#else /* if !(defined(glib_typeof) */
#define g_atomic_pointer_set(atomic, newval) \
(G_GNUC_EXTENSION ({ \
G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \
@@ -325,7 +321,7 @@ G_END_DECLS
__asm__ __volatile__ ("" : : : "memory"); \
*(atomic) = (gpointer) (gsize) (newval); \
}))
-#endif /* if defined(glib_typeof) && (!defined(glib_typeof_2_68) || GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68) */
+#endif /* if defined(glib_typeof) */
#define g_atomic_int_inc(atomic) \
(G_GNUC_EXTENSION ({ \
@@ -428,7 +424,7 @@ G_END_DECLS
#define g_atomic_int_dec_and_test(atomic) \
(g_atomic_int_dec_and_test ((gint *) (atomic)))
-#if defined(glib_typeof) && (!defined(glib_typeof_2_68) || GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68)
+#if defined(glib_typeof)
/* The (void *) cast in the middle *looks* redundant, because
* g_atomic_pointer_get returns void * already, but it's to silence
* -Werror=bad-function-cast when we're doing something like:
@@ -438,7 +434,7 @@ G_END_DECLS
* non-pointer-typed result. */
#define g_atomic_pointer_get(atomic) \
(glib_typeof (*(atomic))) (void *) ((g_atomic_pointer_get) ((void *) atomic))
-#else /* !(defined(glib_typeof) && (!defined(glib_typeof_2_68) || GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68)) */
+#else /* !(defined(glib_typeof) */
#define g_atomic_pointer_get(atomic) \
(g_atomic_pointer_get (atomic))
#endif
diff --git a/glib/gbitlock.c b/glib/gbitlock.c
index 3aa4b4a43..9384d1a44 100644
--- a/glib/gbitlock.c
+++ b/glib/gbitlock.c
@@ -76,8 +76,8 @@ static GSList *g_futex_address_list = NULL;
* separate process.
*/
static void
-g_futex_wait (const volatile gint *address,
- gint value)
+g_futex_wait (const gint *address,
+ gint value)
{
syscall (__NR_futex, address, (gsize) FUTEX_WAIT_PRIVATE, (gsize) value, NULL);
}
@@ -94,7 +94,7 @@ g_futex_wait (const volatile gint *address,
* thread being woken up.
*/
static void
-g_futex_wake (const volatile gint *address)
+g_futex_wake (const gint *address)
{
syscall (__NR_futex, address, (gsize) FUTEX_WAKE_PRIVATE, (gsize) 1, NULL);
}
@@ -104,13 +104,13 @@ g_futex_wake (const volatile gint *address)
/* emulate futex(2) */
typedef struct
{
- const volatile gint *address;
- gint ref_count;
- GCond wait_queue;
+ const gint *address;
+ gint ref_count;
+ GCond wait_queue;
} WaitAddress;
static WaitAddress *
-g_futex_find_address (const volatile gint *address)
+g_futex_find_address (const gint *address)
{
GSList *node;
@@ -126,8 +126,8 @@ g_futex_find_address (const volatile gint *address)
}
static void
-g_futex_wait (const volatile gint *address,
- gint value)
+g_futex_wait (const gint *address,
+ gint value)
{
g_mutex_lock (&g_futex_mutex);
if G_LIKELY (g_atomic_int_get (address) == value)
@@ -159,7 +159,7 @@ g_futex_wait (const volatile gint *address,
}
static void
-g_futex_wake (const volatile gint *address)
+g_futex_wake (const gint *address)
{
WaitAddress *waiter;
@@ -177,7 +177,7 @@ g_futex_wake (const volatile gint *address)
#endif
#define CONTENTION_CLASSES 11
-static volatile gint g_bit_lock_contended[CONTENTION_CLASSES];
+static gint g_bit_lock_contended[CONTENTION_CLASSES]; /* (atomic) */
#if (defined (i386) || defined (__amd64__))
#if G_GNUC_CHECK_VERSION(4, 5)
@@ -202,7 +202,8 @@ static volatile gint g_bit_lock_contended[CONTENTION_CLASSES];
*
* This function accesses @address atomically. All other accesses to
* @address must be atomic in order for this function to work
- * reliably.
+ * reliably. While @address has a `volatile` qualifier, this is a historical
+ * artifact and the argument passed to it should not be `volatile`.
*
* Since: 2.24
**/
@@ -210,6 +211,8 @@ void
g_bit_lock (volatile gint *address,
gint lock_bit)
{
+ gint *address_nonvolatile = (gint *) address;
+
#ifdef USE_ASM_GOTO
retry:
__asm__ volatile goto ("lock bts %1, (%0)\n"
@@ -225,13 +228,13 @@ g_bit_lock (volatile gint *address,
guint mask = 1u << lock_bit;
guint v;
- v = (guint) g_atomic_int_get (address);
+ v = (guint) g_atomic_int_get (address_nonvolatile);
if (v & mask)
{
- guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended);
+ guint class = ((gsize) address_nonvolatile) % G_N_ELEMENTS (g_bit_lock_contended);
g_atomic_int_add (&g_bit_lock_contended[class], +1);
- g_futex_wait (address, v);
+ g_futex_wait (address_nonvolatile, v);
g_atomic_int_add (&g_bit_lock_contended[class], -1);
}
}
@@ -241,14 +244,14 @@ g_bit_lock (volatile gint *address,
guint v;
retry:
- v = g_atomic_int_or (address, mask);
+ v = g_atomic_int_or (address_nonvolatile, mask);
if (v & mask)
/* already locked */
{
- guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended);
+ guint class = ((gsize) address_nonvolatile) % G_N_ELEMENTS (g_bit_lock_contended);
g_atomic_int_add (&g_bit_lock_contended[class], +1);
- g_futex_wait (address, v);
+ g_futex_wait (address_nonvolatile, v);
g_atomic_int_add (&g_bit_lock_contended[class], -1);
goto retry;
@@ -272,7 +275,8 @@ g_bit_lock (volatile gint *address,
*
* This function accesses @address atomically. All other accesses to
* @address must be atomic in order for this function to work
- * reliably.
+ * reliably. While @address has a `volatile` qualifier, this is a historical
+ * artifact and the argument passed to it should not be `volatile`.
*
* Returns: %TRUE if the lock was acquired
*
@@ -294,10 +298,11 @@ g_bit_trylock (volatile gint *address,
return result;
#else
+ gint *address_nonvolatile = (gint *) address;
guint mask = 1u << lock_bit;
guint v;
- v = g_atomic_int_or (address, mask);
+ v = g_atomic_int_or (address_nonvolatile, mask);
return ~v & mask;
#endif
@@ -314,7 +319,8 @@ g_bit_trylock (volatile gint *address,
*
* This function accesses @address atomically. All other accesses to
* @address must be atomic in order for this function to work
- * reliably.
+ * reliably. While @address has a `volatile` qualifier, this is a historical
+ * artifact and the argument passed to it should not be `volatile`.
*
* Since: 2.24
**/
@@ -322,6 +328,8 @@ void
g_bit_unlock (volatile gint *address,
gint lock_bit)
{
+ gint *address_nonvolatile = (gint *) address;
+
#ifdef USE_ASM_GOTO
__asm__ volatile ("lock btr %1, (%0)"
: /* no output */
@@ -330,14 +338,14 @@ g_bit_unlock (volatile gint *address,
#else
guint mask = 1u << lock_bit;
- g_atomic_int_and (address, ~mask);
+ g_atomic_int_and (address_nonvolatile, ~mask);
#endif
{
- guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended);
+ guint class = ((gsize) address_nonvolatile) % G_N_ELEMENTS (g_bit_lock_contended);
if (g_atomic_int_get (&g_bit_lock_contended[class]))
- g_futex_wake (address);
+ g_futex_wake (address_nonvolatile);
}
}
@@ -366,10 +374,10 @@ g_bit_unlock (volatile gint *address,
*
* g_futex_wake (g_futex_int_address (int_address));
*/
-static const volatile gint *
-g_futex_int_address (const volatile void *address)
+static const gint *
+g_futex_int_address (const void *address)
{
- const volatile gint *int_address = address;
+ const gint *int_address = address;
/* this implementation makes these (reasonable) assumptions: */
G_STATIC_ASSERT (G_BYTE_ORDER == G_LITTLE_ENDIAN ||
@@ -395,12 +403,17 @@ g_futex_int_address (const volatile void *address)
* For portability reasons, you may only lock on the bottom 32 bits of
* the pointer.
*
+ * While @address has a `volatile` qualifier, this is a historical
+ * artifact and the argument passed to it should not be `volatile`.
+ *
* Since: 2.30
**/
void
(g_pointer_bit_lock) (volatile void *address,
gint lock_bit)
{
+ void *address_nonvolatile = (void *) address;
+
g_return_if_fail (lock_bit < 32);
{
@@ -416,23 +429,23 @@ void
contended:
{
- volatile gsize *pointer_address = address;
+ gsize *pointer_address = address_nonvolatile;
gsize mask = 1u << lock_bit;
gsize v;
v = (gsize) g_atomic_pointer_get (pointer_address);
if (v & mask)
{
- guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended);
+ guint class = ((gsize) address_nonvolatile) % G_N_ELEMENTS (g_bit_lock_contended);
g_atomic_int_add (&g_bit_lock_contended[class], +1);
- g_futex_wait (g_futex_int_address (address), v);
+ g_futex_wait (g_futex_int_address (address_nonvolatile), v);
g_atomic_int_add (&g_bit_lock_contended[class], -1);
}
}
goto retry;
#else
- volatile gsize *pointer_address = address;
+ gsize *pointer_address = address_nonvolatile;
gsize mask = 1u << lock_bit;
gsize v;
@@ -441,10 +454,10 @@ void
if (v & mask)
/* already locked */
{
- guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended);
+ guint class = ((gsize) address_nonvolatile) % G_N_ELEMENTS (g_bit_lock_contended);
g_atomic_int_add (&g_bit_lock_contended[class], +1);
- g_futex_wait (g_futex_int_address (address), (guint) v);
+ g_futex_wait (g_futex_int_address (address_nonvolatile), (guint) v);
g_atomic_int_add (&g_bit_lock_contended[class], -1);
goto retry;
@@ -458,12 +471,15 @@ void
* @address: (not nullable): a pointer to a #gpointer-sized value
* @lock_bit: a bit value between 0 and 31
*
- * This is equivalent to g_bit_trylock, but working on pointers (or
+ * This is equivalent to g_bit_trylock(), but working on pointers (or
* other pointer-sized values).
*
* For portability reasons, you may only lock on the bottom 32 bits of
* the pointer.
*
+ * While @address has a `volatile` qualifier, this is a historical
+ * artifact and the argument passed to it should not be `volatile`.
+ *
* Returns: %TRUE if the lock was acquired
*
* Since: 2.30
@@ -487,7 +503,8 @@ gboolean
return result;
#else
- volatile gsize *pointer_address = address;
+ void *address_nonvolatile = (void *) address;
+ gsize *pointer_address = address_nonvolatile;
gsize mask = 1u << lock_bit;
gsize v;
@@ -511,12 +528,17 @@ gboolean
* For portability reasons, you may only lock on the bottom 32 bits of
* the pointer.
*
+ * While @address has a `volatile` qualifier, this is a historical
+ * artifact and the argument passed to it should not be `volatile`.
+ *
* Since: 2.30
**/
void
(g_pointer_bit_unlock) (volatile void *address,
gint lock_bit)
{
+ void *address_nonvolatile = (void *) address;
+
g_return_if_fail (lock_bit < 32);
{
@@ -526,16 +548,16 @@ void
: "r" (address), "r" ((gsize) lock_bit)
: "cc", "memory");
#else
- volatile gsize *pointer_address = address;
+ gsize *pointer_address = address_nonvolatile;
gsize mask = 1u << lock_bit;
g_atomic_pointer_and (pointer_address, ~mask);
#endif
{
- guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended);
+ guint class = ((gsize) address_nonvolatile) % G_N_ELEMENTS (g_bit_lock_contended);
if (g_atomic_int_get (&g_bit_lock_contended[class]))
- g_futex_wake (g_futex_int_address (address));
+ g_futex_wake (g_futex_int_address (address_nonvolatile));
}
}
}
diff --git a/glib/gbookmarkfile.c b/glib/gbookmarkfile.c
index 05cc4de0f..14536ec9b 100644
--- a/glib/gbookmarkfile.c
+++ b/glib/gbookmarkfile.c
@@ -80,7 +80,7 @@
* displaying the bookmark inside a GUI.
*
* Here is an example of a bookmark file:
- * [bookmarks.xbel](https://gitlab.gnome.org/GNOME/glib/-/blob/master/glib/tests/bookmarks.xbel)
+ * [bookmarks.xbel](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/glib/tests/bookmarks.xbel)
*
* A bookmark file might contain more than one bookmark; each bookmark
* is accessed through its URI.
diff --git a/glib/gerror.c b/glib/gerror.c
index 222db1cc2..bd5408872 100644
--- a/glib/gerror.c
+++ b/glib/gerror.c
@@ -1101,6 +1101,30 @@ g_prefix_error (GError **err,
}
/**
+ * g_prefix_error_literal:
+ * @err: (allow-none): a return location for a #GError, or %NULL
+ * @prefix: string to prefix @err with
+ *
+ * Prefixes @prefix to an existing error message. If @err or *@err is
+ * %NULL (i.e.: no error variable) then do nothing.
+ *
+ * Since: 2.70
+ */
+void
+g_prefix_error_literal (GError **err,
+ const gchar *prefix)
+{
+ if (err && *err)
+ {
+ gchar *oldstring;
+
+ oldstring = (*err)->message;
+ (*err)->message = g_strconcat (prefix, oldstring, NULL);
+ g_free (oldstring);
+ }
+}
+
+/**
* g_propagate_prefixed_error:
* @dest: error return location
* @src: error to move into the return location
diff --git a/glib/gerror.h b/glib/gerror.h
index 6431d5b6c..bc9c03a91 100644
--- a/glib/gerror.h
+++ b/glib/gerror.h
@@ -244,6 +244,11 @@ void g_prefix_error (GError **err,
const gchar *format,
...) G_GNUC_PRINTF (2, 3);
+/* if (err) prefix the string to the ->message */
+GLIB_AVAILABLE_IN_2_70
+void g_prefix_error_literal (GError **err,
+ const gchar *prefix);
+
/* g_propagate_error then g_error_prefix on dest */
GLIB_AVAILABLE_IN_ALL
void g_propagate_prefixed_error (GError **dest,
diff --git a/glib/glib-typeof.h b/glib/glib-typeof.h
new file mode 100644
index 000000000..198901c29
--- /dev/null
+++ b/glib/glib-typeof.h
@@ -0,0 +1,43 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 2021 Iain Lane, Xavier Claessens
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GLIB_TYPEOF_H__
+#define __GLIB_TYPEOF_H__
+
+#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
+#error "Only <glib.h> can be included directly."
+#endif
+
+#include <glib/gversionmacros.h>
+
+/*
+ * We can only use __typeof__ on GCC >= 4.8, and not when compiling C++. Since
+ * __typeof__ is used in a few places in GLib, provide a pre-processor symbol
+ * to factor the check out from callers.
+ *
+ * This symbol is private.
+ */
+#undef glib_typeof
+#if !defined(__cplusplus) && (G_GNUC_CHECK_VERSION(4, 8) || defined(__clang__))
+#define glib_typeof(t) __typeof__ (t)
+#elif defined(__cplusplus) && __cplusplus >= 201103L && GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68
+/* C++11 decltype() is close enough for our usage */
+#include <type_traits>
+#define glib_typeof(t) typename std::remove_reference<decltype (t)>::type
+#endif
+
+#endif /* __GLIB_TYPEOF_H__ */
diff --git a/glib/glib.h b/glib/glib.h
index a4d43a9bf..e72c09da5 100644
--- a/glib/glib.h
+++ b/glib/glib.h
@@ -112,6 +112,7 @@
#include <glib/deprecated/gthread.h>
#include <glib/glib-autocleanups.h>
+#include <glib/glib-typeof.h>
#undef __GLIB_H_INSIDE__
diff --git a/glib/gmacros.h b/glib/gmacros.h
index 031ec2d44..27c2c48ac 100644
--- a/glib/gmacros.h
+++ b/glib/gmacros.h
@@ -277,28 +277,6 @@
#endif
/*
- * We can only use __typeof__ on GCC >= 4.8, and not when compiling C++. Since
- * __typeof__ is used in a few places in GLib, provide a pre-processor symbol
- * to factor the check out from callers.
- *
- * This symbol is private.
- */
-#undef glib_typeof
-#if !defined(__cplusplus) && (G_GNUC_CHECK_VERSION(4, 8) || defined(__clang__))
-#define glib_typeof(t) __typeof__ (t)
-#elif defined(__cplusplus) && __cplusplus >= 201103L
-/* C++11 decltype() is close enough for our usage */
-/* This needs `#include <type_traits>`, but we have guarded this feature with a
- * `GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68` check, and such a check
- * cannot be enforced in this header due to include ordering requirements.
- * Within GLib itself, which use `glib_typeof` need to add the include
- * themselves. See other examples in GLib for how to do this.
- */
-#define glib_typeof(t) typename std::remove_reference<decltype (t)>::type
-#define glib_typeof_2_68
-#endif
-
-/*
* Clang feature detection: http://clang.llvm.org/docs/LanguageExtensions.html
* These are not available on GCC, but since the pre-processor doesn't do
* operator short-circuiting, we can't use it in a statement or we'll get:
diff --git a/glib/gmem.h b/glib/gmem.h
index ccf477843..47c4735ac 100644
--- a/glib/gmem.h
+++ b/glib/gmem.h
@@ -30,11 +30,7 @@
#endif
#include <glib/gutils.h>
-
-#if defined(glib_typeof_2_68) && GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68
-/* for glib_typeof */
-#include <type_traits>
-#endif
+#include <glib/glib-typeof.h>
G_BEGIN_DECLS
@@ -115,7 +111,7 @@ gpointer g_try_realloc_n (gpointer mem,
gsize n_blocks,
gsize n_block_bytes) G_GNUC_WARN_UNUSED_RESULT;
-#if defined(glib_typeof) && GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_58 && (!defined(glib_typeof_2_68) || GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68)
+#if defined(glib_typeof) && GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_58
#define g_clear_pointer(pp, destroy) \
G_STMT_START \
{ \
@@ -218,7 +214,7 @@ g_steal_pointer (gpointer pp)
}
/* type safety */
-#if defined(glib_typeof) && GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_58 && (!defined(glib_typeof_2_68) || GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68)
+#if defined(glib_typeof) && GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_58
#define g_steal_pointer(pp) ((glib_typeof (*pp)) (g_steal_pointer) (pp))
#else /* __GNUC__ */
/* This version does not depend on gcc extensions, but gcc does not warn
diff --git a/glib/grcbox.h b/glib/grcbox.h
index 47dfd488b..0f8b99a80 100644
--- a/glib/grcbox.h
+++ b/glib/grcbox.h
@@ -23,11 +23,7 @@
#endif
#include <glib/gmem.h>
-
-#if defined(glib_typeof_2_68) && GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68
-/* for glib_typeof */
-#include <type_traits>
-#endif
+#include <glib/glib-typeof.h>
G_BEGIN_DECLS
@@ -76,7 +72,7 @@ gsize g_atomic_rc_box_get_size (gpointer mem_block);
#define g_atomic_rc_box_new0(type) \
((type *) g_atomic_rc_box_alloc0 (sizeof (type)))
-#if defined(glib_typeof) && (!defined(glib_typeof_2_68) || GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68)
+#if defined(glib_typeof)
/* Type check to avoid assigning references to different types */
#define g_rc_box_acquire(mem_block) \
((glib_typeof (mem_block)) (g_rc_box_acquire) (mem_block))
diff --git a/glib/gregex.c b/glib/gregex.c
index 5e6ddfb46..f48138ef9 100644
--- a/glib/gregex.c
+++ b/glib/gregex.c
@@ -35,6 +35,7 @@
#include "gmessages.h"
#include "gstrfuncs.h"
#include "gatomic.h"
+#include "gtestutils.h"
#include "gthread.h"
/**
@@ -206,7 +207,8 @@ struct _GMatchInfo
gint ref_count; /* the ref count (atomic) */
GRegex *regex; /* the regex */
GRegexMatchFlags match_opts; /* options used at match time on the regex */
- gint matches; /* number of matching sub patterns */
+ gint matches; /* number of matching sub patterns, guaranteed to be <= (n_subpatterns + 1) if doing a single match (rather than matching all) */
+ gint n_subpatterns; /* total number of sub patterns in the regex */
gint pos; /* position in the string where last match left off */
gint n_offsets; /* number of offsets */
gint *offsets; /* array of offsets paired 0,1 ; 2,3 ; 3,4 etc */
@@ -574,6 +576,9 @@ match_info_new (const GRegex *regex,
match_info->pos = start_position;
match_info->match_opts = match_options;
+ pcre_fullinfo (regex->pcre_re, regex->extra,
+ PCRE_INFO_CAPTURECOUNT, &match_info->n_subpatterns);
+
if (is_dfa)
{
/* These values should be enough for most cases, if they are not
@@ -584,10 +589,7 @@ match_info_new (const GRegex *regex,
}
else
{
- gint capture_count;
- pcre_fullinfo (regex->pcre_re, regex->extra,
- PCRE_INFO_CAPTURECOUNT, &capture_count);
- match_info->n_offsets = (capture_count + 1) * 3;
+ match_info->n_offsets = (match_info->n_subpatterns + 1) * 3;
}
match_info->offsets = g_new0 (gint, match_info->n_offsets);
@@ -768,6 +770,8 @@ g_match_info_next (GMatchInfo *match_info,
match_info->pos = match_info->offsets[1];
}
+ g_assert (match_info->matches <= match_info->n_subpatterns + 1);
+
/* it's possible to get two identical matches when we are matching
* empty strings, for instance if the pattern is "(?=[A-Z0-9])" and
* the string is "RegExTest" we have:
@@ -1044,16 +1048,21 @@ g_match_info_fetch_pos (const GMatchInfo *match_info,
g_return_val_if_fail (match_info != NULL, FALSE);
g_return_val_if_fail (match_num >= 0, FALSE);
+ /* check whether there was an error */
+ if (match_info->matches < 0)
+ return FALSE;
+
/* make sure the sub expression number they're requesting is less than
- * the total number of sub expressions that were matched. */
- if (match_num >= match_info->matches)
+ * the total number of sub expressions in the regex. When matching all
+ * (g_regex_match_all()), also compare against the number of matches */
+ if (match_num >= MAX (match_info->n_subpatterns + 1, match_info->matches))
return FALSE;
if (start_pos != NULL)
- *start_pos = match_info->offsets[2 * match_num];
+ *start_pos = (match_num < match_info->matches) ? match_info->offsets[2 * match_num] : -1;
if (end_pos != NULL)
- *end_pos = match_info->offsets[2 * match_num + 1];
+ *end_pos = (match_num < match_info->matches) ? match_info->offsets[2 * match_num + 1] : -1;
return TRUE;
}
@@ -1989,6 +1998,9 @@ g_regex_match_all_full (const GRegex *regex,
pcre_free (pcre_re);
#endif
+ /* don’t assert that (info->matches <= info->n_subpatterns + 1) as that only
+ * holds true for a single match, rather than matching all */
+
/* set info->pos to -1 so that a call to g_match_info_next() fails. */
info->pos = -1;
retval = info->matches >= 0;
diff --git a/glib/gstrvbuilder.c b/glib/gstrvbuilder.c
index 909360c95..07030b92f 100644
--- a/glib/gstrvbuilder.c
+++ b/glib/gstrvbuilder.c
@@ -1,5 +1,6 @@
/*
* Copyright © 2020 Canonical Ltd.
+ * Copyright © 2021 Alexandros Theodotou
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -21,6 +22,7 @@
#include "garray.h"
#include "gmem.h"
+#include "gmessages.h"
/**
* SECTION:gstrvbuilder
@@ -114,6 +116,48 @@ g_strv_builder_add (GStrvBuilder *builder,
}
/**
+ * g_strv_builder_addv:
+ * @builder: a #GStrvBuilder
+ * @value: (array zero-terminated=1): the vector of strings to add
+ *
+ * Appends all the strings in the given vector to the builder.
+ *
+ * Since 2.70
+ */
+void
+g_strv_builder_addv (GStrvBuilder *builder,
+ const char **value)
+{
+ gsize i = 0;
+ g_return_if_fail (builder != NULL);
+ g_return_if_fail (value != NULL);
+ for (i = 0; value[i] != NULL; i++)
+ g_strv_builder_add (builder, value[i]);
+}
+
+/**
+ * g_strv_builder_add_many:
+ * @builder: a #GStrvBuilder
+ * @...: one or more strings followed by %NULL
+ *
+ * Appends all the given strings to the builder.
+ *
+ * Since 2.70
+ */
+void
+g_strv_builder_add_many (GStrvBuilder *builder,
+ ...)
+{
+ va_list var_args;
+ const gchar *str;
+ g_return_if_fail (builder != NULL);
+ va_start (var_args, builder);
+ while ((str = va_arg (var_args, gchar *)) != NULL)
+ g_strv_builder_add (builder, str);
+ va_end (var_args);
+}
+
+/**
* g_strv_builder_end:
* @builder: a #GStrvBuilder
*
diff --git a/glib/gstrvbuilder.h b/glib/gstrvbuilder.h
index 395bcfbbe..48aee0128 100644
--- a/glib/gstrvbuilder.h
+++ b/glib/gstrvbuilder.h
@@ -1,5 +1,6 @@
/*
* Copyright © 2020 Canonical Ltd.
+ * Copyright © 2021 Alexandros Theodotou
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -29,7 +30,7 @@ G_BEGIN_DECLS
/**
* GStrvBuilder:
- *
+ *
* A helper object to build a %NULL-terminated string array
* by appending. See g_strv_builder_new().
*
@@ -50,6 +51,14 @@ GLIB_AVAILABLE_IN_2_68
void g_strv_builder_add (GStrvBuilder *builder,
const char *value);
+GLIB_AVAILABLE_IN_2_70
+void g_strv_builder_addv (GStrvBuilder *builder,
+ const char **value);
+
+GLIB_AVAILABLE_IN_2_70
+void g_strv_builder_add_many (GStrvBuilder *builder,
+ ...) G_GNUC_NULL_TERMINATED;
+
GLIB_AVAILABLE_IN_2_68
GStrv g_strv_builder_end (GStrvBuilder *builder);
diff --git a/glib/gunicollate.c b/glib/gunicollate.c
index d54ef19ed..dfed1041d 100644
--- a/glib/gunicollate.c
+++ b/glib/gunicollate.c
@@ -441,7 +441,7 @@ g_utf8_collate_key (const gchar *str,
if (str_locale)
{
xfrm_len = strxfrm (NULL, str_locale, 0);
- if (xfrm_len < 0 || xfrm_len >= G_MAXINT - 2)
+ if (xfrm_len >= G_MAXINT - 2)
{
g_free (str_locale);
str_locale = NULL;
diff --git a/glib/gutils.c b/glib/gutils.c
index f72a5a148..b7a2113d4 100644
--- a/glib/gutils.c
+++ b/glib/gutils.c
@@ -340,7 +340,17 @@ g_find_program_in_path (const gchar *program)
{
if (g_file_test (program, G_FILE_TEST_IS_EXECUTABLE) &&
!g_file_test (program, G_FILE_TEST_IS_DIR))
- return g_strdup (program);
+ {
+ gchar *out = NULL, *cwd = NULL;
+
+ if (g_path_is_absolute (program))
+ return g_strdup (program);
+
+ cwd = g_get_current_dir ();
+ out = g_build_filename (cwd, program, NULL);
+ g_free (cwd);
+ return g_steal_pointer (&out);
+ }
else
return NULL;
}
diff --git a/glib/gwin32-private.c b/glib/gwin32-private.c
index f7913b553..c28e92baa 100644
--- a/glib/gwin32-private.c
+++ b/glib/gwin32-private.c
@@ -18,16 +18,16 @@
/* Copy @cmdline into @debugger, and substitute @pid for `%p`
* and @event for `%e`.
- * If @debugger_size (in bytes) is overflowed, return %FALSE.
+ * If @debugger_size (in wchar_ts) is overflowed, return %FALSE.
* Also returns %FALSE when `%` is followed by anything other
* than `e` or `p`.
*/
static gboolean
-_g_win32_subst_pid_and_event (char *debugger,
- gsize debugger_size,
- const char *cmdline,
- DWORD pid,
- guintptr event)
+_g_win32_subst_pid_and_event_w (wchar_t *debugger,
+ gsize debugger_size,
+ const wchar_t *cmdline,
+ DWORD pid,
+ guintptr event)
{
gsize i = 0, dbg_i = 0;
/* These are integers, and they can't be longer than 20 characters
@@ -35,31 +35,31 @@ _g_win32_subst_pid_and_event (char *debugger,
* Use 30 just to be sure.
*/
#define STR_BUFFER_SIZE 30
- char pid_str[STR_BUFFER_SIZE] = {0};
+ wchar_t pid_str[STR_BUFFER_SIZE] = {0};
gsize pid_str_len;
- char event_str[STR_BUFFER_SIZE] = {0};
+ wchar_t event_str[STR_BUFFER_SIZE] = {0};
gsize event_str_len;
- _snprintf_s (pid_str, STR_BUFFER_SIZE, G_N_ELEMENTS (pid_str), "%lu", pid);
+ _snwprintf_s (pid_str, STR_BUFFER_SIZE, G_N_ELEMENTS (pid_str), L"%lu", pid);
pid_str[G_N_ELEMENTS (pid_str) - 1] = 0;
- pid_str_len = strlen (pid_str);
- _snprintf_s (event_str, STR_BUFFER_SIZE, G_N_ELEMENTS (pid_str), "%Iu", event);
+ pid_str_len = wcslen (pid_str);
+ _snwprintf_s (event_str, STR_BUFFER_SIZE, G_N_ELEMENTS (pid_str), L"%Iu", event);
event_str[G_N_ELEMENTS (pid_str) - 1] = 0;
- event_str_len = strlen (event_str);
+ event_str_len = wcslen (event_str);
#undef STR_BUFFER_SIZE
while (cmdline[i] != 0 && dbg_i < debugger_size)
{
- if (cmdline[i] != '%')
+ if (cmdline[i] != L'%')
debugger[dbg_i++] = cmdline[i++];
- else if (cmdline[i + 1] == 'p')
+ else if (cmdline[i + 1] == L'p')
{
gsize j = 0;
while (j < pid_str_len && dbg_i < debugger_size)
debugger[dbg_i++] = pid_str[j++];
i += 2;
}
- else if (cmdline[i + 1] == 'e')
+ else if (cmdline[i + 1] == L'e')
{
gsize j = 0;
while (j < event_str_len && dbg_i < debugger_size)
diff --git a/glib/gwin32.c b/glib/gwin32.c
index b62f19461..f4590916f 100644
--- a/glib/gwin32.c
+++ b/glib/gwin32.c
@@ -1035,10 +1035,32 @@ g_console_win32_init (void)
* it will be non-NULL. Only used to later de-install the handler
* on library de-initialization.
*/
-static void *WinVEH_handle = NULL;
+static void *WinVEH_handle = NULL;
+
+#define DEBUGGER_BUFFER_SIZE (MAX_PATH + 1)
+/* This is the debugger that we'll run on crash */
+static wchar_t debugger[DEBUGGER_BUFFER_SIZE];
+
+static gsize number_of_exceptions_to_catch = 0;
+static DWORD *exceptions_to_catch = NULL;
+
+static HANDLE debugger_wakeup_event = 0;
+static DWORD debugger_spawn_flags = 0;
#include "gwin32-private.c"
+static char *
+copy_chars (char *buffer,
+ gsize *buffer_size,
+ const char *to_copy)
+{
+ gsize copy_count = MIN (strlen (to_copy), *buffer_size - 1);
+ memset (buffer, 0x20, copy_count);
+ strncpy_s (buffer, *buffer_size, to_copy, _TRUNCATE);
+ *buffer_size -= copy_count;
+ return &buffer[copy_count];
+}
+
/* Handles exceptions (useful for debugging).
* Issues a DebugBreak() call if the process is being debugged (not really
* useful - if the process is being debugged, this handler won't be invoked
@@ -1068,24 +1090,31 @@ static void *WinVEH_handle = NULL;
* or for control flow.
*
* This function deliberately avoids calling any GLib code.
+ * This is done on purpose. This function can be called when the program
+ * is in a bad state (crashing). It can also be called very early, as soon
+ * as the handler is installed. Therefore, it's imperative that
+ * it does as little as possible. Preferably, all the work that can be
+ * done in advance (when the program is not crashing yet) should be done
+ * in advance.
*/
static LONG __stdcall
g_win32_veh_handler (PEXCEPTION_POINTERS ExceptionInfo)
{
EXCEPTION_RECORD *er;
- char debugger[MAX_PATH + 1];
- WCHAR *debugger_utf16;
- const char *debugger_env = NULL;
- const char *catch_list;
- gboolean catch = FALSE;
+ gsize i;
STARTUPINFOW si;
PROCESS_INFORMATION pi;
- HANDLE event;
- SECURITY_ATTRIBUTES sa;
+#define ITOA_BUFFER_SIZE 100
+ char itoa_buffer[ITOA_BUFFER_SIZE];
+#define DEBUG_STRING_SIZE 1024
+ gsize dbgs = DEBUG_STRING_SIZE;
+ char debug_string[DEBUG_STRING_SIZE];
+ char *dbgp;
if (ExceptionInfo == NULL ||
ExceptionInfo->ExceptionRecord == NULL ||
- IsDebuggerPresent ())
+ IsDebuggerPresent () ||
+ debugger[0] == 0)
return EXCEPTION_CONTINUE_SEARCH;
er = ExceptionInfo->ExceptionRecord;
@@ -1097,102 +1126,22 @@ g_win32_veh_handler (PEXCEPTION_POINTERS ExceptionInfo)
case EXCEPTION_ILLEGAL_INSTRUCTION:
break;
default:
- catch_list = g_getenv ("G_VEH_CATCH");
+ for (i = 0; i < number_of_exceptions_to_catch; i++)
+ if (exceptions_to_catch[i] == er->ExceptionCode)
+ break;
- while (!catch &&
- catch_list != NULL &&
- catch_list[0] != 0)
- {
- unsigned long catch_code;
- char *end;
- errno = 0;
- catch_code = strtoul (catch_list, &end, 16);
- if (errno != NO_ERROR)
- break;
- catch_list = end;
- if (catch_list != NULL && catch_list[0] == ',')
- catch_list++;
- if (catch_code == er->ExceptionCode)
- catch = TRUE;
- }
-
- if (catch)
- break;
+ if (i == number_of_exceptions_to_catch)
+ return EXCEPTION_CONTINUE_SEARCH;
- return EXCEPTION_CONTINUE_SEARCH;
- }
-
- fprintf_s (stderr,
- "Exception code=0x%lx flags=0x%lx at 0x%p",
- er->ExceptionCode,
- er->ExceptionFlags,
- er->ExceptionAddress);
-
- switch (er->ExceptionCode)
- {
- case EXCEPTION_ACCESS_VIOLATION:
- fprintf_s (stderr,
- ". Access violation - attempting to %s at address 0x%p\n",
- er->ExceptionInformation[0] == 0 ? "read data" :
- er->ExceptionInformation[0] == 1 ? "write data" :
- er->ExceptionInformation[0] == 8 ? "execute data" :
- "do something bad",
- (void *) er->ExceptionInformation[1]);
- break;
- case EXCEPTION_IN_PAGE_ERROR:
- fprintf_s (stderr,
- ". Page access violation - attempting to %s at address 0x%p with status %Ix\n",
- er->ExceptionInformation[0] == 0 ? "read from an inaccessible page" :
- er->ExceptionInformation[0] == 1 ? "write to an inaccessible page" :
- er->ExceptionInformation[0] == 8 ? "execute data in page" :
- "do something bad with a page",
- (void *) er->ExceptionInformation[1],
- er->ExceptionInformation[2]);
- break;
- default:
- fprintf_s (stderr, "\n");
break;
}
- fflush (stderr);
-
- debugger_env = g_getenv ("G_DEBUGGER");
-
- if (debugger_env == NULL)
- return EXCEPTION_CONTINUE_SEARCH;
-
- /* Create an inheritable event */
memset (&si, 0, sizeof (si));
memset (&pi, 0, sizeof (pi));
- memset (&sa, 0, sizeof (sa));
si.cb = sizeof (si);
- sa.nLength = sizeof (sa);
- sa.bInheritHandle = TRUE;
- event = CreateEvent (&sa, FALSE, FALSE, NULL);
-
- /* Put process ID and event handle into debugger commandline */
- if (!_g_win32_subst_pid_and_event (debugger, G_N_ELEMENTS (debugger),
- debugger_env, GetCurrentProcessId (),
- (guintptr) event))
- {
- CloseHandle (event);
- return EXCEPTION_CONTINUE_SEARCH;
- }
- debugger[MAX_PATH] = '\0';
-
- debugger_utf16 = g_utf8_to_utf16 (debugger, -1, NULL, NULL, NULL);
/* Run the debugger */
- if (0 != CreateProcessW (NULL,
- debugger_utf16,
- NULL,
- NULL,
- TRUE,
- g_getenv ("G_DEBUGGER_OLD_CONSOLE") != NULL ? 0 : CREATE_NEW_CONSOLE,
- NULL,
- NULL,
- &si,
- &pi))
+ if (0 != CreateProcessW (NULL, debugger, NULL, NULL, TRUE, debugger_spawn_flags, NULL, NULL, &si, &pi))
{
CloseHandle (pi.hProcess);
CloseHandle (pi.hThread);
@@ -1202,12 +1151,66 @@ g_win32_veh_handler (PEXCEPTION_POINTERS ExceptionInfo)
* up forever in case the debugger does not support
* event signalling.
*/
- WaitForSingleObject (event, 60000);
- }
-
- g_free (debugger_utf16);
+ WaitForSingleObject (debugger_wakeup_event, 60000);
+
+ dbgp = &debug_string[0];
+
+ dbgp = copy_chars (dbgp, &dbgs, "Exception code=0x");
+ itoa_buffer[0] = 0;
+ _ui64toa_s (er->ExceptionCode, itoa_buffer, ITOA_BUFFER_SIZE, 16);
+ dbgp = copy_chars (dbgp, &dbgs, itoa_buffer);
+ dbgp = copy_chars (dbgp, &dbgs, " flags=0x");
+ itoa_buffer[0] = 0;
+ _ui64toa_s (er->ExceptionFlags, itoa_buffer, ITOA_BUFFER_SIZE, 16);
+ dbgp = copy_chars (dbgp, &dbgs, itoa_buffer);
+ dbgp = copy_chars (dbgp, &dbgs, " at 0x");
+ itoa_buffer[0] = 0;
+ _ui64toa_s ((guintptr) er->ExceptionAddress, itoa_buffer, ITOA_BUFFER_SIZE, 16);
+ dbgp = copy_chars (dbgp, &dbgs, itoa_buffer);
+
+ switch (er->ExceptionCode)
+ {
+ case EXCEPTION_ACCESS_VIOLATION:
+ dbgp = copy_chars (dbgp, &dbgs, ". Access violation - attempting to ");
+ if (er->ExceptionInformation[0] == 0)
+ dbgp = copy_chars (dbgp, &dbgs, "read data");
+ else if (er->ExceptionInformation[0] == 1)
+ dbgp = copy_chars (dbgp, &dbgs, "write data");
+ else if (er->ExceptionInformation[0] == 8)
+ dbgp = copy_chars (dbgp, &dbgs, "execute data");
+ else
+ dbgp = copy_chars (dbgp, &dbgs, "do something bad");
+ dbgp = copy_chars (dbgp, &dbgs, " at address 0x");
+ itoa_buffer[0] = 0;
+ _ui64toa_s (er->ExceptionInformation[1], itoa_buffer, ITOA_BUFFER_SIZE, 16);
+ dbgp = copy_chars (dbgp, &dbgs, itoa_buffer);
+ break;
+ case EXCEPTION_IN_PAGE_ERROR:
+ dbgp = copy_chars (dbgp, &dbgs, ". Page access violation - attempting to ");
+ if (er->ExceptionInformation[0] == 0)
+ dbgp = copy_chars (dbgp, &dbgs, "read from an inaccessible page");
+ else if (er->ExceptionInformation[0] == 1)
+ dbgp = copy_chars (dbgp, &dbgs, "write to an inaccessible page");
+ else if (er->ExceptionInformation[0] == 8)
+ dbgp = copy_chars (dbgp, &dbgs, "execute data in page");
+ else
+ dbgp = copy_chars (dbgp, &dbgs, "do something bad with a page");
+ dbgp = copy_chars (dbgp, &dbgs, " at address 0x");
+ itoa_buffer[0] = 0;
+ _ui64toa_s (er->ExceptionInformation[1], itoa_buffer, ITOA_BUFFER_SIZE, 16);
+ dbgp = copy_chars (dbgp, &dbgs, itoa_buffer);
+ dbgp = copy_chars (dbgp, &dbgs, " with status ");
+ itoa_buffer[0] = 0;
+ _ui64toa_s (er->ExceptionInformation[2], itoa_buffer, ITOA_BUFFER_SIZE, 16);
+ dbgp = copy_chars (dbgp, &dbgs, itoa_buffer);
+ break;
+ default:
+ break;
+ }
- CloseHandle (event);
+ dbgp = copy_chars (dbgp, &dbgs, "\n");
+ OutputDebugStringA (debug_string);
+ }
/* Now the debugger is present, and we can try
* resuming execution, re-triggering the exception,
@@ -1219,20 +1222,88 @@ g_win32_veh_handler (PEXCEPTION_POINTERS ExceptionInfo)
return EXCEPTION_CONTINUE_SEARCH;
}
+static gsize
+parse_catch_list (const wchar_t *catch_buffer,
+ DWORD *exceptions,
+ gsize num_exceptions)
+{
+ const wchar_t *catch_list = catch_buffer;
+ gsize result = 0;
+ gsize i = 0;
+
+ while (catch_list != NULL &&
+ catch_list[0] != 0)
+ {
+ unsigned long catch_code;
+ wchar_t *end;
+ errno = 0;
+ catch_code = wcstoul (catch_list, &end, 16);
+ if (errno != NO_ERROR)
+ break;
+ catch_list = end;
+ if (catch_list != NULL && catch_list[0] == L',')
+ catch_list++;
+ if (exceptions && i < num_exceptions)
+ exceptions[i++] = catch_code;
+ }
+
+ return result;
+}
+
void
g_crash_handler_win32_init (void)
{
+ wchar_t debugger_env[DEBUGGER_BUFFER_SIZE];
+#define CATCH_BUFFER_SIZE 1024
+ wchar_t catch_buffer[CATCH_BUFFER_SIZE];
+ SECURITY_ATTRIBUTES sa;
+
if (WinVEH_handle != NULL)
return;
/* Do not register an exception handler if we're not supposed to catch any
* exceptions. Exception handlers are considered dangerous to use, and can
* break advanced exception handling such as in CLRs like C# or other managed
- * code. See: https://blogs.msdn.microsoft.com/jmstall/2006/05/24/beware-of-the-vectored-exception-handler-and-managed-code/
+ * code. See: http://www.windows-tech.info/13/785f590867bd6316.php
*/
- if (g_getenv ("G_DEBUGGER") == NULL && g_getenv("G_VEH_CATCH") == NULL)
+ debugger_env[0] = 0;
+ if (!GetEnvironmentVariableW (L"G_DEBUGGER", debugger_env, DEBUGGER_BUFFER_SIZE))
return;
+ /* Create an inheritable event */
+ memset (&sa, 0, sizeof (sa));
+ sa.nLength = sizeof (sa);
+ sa.bInheritHandle = TRUE;
+ debugger_wakeup_event = CreateEvent (&sa, FALSE, FALSE, NULL);
+
+ /* Put process ID and event handle into debugger commandline */
+ if (!_g_win32_subst_pid_and_event_w (debugger, G_N_ELEMENTS (debugger),
+ debugger_env, GetCurrentProcessId (),
+ (guintptr) debugger_wakeup_event))
+ {
+ CloseHandle (debugger_wakeup_event);
+ debugger_wakeup_event = 0;
+ debugger[0] = 0;
+ return;
+ }
+ debugger[MAX_PATH] = L'\0';
+
+ catch_buffer[0] = 0;
+ if (GetEnvironmentVariableW (L"G_VEH_CATCH", catch_buffer, CATCH_BUFFER_SIZE))
+ {
+ number_of_exceptions_to_catch = parse_catch_list (catch_buffer, NULL, 0);
+ if (number_of_exceptions_to_catch > 0)
+ {
+ exceptions_to_catch = g_new0 (DWORD, number_of_exceptions_to_catch);
+ parse_catch_list (catch_buffer, exceptions_to_catch, number_of_exceptions_to_catch);
+ }
+ }
+
+ if (GetEnvironmentVariableW (L"G_DEBUGGER_OLD_CONSOLE", (wchar_t *) &debugger_spawn_flags, 1))
+ debugger_spawn_flags = 0;
+ else
+ debugger_spawn_flags = CREATE_NEW_CONSOLE;
+
WinVEH_handle = AddVectoredExceptionHandler (0, &g_win32_veh_handler);
}
diff --git a/glib/meson.build b/glib/meson.build
index 8c18e6de4..28bfae200 100644
--- a/glib/meson.build
+++ b/glib/meson.build
@@ -142,6 +142,7 @@ install_headers(glib_deprecated_headers, subdir : 'glib-2.0/glib/deprecated')
glib_sub_headers = files(
'glib-autocleanups.h',
+ 'glib-typeof.h',
'galloca.h',
'garray.h',
'gasyncqueue.h',
diff --git a/glib/tests/atomic.c b/glib/tests/atomic.c
index 14e6e454e..8bc100f4e 100644
--- a/glib/tests/atomic.c
+++ b/glib/tests/atomic.c
@@ -97,9 +97,12 @@ test_types (void)
/* Note that atomic variables should almost certainly not be marked as
* `volatile` — see http://isvolatileusefulwiththreads.in/c/. This test exists
* to make sure that we don’t warn when built against older third party code. */
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wincompatible-pointer-types"
g_atomic_pointer_set (&vp_str_vol, NULL);
res = g_atomic_pointer_compare_and_exchange (&vp_str_vol, NULL, str);
g_assert_true (res);
+#pragma GCC diagnostic pop
g_atomic_pointer_set (&ip, 0);
ip2 = g_atomic_pointer_get (&ip);
@@ -112,7 +115,7 @@ test_types (void)
vp2 = (gpointer) g_atomic_pointer_get (&gs);
gs2 = (gsize) vp2;
g_assert_cmpuint (gs2, ==, 0);
- res = g_atomic_pointer_compare_and_exchange (&gs, NULL, NULL);
+ res = g_atomic_pointer_compare_and_exchange (&gs, NULL, (gsize) NULL);
g_assert_true (res);
g_assert_cmpuint (gs, ==, 0);
gs2 = (gsize) g_atomic_pointer_add (&gs, 5);
@@ -129,7 +132,7 @@ test_types (void)
g_assert_cmpuint (gs, ==, 8);
g_assert_cmpint (g_atomic_int_get (csp), ==, s);
- g_assert_true (g_atomic_pointer_get (cspp) == csp);
+ g_assert_true (g_atomic_pointer_get ((const gint **) cspp) == csp);
/* repeat, without the macros */
#undef g_atomic_int_set
diff --git a/glib/tests/error.c b/glib/tests/error.c
index 48f480222..51a0c35dc 100644
--- a/glib/tests/error.c
+++ b/glib/tests/error.c
@@ -70,6 +70,27 @@ test_prefix (void)
}
static void
+test_prefix_literal (void)
+{
+ GError *error = NULL;
+
+ g_prefix_error_literal (NULL, "foo: ");
+
+ g_prefix_error_literal (&error, "foo: ");
+ g_assert_null (error);
+
+ error = NULL;
+ g_prefix_error_literal (&error, "foo: ");
+ g_assert_null (error);
+
+ error = g_error_new_literal (G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY, "bla");
+ g_assert_nonnull (error);
+ g_prefix_error_literal (&error, "foo: ");
+ g_assert_cmpstr (error->message, ==, "foo: bla");
+ g_error_free (error);
+}
+
+static void
test_literal (void)
{
GError *error;
@@ -374,6 +395,7 @@ main (int argc, char *argv[])
g_test_add_func ("/error/overwrite", test_overwrite);
g_test_add_func ("/error/prefix", test_prefix);
+ g_test_add_func ("/error/prefix-literal", test_prefix_literal);
g_test_add_func ("/error/literal", test_literal);
g_test_add_func ("/error/copy", test_copy);
g_test_add_func ("/error/matches", test_matches);
diff --git a/glib/tests/once.c b/glib/tests/once.c
index 8fc8d5014..ea521c05b 100644
--- a/glib/tests/once.c
+++ b/glib/tests/once.c
@@ -192,7 +192,7 @@ test_once_init_multi_threaded (void)
static void
test_once_init_string (void)
{
- static const gchar *val;
+ static gchar *val;
g_test_summary ("Test g_once_init_{enter,leave}() usage with a string");
diff --git a/glib/tests/regex.c b/glib/tests/regex.c
index 60ab2f9df..6b76f761f 100644
--- a/glib/tests/regex.c
+++ b/glib/tests/regex.c
@@ -2557,13 +2557,16 @@ main (int argc, char *argv[])
TEST_SUB_PATTERN("(a)?(b)", "b", 0, 0, "b", 0, 1);
TEST_SUB_PATTERN("(a)?(b)", "b", 0, 1, "", -1, -1);
TEST_SUB_PATTERN("(a)?(b)", "b", 0, 2, "b", 0, 1);
+ TEST_SUB_PATTERN("(a)?b", "b", 0, 0, "b", 0, 1);
+ TEST_SUB_PATTERN("(a)?b", "b", 0, 1, "", -1, -1);
+ TEST_SUB_PATTERN("(a)?b", "b", 0, 2, NULL, UNTOUCHED, UNTOUCHED);
/* TEST_NAMED_SUB_PATTERN(pattern, string, start_position, sub_name,
* expected_sub, expected_start, expected_end) */
TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "ab", 0, "A", "b", 1, 2);
TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "aab", 1, "A", "b", 2, 3);
TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", EURO "ab", 0, "A", "b", 4, 5);
- TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", EURO "ab", 0, "B", NULL, UNTOUCHED, UNTOUCHED);
+ TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", EURO "ab", 0, "B", "", -1, -1);
TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", EURO "ab", 0, "C", NULL, UNTOUCHED, UNTOUCHED);
TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "a" EGRAVE "x", 0, "A", EGRAVE, 1, 3);
TEST_NAMED_SUB_PATTERN("a(?P<A>.)(?P<B>.)?", "a" EGRAVE "x", 0, "B", "x", 3, 4);
diff --git a/glib/tests/strvbuilder.c b/glib/tests/strvbuilder.c
index 5f3b9329f..904af0e71 100644
--- a/glib/tests/strvbuilder.c
+++ b/glib/tests/strvbuilder.c
@@ -1,5 +1,6 @@
/*
* Copyright © 2020 Canonical Ltd.
+ * Copyright © 2021 Alexandros Theodotou
*
* This work is provided "as is"; redistribution and modification
* in whole or in part, in any medium, physical or electronic is
@@ -56,6 +57,40 @@ test_strvbuilder_add (void)
}
static void
+test_strvbuilder_addv (void)
+{
+ GStrvBuilder *builder;
+ GStrv result;
+ const gchar *expected[] = { "one", "two", "three", NULL };
+
+ builder = g_strv_builder_new ();
+ g_strv_builder_addv (builder, expected);
+ result = g_strv_builder_end (builder);
+ g_assert_nonnull (result);
+ g_assert_cmpstrv ((const gchar *const *) result, expected);
+
+ g_strfreev (result);
+ g_strv_builder_unref (builder);
+}
+
+static void
+test_strvbuilder_add_many (void)
+{
+ GStrvBuilder *builder;
+ GStrv result;
+ const gchar *expected[] = { "one", "two", "three", NULL };
+
+ builder = g_strv_builder_new ();
+ g_strv_builder_add_many (builder, "one", "two", "three", NULL);
+ result = g_strv_builder_end (builder);
+ g_assert_nonnull (result);
+ g_assert_cmpstrv ((const gchar *const *) result, expected);
+
+ g_strfreev (result);
+ g_strv_builder_unref (builder);
+}
+
+static void
test_strvbuilder_ref (void)
{
GStrvBuilder *builder;
@@ -74,6 +109,8 @@ main (int argc,
g_test_add_func ("/strvbuilder/empty", test_strvbuilder_empty);
g_test_add_func ("/strvbuilder/add", test_strvbuilder_add);
+ g_test_add_func ("/strvbuilder/addv", test_strvbuilder_addv);
+ g_test_add_func ("/strvbuilder/add_many", test_strvbuilder_add_many);
g_test_add_func ("/strvbuilder/ref", test_strvbuilder_ref);
return g_test_run ();
diff --git a/glib/tests/utils.c b/glib/tests/utils.c
index edd403671..f47e3595c 100644
--- a/glib/tests/utils.c
+++ b/glib/tests/utils.c
@@ -246,6 +246,11 @@ test_find_program (void)
gchar *res;
#ifdef G_OS_UNIX
+ gchar *relative_path;
+ gchar *absolute_path;
+ gchar *cwd;
+ gsize i;
+
res = g_find_program_in_path ("sh");
g_assert (res != NULL);
g_free (res);
@@ -253,6 +258,27 @@ test_find_program (void)
res = g_find_program_in_path ("/bin/sh");
g_assert (res != NULL);
g_free (res);
+
+ cwd = g_get_current_dir ();
+ absolute_path = g_find_program_in_path ("sh");
+ relative_path = g_strdup (absolute_path);
+ for (i = 0; cwd[i] != '\0'; i++)
+ {
+ if (cwd[i] == '/' && cwd[i + 1] != '\0')
+ {
+ gchar *relative_path_2 = g_strconcat ("../", relative_path, NULL);
+ g_free (relative_path);
+ relative_path = relative_path_2;
+ }
+ }
+ res = g_find_program_in_path (relative_path);
+ g_assert_nonnull (res);
+ g_assert_true (g_path_is_absolute (res));
+ g_free (cwd);
+ g_free (absolute_path);
+ g_free (relative_path);
+ g_free (res);
+
#else
/* There's not a lot we can search for that would reliably work both
* on real Windows and mingw.
diff --git a/glib/tests/win32.c b/glib/tests/win32.c
index 97e5887cf..121997311 100644
--- a/glib/tests/win32.c
+++ b/glib/tests/win32.c
@@ -33,34 +33,40 @@ static char *argv0 = NULL;
static void
test_subst_pid_and_event (void)
{
- const gchar not_enough[] = "too long when %e and %p are substituted";
- gchar debugger_3[3];
- gchar debugger_not_enough[G_N_ELEMENTS (not_enough)];
- gchar debugger_enough[G_N_ELEMENTS (not_enough) + 1];
- gchar debugger_big[65535] = {0};
+ const wchar_t not_enough[] = L"too long when %e and %p are substituted";
+ wchar_t debugger_3[3];
+ wchar_t debugger_not_enough[G_N_ELEMENTS (not_enough)];
+ wchar_t debugger_enough[G_N_ELEMENTS (not_enough) + 1];
+ char *debugger_enough_utf8;
+ wchar_t debugger_big[65535] = {0};
+ char *debugger_big_utf8;
gchar *output;
guintptr be = (guintptr) 0xFFFFFFFF;
DWORD bp = G_MAXSIZE;
/* %f is not valid */
- g_assert_false (_g_win32_subst_pid_and_event (debugger_3, G_N_ELEMENTS (debugger_3),
- "%f", 0, 0));
+ g_assert_false (_g_win32_subst_pid_and_event_w (debugger_3, G_N_ELEMENTS (debugger_3),
+ L"%f", 0, 0));
- g_assert_false (_g_win32_subst_pid_and_event (debugger_3, G_N_ELEMENTS (debugger_3),
- "string longer than 10", 0, 0));
+ g_assert_false (_g_win32_subst_pid_and_event_w (debugger_3, G_N_ELEMENTS (debugger_3),
+ L"string longer than 10", 0, 0));
/* 200 is longer than %e, so the string doesn't fit by 1 byte */
- g_assert_false (_g_win32_subst_pid_and_event (debugger_not_enough, G_N_ELEMENTS (debugger_not_enough),
- "too long when %e and %p are substituted", 10, 200));
+ g_assert_false (_g_win32_subst_pid_and_event_w (debugger_not_enough, G_N_ELEMENTS (debugger_not_enough),
+ not_enough, 10, 200));
/* This should fit */
- g_assert_true (_g_win32_subst_pid_and_event (debugger_enough, G_N_ELEMENTS (debugger_enough),
- "too long when %e and %p are substituted", 10, 200));
- g_assert_cmpstr (debugger_enough, ==, "too long when 200 and 10 are substituted");
-
- g_assert_true (_g_win32_subst_pid_and_event (debugger_big, G_N_ELEMENTS (debugger_big),
- "multipl%e big %e %entries and %pids are %provided here", bp, be));
+ g_assert_true (_g_win32_subst_pid_and_event_w (debugger_enough, G_N_ELEMENTS (debugger_enough),
+ not_enough, 10, 200));
+ debugger_enough_utf8 = g_utf16_to_utf8 (debugger_enough, -1, NULL, NULL, NULL);
+ g_assert_cmpstr (debugger_enough_utf8, ==, "too long when 200 and 10 are substituted");
+ g_free (debugger_enough_utf8);
+
+ g_assert_true (_g_win32_subst_pid_and_event_w (debugger_big, G_N_ELEMENTS (debugger_big),
+ L"multipl%e big %e %entries and %pids are %provided here", bp, be));
+ debugger_big_utf8 = g_utf16_to_utf8 (debugger_big, -1, NULL, NULL, NULL);
output = g_strdup_printf ("multipl%llu big %llu %lluntries and %luids are %lurovided here", (guint64) be, (guint64) be, (guint64) be, bp, bp);
- g_assert_cmpstr (debugger_big, ==, output);
+ g_assert_cmpstr (debugger_big_utf8, ==, output);
+ g_free (debugger_big_utf8);
g_free (output);
}
@@ -95,7 +101,6 @@ test_veh_crash_access_violation (void)
/* Run a test that crashes */
g_test_trap_subprocess ("/win32/subprocess/access_violation", 0, 0);
g_test_trap_assert_failed ();
- g_test_trap_assert_stderr ("Exception code=0xc0000005*");
}
static void
@@ -105,21 +110,11 @@ test_veh_crash_illegal_instruction (void)
/* Run a test that crashes */
g_test_trap_subprocess ("/win32/subprocess/illegal_instruction", 0, 0);
g_test_trap_assert_failed ();
- g_test_trap_assert_stderr ("Exception code=0xc000001d*");
}
static void
test_veh_debug (void)
{
- /* Run a test that crashes and runs a debugger */
- g_test_trap_subprocess ("/win32/subprocess/debuggee", 0, 0);
- g_test_trap_assert_failed ();
- g_test_trap_assert_stderr ("Exception code=0xc0000005*Debugger invoked, attaching to*");
-}
-
-static void
-test_veh_debuggee (void)
-{
/* Set up a debugger to be run on crash */
gchar *command = g_strdup_printf ("%s %s", argv0, "%p %e");
g_setenv ("G_DEBUGGER", command, TRUE);
@@ -129,6 +124,15 @@ test_veh_debuggee (void)
*/
g_setenv ("G_DEBUGGER_OLD_CONSOLE", "1", TRUE);
g_free (command);
+ /* Run a test that crashes and runs a debugger */
+ g_test_trap_subprocess ("/win32/subprocess/debuggee", 0, 0);
+ g_test_trap_assert_failed ();
+ g_test_trap_assert_stderr ("Debugger invoked, attaching to*");
+}
+
+static void
+test_veh_debuggee (void)
+{
/* Crash */
test_access_violation ();
}
diff --git a/gmodule/gmodule-dl.c b/gmodule/gmodule-dl.c
index bb2df6836..c1408212a 100644
--- a/gmodule/gmodule-dl.c
+++ b/gmodule/gmodule-dl.c
@@ -28,6 +28,7 @@
#include "config.h"
#include <dlfcn.h>
+#include <glib.h>
/* Perl includes <nlist.h> and <link.h> instead of <dlfcn.h> on some systems? */
@@ -73,11 +74,46 @@
#endif /* RTLD_GLOBAL */
-/* --- functions --- */
-static gchar*
+/* According to POSIX.1-2001, dlerror() is not necessarily thread-safe
+ * (see https://pubs.opengroup.org/onlinepubs/009695399/), and so must be
+ * called within the same locked section as the dlopen()/dlsym() call which
+ * may have caused an error.
+ *
+ * However, some libc implementations, such as glibc, implement dlerror() using
+ * thread-local storage, so are thread-safe. As of early 2021:
+ * - glibc is thread-safe: https://github.com/bminor/glibc/blob/HEAD/dlfcn/libc_dlerror_result.c
+ * - uclibc-ng is not thread-safe: https://cgit.uclibc-ng.org/cgi/cgit/uclibc-ng.git/tree/ldso/libdl/libdl.c?id=132decd2a043d0ccf799f42bf89f3ae0c11e95d5#n1075
+ * - Other libc implementations have not been checked, and no problems have
+ * been reported with them in 10 years, so default to assuming that they
+ * don’t need additional thread-safety from GLib
+ */
+#if defined(__UCLIBC__)
+G_LOCK_DEFINE_STATIC (errors);
+#else
+#define DLERROR_IS_THREADSAFE 1
+#endif
+
+static void
+lock_dlerror (void)
+{
+#ifndef DLERROR_IS_THREADSAFE
+ G_LOCK (errors);
+#endif
+}
+
+static void
+unlock_dlerror (void)
+{
+#ifndef DLERROR_IS_THREADSAFE
+ G_UNLOCK (errors);
+#endif
+}
+
+/* This should be called with lock_dlerror() held */
+static const gchar *
fetch_dlerror (gboolean replace_null)
{
- gchar *msg = dlerror ();
+ const gchar *msg = dlerror ();
/* make sure we always return an error message != NULL, if
* expected to do so. */
@@ -95,10 +131,12 @@ _g_module_open (const gchar *file_name,
{
gpointer handle;
+ lock_dlerror ();
handle = dlopen (file_name,
(bind_local ? 0 : RTLD_GLOBAL) | (bind_lazy ? RTLD_LAZY : RTLD_NOW));
if (!handle)
g_module_set_error (fetch_dlerror (TRUE));
+ unlock_dlerror ();
return handle;
}
@@ -119,6 +157,7 @@ _g_module_self (void)
* always returns 'undefined symbol'. Only if RTLD_DEFAULT or
* NULL is given, dlsym returns an appropriate pointer.
*/
+ lock_dlerror ();
#if defined(__BIONIC__)
handle = RTLD_DEFAULT;
#else
@@ -126,6 +165,7 @@ _g_module_self (void)
#endif
if (!handle)
g_module_set_error (fetch_dlerror (TRUE));
+ unlock_dlerror ();
return handle;
}
@@ -137,8 +177,10 @@ _g_module_close (gpointer handle)
if (handle != RTLD_DEFAULT)
#endif
{
+ lock_dlerror ();
if (dlclose (handle) != 0)
- g_module_set_error (fetch_dlerror (TRUE));
+ g_module_set_error (fetch_dlerror (TRUE));
+ unlock_dlerror ();
}
}
@@ -147,13 +189,15 @@ _g_module_symbol (gpointer handle,
const gchar *symbol_name)
{
gpointer p;
- gchar *msg;
+ const gchar *msg;
+ lock_dlerror ();
fetch_dlerror (FALSE);
p = dlsym (handle, symbol_name);
msg = fetch_dlerror (FALSE);
if (msg)
g_module_set_error (msg);
+ unlock_dlerror ();
return p;
}
diff --git a/gobject/gobject.c b/gobject/gobject.c
index 750a7d120..2346cb3ef 100644
--- a/gobject/gobject.c
+++ b/gobject/gobject.c
@@ -3319,7 +3319,8 @@ g_object_add_toggle_ref (GObject *object,
* @notify: a function to call when this reference is the
* last reference to the object, or is no longer
* the last reference.
- * @data: data to pass to @notify
+ * @data: (nullable): data to pass to @notify, or %NULL to
+ * match any toggle refs with the @notify argument.
*
* Removes a reference added with g_object_add_toggle_ref(). The
* reference count of the object is decreased by one.
@@ -3345,7 +3346,7 @@ g_object_remove_toggle_ref (GObject *object,
for (i = 0; i < tstack->n_toggle_refs; i++)
if (tstack->toggle_refs[i].notify == notify &&
- tstack->toggle_refs[i].data == data)
+ (tstack->toggle_refs[i].data == data || data == NULL))
{
found_one = TRUE;
tstack->n_toggle_refs -= 1;
diff --git a/gobject/gobject.h b/gobject/gobject.h
index 125aed876..aec8975e4 100644
--- a/gobject/gobject.h
+++ b/gobject/gobject.h
@@ -28,11 +28,6 @@
#include <gobject/gsignal.h>
#include <gobject/gboxed.h>
-#if defined(glib_typeof_2_68) && GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68
-/* for glib_typeof */
-#include <type_traits>
-#endif
-
G_BEGIN_DECLS
/* --- type macros --- */
@@ -518,7 +513,7 @@ GLIB_AVAILABLE_IN_ALL
void g_object_remove_weak_pointer (GObject *object,
gpointer *weak_pointer_location);
-#if defined(glib_typeof) && GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_56 && (!defined(glib_typeof_2_68) || GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_68)
+#if defined(glib_typeof) && GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_56
/* Make reference APIs type safe with macros */
#define g_object_ref(Obj) ((glib_typeof (Obj)) (g_object_ref) (Obj))
#define g_object_ref_sink(Obj) ((glib_typeof (Obj)) (g_object_ref_sink) (Obj))
diff --git a/gobject/gtype.c b/gobject/gtype.c
index 94e23b814..2cdbe7ce4 100644
--- a/gobject/gtype.c
+++ b/gobject/gtype.c
@@ -1100,7 +1100,8 @@ type_data_make_W (TypeNode *node,
vtable = pnode->data->common.value_table;
else
{
- static const GTypeValueTable zero_vtable = { NULL, };
+ static const GTypeValueTable zero_vtable =
+ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
value_table = &zero_vtable;
}
diff --git a/po/he.po b/po/he.po
index c81a86b82..b0fd340bc 100644
--- a/po/he.po
+++ b/po/he.po
@@ -14,16 +14,17 @@ msgid ""
msgstr ""
"Project-Id-Version: glib.HEAD.he\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n"
-"POT-Creation-Date: 2020-08-22 13:31+0000\n"
-"PO-Revision-Date: 2020-09-28 23:42+0300\n"
-"Last-Translator: Yosef Or Boczko <yoseforb@gmail.com>\n"
+"POT-Creation-Date: 2021-03-22 11:48+0000\n"
+"PO-Revision-Date: 2021-05-28 22:57+0300\n"
+"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"Language-Team: Hebrew <yoseforb@gmail.com>\n"
"Language: he\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-"X-Generator: Gtranslator 3.36.0\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? "
+"2 : 3);\n"
+"X-Generator: Poedit 2.4.3\n"
#: gio/gapplication.c:500
msgid "GApplication options"
@@ -62,90 +63,90 @@ msgstr "Print version"
msgid "Print version information and exit"
msgstr "Print version information and exit"
-#: gio/gapplication-tool.c:52
+#: gio/gapplication-tool.c:53
msgid "List applications"
msgstr "List applications"
-#: gio/gapplication-tool.c:53
+#: gio/gapplication-tool.c:54
msgid "List the installed D-Bus activatable applications (by .desktop files)"
msgstr "List the installed D-Bus activatable applications (by .desktop files)"
-#: gio/gapplication-tool.c:55
+#: gio/gapplication-tool.c:57
msgid "Launch an application"
msgstr "Launch an application"
-#: gio/gapplication-tool.c:56
+#: gio/gapplication-tool.c:58
msgid "Launch the application (with optional files to open)"
msgstr "Launch the application (with optional files to open)"
-#: gio/gapplication-tool.c:57
+#: gio/gapplication-tool.c:59
msgid "APPID [FILE…]"
msgstr "APPID [FILE…]"
-#: gio/gapplication-tool.c:59
+#: gio/gapplication-tool.c:61
msgid "Activate an action"
msgstr "Activate an action"
-#: gio/gapplication-tool.c:60
+#: gio/gapplication-tool.c:62
msgid "Invoke an action on the application"
msgstr "Invoke an action on the application"
-#: gio/gapplication-tool.c:61
+#: gio/gapplication-tool.c:63
msgid "APPID ACTION [PARAMETER]"
msgstr "APPID ACTION [PARAMETER]"
-#: gio/gapplication-tool.c:63
+#: gio/gapplication-tool.c:65
msgid "List available actions"
msgstr "List available actions"
-#: gio/gapplication-tool.c:64
+#: gio/gapplication-tool.c:66
msgid "List static actions for an application (from .desktop file)"
msgstr "List static actions for an application (from .desktop file)"
-#: gio/gapplication-tool.c:65 gio/gapplication-tool.c:71
+#: gio/gapplication-tool.c:67 gio/gapplication-tool.c:73
msgid "APPID"
msgstr "APPID"
-#: gio/gapplication-tool.c:70 gio/gapplication-tool.c:133 gio/gdbus-tool.c:102
+#: gio/gapplication-tool.c:72 gio/gapplication-tool.c:135 gio/gdbus-tool.c:106
#: gio/gio-tool.c:224
msgid "COMMAND"
msgstr "COMMAND"
-#: gio/gapplication-tool.c:70
+#: gio/gapplication-tool.c:72
msgid "The command to print detailed help for"
msgstr "The command to print detailed help for"
-#: gio/gapplication-tool.c:71
+#: gio/gapplication-tool.c:73
msgid "Application identifier in D-Bus format (eg: org.example.viewer)"
msgstr "Application identifier in D-Bus format (eg: org.example.viewer)"
-#: gio/gapplication-tool.c:72 gio/glib-compile-resources.c:738
+#: gio/gapplication-tool.c:74 gio/glib-compile-resources.c:738
#: gio/glib-compile-resources.c:744 gio/glib-compile-resources.c:772
#: gio/gresource-tool.c:500 gio/gresource-tool.c:566
msgid "FILE"
msgstr "FILE"
-#: gio/gapplication-tool.c:72
+#: gio/gapplication-tool.c:74
msgid "Optional relative or absolute filenames, or URIs to open"
msgstr "Optional relative or absolute filenames, or URIs to open"
-#: gio/gapplication-tool.c:73
+#: gio/gapplication-tool.c:75
msgid "ACTION"
msgstr "ACTION"
-#: gio/gapplication-tool.c:73
+#: gio/gapplication-tool.c:75
msgid "The action name to invoke"
msgstr "The action name to invoke"
-#: gio/gapplication-tool.c:74
+#: gio/gapplication-tool.c:76
msgid "PARAMETER"
msgstr "PARAMETER"
-#: gio/gapplication-tool.c:74
+#: gio/gapplication-tool.c:76
msgid "Optional parameter to the action invocation, in GVariant format"
msgstr "Optional parameter to the action invocation, in GVariant format"
-#: gio/gapplication-tool.c:96 gio/gresource-tool.c:531 gio/gsettings-tool.c:659
+#: gio/gapplication-tool.c:98 gio/gresource-tool.c:531 gio/gsettings-tool.c:659
#, c-format
msgid ""
"Unknown command %s\n"
@@ -154,26 +155,26 @@ msgstr ""
"Unknown command %s\n"
"\n"
-#: gio/gapplication-tool.c:101
+#: gio/gapplication-tool.c:103
msgid "Usage:\n"
msgstr "Usage:\n"
-#: gio/gapplication-tool.c:114 gio/gresource-tool.c:556
+#: gio/gapplication-tool.c:116 gio/gresource-tool.c:556
#: gio/gsettings-tool.c:694
msgid "Arguments:\n"
msgstr "Arguments:\n"
-#: gio/gapplication-tool.c:133 gio/gio-tool.c:224
+#: gio/gapplication-tool.c:135 gio/gio-tool.c:224
msgid "[ARGS…]"
msgstr "[ARGS…]"
-#: gio/gapplication-tool.c:134
+#: gio/gapplication-tool.c:136
#, c-format
msgid "Commands:\n"
msgstr "Commands:\n"
#. Translators: do not translate 'help', but please translate 'COMMAND'.
-#: gio/gapplication-tool.c:146
+#: gio/gapplication-tool.c:148
#, c-format
msgid ""
"Use “%s help COMMAND” to get detailed help.\n"
@@ -182,7 +183,7 @@ msgstr ""
"Use “%s help COMMAND” to get detailed help.\n"
"\n"
-#: gio/gapplication-tool.c:165
+#: gio/gapplication-tool.c:167
#, c-format
msgid ""
"%s command requires an application id to directly follow\n"
@@ -191,13 +192,13 @@ msgstr ""
"%s command requires an application id to directly follow\n"
"\n"
-#: gio/gapplication-tool.c:171
+#: gio/gapplication-tool.c:173
#, c-format
msgid "invalid application id: “%s”\n"
msgstr "invalid application id: “%s”\n"
#. Translators: %s is replaced with a command name like 'list-actions'
-#: gio/gapplication-tool.c:182
+#: gio/gapplication-tool.c:184
#, c-format
msgid ""
"“%s” takes no arguments\n"
@@ -206,21 +207,21 @@ msgstr ""
"“%s” takes no arguments\n"
"\n"
-#: gio/gapplication-tool.c:266
+#: gio/gapplication-tool.c:268
#, c-format
msgid "unable to connect to D-Bus: %s\n"
msgstr "unable to connect to D-Bus: %s\n"
-#: gio/gapplication-tool.c:286
+#: gio/gapplication-tool.c:288
#, c-format
msgid "error sending %s message to application: %s\n"
msgstr "error sending %s message to application: %s\n"
-#: gio/gapplication-tool.c:317
+#: gio/gapplication-tool.c:319
msgid "action name must be given after application id\n"
msgstr "action name must be given after application id\n"
-#: gio/gapplication-tool.c:325
+#: gio/gapplication-tool.c:327
#, c-format
msgid ""
"invalid action name: “%s”\n"
@@ -229,25 +230,25 @@ msgstr ""
"invalid action name: “%s”\n"
"action names must consist of only alphanumerics, “-” and “.”\n"
-#: gio/gapplication-tool.c:344
+#: gio/gapplication-tool.c:346
#, c-format
msgid "error parsing action parameter: %s\n"
msgstr "error parsing action parameter: %s\n"
-#: gio/gapplication-tool.c:356
+#: gio/gapplication-tool.c:358
msgid "actions accept a maximum of one parameter\n"
msgstr "actions accept a maximum of one parameter\n"
-#: gio/gapplication-tool.c:411
+#: gio/gapplication-tool.c:413
msgid "list-actions command takes only the application id"
msgstr "list-actions command takes only the application id"
-#: gio/gapplication-tool.c:421
+#: gio/gapplication-tool.c:423
#, c-format
msgid "unable to find desktop file for application %s\n"
msgstr "unable to find desktop file for application %s\n"
-#: gio/gapplication-tool.c:466
+#: gio/gapplication-tool.c:468
#, c-format
msgid ""
"unrecognised command: %s\n"
@@ -257,8 +258,8 @@ msgstr ""
"\n"
#: gio/gbufferedinputstream.c:420 gio/gbufferedinputstream.c:498
-#: gio/ginputstream.c:179 gio/ginputstream.c:379 gio/ginputstream.c:617
-#: gio/ginputstream.c:1019 gio/goutputstream.c:223 gio/goutputstream.c:1049
+#: gio/ginputstream.c:179 gio/ginputstream.c:379 gio/ginputstream.c:646
+#: gio/ginputstream.c:1048 gio/goutputstream.c:223 gio/goutputstream.c:1049
#: gio/gpollableinputstream.c:205 gio/gpollableoutputstream.c:277
#, c-format
msgid "Too large count value passed to %s"
@@ -269,11 +270,11 @@ msgstr "Too large count value passed to %s"
msgid "Seek not supported on base stream"
msgstr "Seek not supported on base stream"
-#: gio/gbufferedinputstream.c:937
+#: gio/gbufferedinputstream.c:938
msgid "Cannot truncate GBufferedInputStream"
msgstr "Cannot truncate GBufferedInputStream"
-#: gio/gbufferedinputstream.c:982 gio/ginputstream.c:1208 gio/giostream.c:300
+#: gio/gbufferedinputstream.c:983 gio/ginputstream.c:1237 gio/giostream.c:300
#: gio/goutputstream.c:2198
msgid "Stream is already closed"
msgstr "Stream is already closed"
@@ -282,7 +283,7 @@ msgstr "Stream is already closed"
msgid "Truncate not supported on base stream"
msgstr "Truncate not supported on base stream"
-#: gio/gcancellable.c:319 gio/gdbusconnection.c:1862 gio/gdbusprivate.c:1413
+#: gio/gcancellable.c:319 gio/gdbusconnection.c:1872 gio/gdbusprivate.c:1416
#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897
#, c-format
msgid "Operation was cancelled"
@@ -301,25 +302,25 @@ msgid "Not enough space in destination"
msgstr "Not enough space in destination"
#: gio/gcharsetconverter.c:342 gio/gdatainputstream.c:848
-#: gio/gdatainputstream.c:1261 glib/gconvert.c:448 glib/gconvert.c:878
-#: glib/giochannel.c:1564 glib/giochannel.c:1606 glib/giochannel.c:2461
+#: gio/gdatainputstream.c:1266 glib/gconvert.c:448 glib/gconvert.c:878
+#: glib/giochannel.c:1573 glib/giochannel.c:1615 glib/giochannel.c:2470
#: glib/gutf8.c:875 glib/gutf8.c:1328
msgid "Invalid byte sequence in conversion input"
msgstr "Invalid byte sequence in conversion input"
#: gio/gcharsetconverter.c:347 glib/gconvert.c:456 glib/gconvert.c:792
-#: glib/giochannel.c:1571 glib/giochannel.c:2473
+#: glib/giochannel.c:1580 glib/giochannel.c:2482
#, c-format
msgid "Error during conversion: %s"
msgstr "Error during conversion: %s"
-#: gio/gcharsetconverter.c:445 gio/gsocket.c:1133
+#: gio/gcharsetconverter.c:445 gio/gsocket.c:1143
msgid "Cancellable initialization not supported"
msgstr "Cancellable initialization not supported"
# *** This file should not be translated to hebrew, please only copy the english text ***
# *** Old hebrew ranslation is commented for backup sake ***
-#: gio/gcharsetconverter.c:456 glib/gconvert.c:321 glib/giochannel.c:1392
+#: gio/gcharsetconverter.c:456 glib/gconvert.c:321 glib/giochannel.c:1401
#, c-format
msgid "Conversion from character set “%s” to “%s” is not supported"
msgstr "Conversion from character set “%s” to “%s” is not supported"
@@ -329,7 +330,7 @@ msgstr "Conversion from character set “%s” to “%s” is not supported"
msgid "Could not open converter from “%s” to “%s”"
msgstr "Could not open converter from “%s” to “%s”"
-#: gio/gcontenttype.c:452
+#: gio/gcontenttype.c:454
#, c-format
msgid "%s type"
msgstr "%s type"
@@ -367,17 +368,17 @@ msgstr "Credentials spoofing is not possible on this OS"
msgid "Unexpected early end-of-stream"
msgstr "Unexpected early end-of-stream"
-#: gio/gdbusaddress.c:158 gio/gdbusaddress.c:232 gio/gdbusaddress.c:321
+#: gio/gdbusaddress.c:159 gio/gdbusaddress.c:233 gio/gdbusaddress.c:322
#, c-format
msgid "Unsupported key “%s” in address entry “%s”"
msgstr "Unsupported key “%s” in address entry “%s”"
-#: gio/gdbusaddress.c:171
+#: gio/gdbusaddress.c:172
#, c-format
msgid "Meaningless key/value pair combination in address entry “%s”"
msgstr "Meaningless key/value pair combination in address entry “%s”"
-#: gio/gdbusaddress.c:180
+#: gio/gdbusaddress.c:181
#, c-format
msgid ""
"Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract "
@@ -386,28 +387,28 @@ msgstr ""
"Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract "
"keys)"
-#: gio/gdbusaddress.c:247 gio/gdbusaddress.c:258 gio/gdbusaddress.c:273
-#: gio/gdbusaddress.c:336 gio/gdbusaddress.c:347
+#: gio/gdbusaddress.c:248 gio/gdbusaddress.c:259 gio/gdbusaddress.c:274
+#: gio/gdbusaddress.c:337 gio/gdbusaddress.c:348
#, c-format
msgid "Error in address “%s” — the “%s” attribute is malformed"
msgstr "Error in address “%s” — the “%s” attribute is malformed"
-#: gio/gdbusaddress.c:417 gio/gdbusaddress.c:681
+#: gio/gdbusaddress.c:418 gio/gdbusaddress.c:682
#, c-format
msgid "Unknown or unsupported transport “%s” for address “%s”"
msgstr "Unknown or unsupported transport “%s” for address “%s”"
-#: gio/gdbusaddress.c:461
+#: gio/gdbusaddress.c:462
#, c-format
msgid "Address element “%s” does not contain a colon (:)"
msgstr "Address element “%s” does not contain a colon (:)"
-#: gio/gdbusaddress.c:470
+#: gio/gdbusaddress.c:471
#, c-format
msgid "Transport name in address element “%s” must not be empty"
msgstr "Transport name in address element “%s” must not be empty"
-#: gio/gdbusaddress.c:491
+#: gio/gdbusaddress.c:492
#, c-format
msgid ""
"Key/Value pair %d, “%s”, in address element “%s” does not contain an equal "
@@ -416,14 +417,14 @@ msgstr ""
"Key/Value pair %d, “%s”, in address element “%s” does not contain an equal "
"sign"
-#: gio/gdbusaddress.c:502
+#: gio/gdbusaddress.c:503
#, c-format
msgid ""
"Key/Value pair %d, “%s”, in address element “%s” must not have an empty key"
msgstr ""
"Key/Value pair %d, “%s”, in address element “%s” must not have an empty key"
-#: gio/gdbusaddress.c:516
+#: gio/gdbusaddress.c:517
#, c-format
msgid ""
"Error unescaping key or value in Key/Value pair %d, “%s”, in address element "
@@ -432,7 +433,7 @@ msgstr ""
"Error unescaping key or value in Key/Value pair %d, “%s”, in address element "
"“%s”"
-#: gio/gdbusaddress.c:588
+#: gio/gdbusaddress.c:589
#, c-format
msgid ""
"Error in address “%s” — the unix transport requires exactly one of the keys "
@@ -441,75 +442,75 @@ msgstr ""
"Error in address “%s” — the unix transport requires exactly one of the keys "
"“path” or “abstract” to be set"
-#: gio/gdbusaddress.c:624
+#: gio/gdbusaddress.c:625
#, c-format
msgid "Error in address “%s” — the host attribute is missing or malformed"
msgstr "Error in address “%s” — the host attribute is missing or malformed"
-#: gio/gdbusaddress.c:638
+#: gio/gdbusaddress.c:639
#, c-format
msgid "Error in address “%s” — the port attribute is missing or malformed"
msgstr "Error in address “%s” — the port attribute is missing or malformed"
-#: gio/gdbusaddress.c:652
+#: gio/gdbusaddress.c:653
#, c-format
msgid "Error in address “%s” — the noncefile attribute is missing or malformed"
msgstr ""
"Error in address “%s” — the noncefile attribute is missing or malformed"
-#: gio/gdbusaddress.c:673
+#: gio/gdbusaddress.c:674
msgid "Error auto-launching: "
msgstr "Error auto-launching: "
-#: gio/gdbusaddress.c:726
+#: gio/gdbusaddress.c:727
#, c-format
msgid "Error opening nonce file “%s”: %s"
msgstr "Error opening nonce file “%s”: %s"
-#: gio/gdbusaddress.c:745
+#: gio/gdbusaddress.c:746
#, c-format
msgid "Error reading from nonce file “%s”: %s"
msgstr "Error reading from nonce file “%s”: %s"
-#: gio/gdbusaddress.c:754
+#: gio/gdbusaddress.c:755
#, c-format
msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d"
msgstr "Error reading from nonce file “%s”, expected 16 bytes, got %d"
-#: gio/gdbusaddress.c:772
+#: gio/gdbusaddress.c:773
#, c-format
msgid "Error writing contents of nonce file “%s” to stream:"
msgstr "Error writing contents of nonce file “%s” to stream:"
-#: gio/gdbusaddress.c:981
+#: gio/gdbusaddress.c:988
msgid "The given address is empty"
msgstr "The given address is empty"
-#: gio/gdbusaddress.c:1094
+#: gio/gdbusaddress.c:1101
#, c-format
msgid "Cannot spawn a message bus when setuid"
msgstr "Cannot spawn a message bus when setuid"
-#: gio/gdbusaddress.c:1101
+#: gio/gdbusaddress.c:1108
msgid "Cannot spawn a message bus without a machine-id: "
msgstr "Cannot spawn a message bus without a machine-id: "
-#: gio/gdbusaddress.c:1108
+#: gio/gdbusaddress.c:1115
#, c-format
msgid "Cannot autolaunch D-Bus without X11 $DISPLAY"
msgstr "Cannot autolaunch D-Bus without X11 $DISPLAY"
-#: gio/gdbusaddress.c:1150
+#: gio/gdbusaddress.c:1157
#, c-format
msgid "Error spawning command line “%s”: "
msgstr "Error spawning command line “%s”: "
-#: gio/gdbusaddress.c:1219
+#: gio/gdbusaddress.c:1226
#, c-format
msgid "Cannot determine session bus address (not implemented for this OS)"
msgstr "Cannot determine session bus address (not implemented for this OS)"
-#: gio/gdbusaddress.c:1357 gio/gdbusconnection.c:7192
+#: gio/gdbusaddress.c:1397 gio/gdbusconnection.c:7241
#, c-format
msgid ""
"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable "
@@ -518,7 +519,7 @@ msgstr ""
"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable "
"— unknown value “%s”"
-#: gio/gdbusaddress.c:1366 gio/gdbusconnection.c:7201
+#: gio/gdbusaddress.c:1406 gio/gdbusconnection.c:7250
msgid ""
"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment "
"variable is not set"
@@ -526,7 +527,7 @@ msgstr ""
"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment "
"variable is not set"
-#: gio/gdbusaddress.c:1376
+#: gio/gdbusaddress.c:1416
#, c-format
msgid "Unknown bus type %d"
msgstr "Unknown bus type %d"
@@ -546,199 +547,213 @@ msgid ""
msgstr ""
"Exhausted all available authentication mechanisms (tried: %s) (available: %s)"
-#: gio/gdbusauth.c:1167
+#: gio/gdbusauth.c:1170
+msgid "User IDs must be the same for peer and server"
+msgstr "User IDs must be the same for peer and server"
+
+#: gio/gdbusauth.c:1182
msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer"
msgstr "Cancelled via GDBusAuthObserver::authorize-authenticated-peer"
-#: gio/gdbusauthmechanismsha1.c:265
+#: gio/gdbusauthmechanismsha1.c:298
#, c-format
msgid "Error when getting information for directory “%s”: %s"
msgstr "Error when getting information for directory “%s”: %s"
-#: gio/gdbusauthmechanismsha1.c:280
+#: gio/gdbusauthmechanismsha1.c:313
#, c-format
msgid ""
"Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o"
msgstr ""
"Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o"
-#: gio/gdbusauthmechanismsha1.c:310
+#: gio/gdbusauthmechanismsha1.c:346 gio/gdbusauthmechanismsha1.c:357
#, c-format
msgid "Error creating directory “%s”: %s"
msgstr "Error creating directory “%s”: %s"
-#: gio/gdbusauthmechanismsha1.c:355
+#: gio/gdbusauthmechanismsha1.c:359 gio/gfile.c:1062 gio/gfile.c:1300
+#: gio/gfile.c:1438 gio/gfile.c:1676 gio/gfile.c:1731 gio/gfile.c:1789
+#: gio/gfile.c:1873 gio/gfile.c:1930 gio/gfile.c:1994 gio/gfile.c:2049
+#: gio/gfile.c:3754 gio/gfile.c:3809 gio/gfile.c:4102 gio/gfile.c:4572
+#: gio/gfile.c:4983 gio/gfile.c:5068 gio/gfile.c:5158 gio/gfile.c:5255
+#: gio/gfile.c:5342 gio/gfile.c:5443 gio/gfile.c:8153 gio/gfile.c:8243
+#: gio/gfile.c:8327 gio/win32/gwinhttpfile.c:453
+msgid "Operation not supported"
+msgstr "Operation not supported"
+
+#: gio/gdbusauthmechanismsha1.c:402
#, c-format
msgid "Error opening keyring “%s” for reading: "
msgstr "Error opening keyring “%s” for reading: "
-#: gio/gdbusauthmechanismsha1.c:378 gio/gdbusauthmechanismsha1.c:700
+#: gio/gdbusauthmechanismsha1.c:425 gio/gdbusauthmechanismsha1.c:747
#, c-format
msgid "Line %d of the keyring at “%s” with content “%s” is malformed"
msgstr "Line %d of the keyring at “%s” with content “%s” is malformed"
-#: gio/gdbusauthmechanismsha1.c:392 gio/gdbusauthmechanismsha1.c:714
+#: gio/gdbusauthmechanismsha1.c:439 gio/gdbusauthmechanismsha1.c:761
#, c-format
msgid ""
"First token of line %d of the keyring at “%s” with content “%s” is malformed"
msgstr ""
"First token of line %d of the keyring at “%s” with content “%s” is malformed"
-#: gio/gdbusauthmechanismsha1.c:406 gio/gdbusauthmechanismsha1.c:728
+#: gio/gdbusauthmechanismsha1.c:453 gio/gdbusauthmechanismsha1.c:775
#, c-format
msgid ""
"Second token of line %d of the keyring at “%s” with content “%s” is malformed"
msgstr ""
"Second token of line %d of the keyring at “%s” with content “%s” is malformed"
-#: gio/gdbusauthmechanismsha1.c:430
+#: gio/gdbusauthmechanismsha1.c:477
#, c-format
msgid "Didn’t find cookie with id %d in the keyring at “%s”"
msgstr "Didn’t find cookie with id %d in the keyring at “%s”"
-#: gio/gdbusauthmechanismsha1.c:476
+#: gio/gdbusauthmechanismsha1.c:523
#, c-format
msgid "Error creating lock file “%s”: %s"
msgstr "Error creating lock file “%s”: %s"
-#: gio/gdbusauthmechanismsha1.c:540
+#: gio/gdbusauthmechanismsha1.c:587
#, c-format
msgid "Error deleting stale lock file “%s”: %s"
msgstr "Error deleting stale lock file “%s”: %s"
-#: gio/gdbusauthmechanismsha1.c:579
+#: gio/gdbusauthmechanismsha1.c:626
#, c-format
msgid "Error closing (unlinked) lock file “%s”: %s"
msgstr "Error closing (unlinked) lock file “%s”: %s"
-#: gio/gdbusauthmechanismsha1.c:590
+#: gio/gdbusauthmechanismsha1.c:637
#, c-format
msgid "Error unlinking lock file “%s”: %s"
msgstr "Error unlinking lock file “%s”: %s"
-#: gio/gdbusauthmechanismsha1.c:667
+#: gio/gdbusauthmechanismsha1.c:714
#, c-format
msgid "Error opening keyring “%s” for writing: "
msgstr "Error opening keyring “%s” for writing: "
-#: gio/gdbusauthmechanismsha1.c:865
+#: gio/gdbusauthmechanismsha1.c:908
#, c-format
msgid "(Additionally, releasing the lock for “%s” also failed: %s) "
msgstr "(Additionally, releasing the lock for “%s” also failed: %s) "
-#: gio/gdbusconnection.c:595 gio/gdbusconnection.c:2391
+#: gio/gdbusconnection.c:603 gio/gdbusconnection.c:2405
msgid "The connection is closed"
msgstr "The connection is closed"
-#: gio/gdbusconnection.c:1892
+#: gio/gdbusconnection.c:1902
msgid "Timeout was reached"
msgstr "Timeout was reached"
-#: gio/gdbusconnection.c:2513
+#: gio/gdbusconnection.c:2528
msgid ""
"Unsupported flags encountered when constructing a client-side connection"
msgstr ""
"Unsupported flags encountered when constructing a client-side connection"
-#: gio/gdbusconnection.c:4163 gio/gdbusconnection.c:4510
+#: gio/gdbusconnection.c:4186 gio/gdbusconnection.c:4533
#, c-format
msgid ""
"No such interface “org.freedesktop.DBus.Properties” on object at path %s"
msgstr ""
"No such interface “org.freedesktop.DBus.Properties” on object at path %s"
-#: gio/gdbusconnection.c:4305
+#: gio/gdbusconnection.c:4328
#, c-format
msgid "No such property “%s”"
msgstr "No such property “%s”"
-#: gio/gdbusconnection.c:4317
+#: gio/gdbusconnection.c:4340
#, c-format
msgid "Property “%s” is not readable"
msgstr "Property “%s” is not readable"
-#: gio/gdbusconnection.c:4328
+#: gio/gdbusconnection.c:4351
#, c-format
msgid "Property “%s” is not writable"
msgstr "Property “%s” is not writable"
-#: gio/gdbusconnection.c:4348
+#: gio/gdbusconnection.c:4371
#, c-format
msgid "Error setting property “%s”: Expected type “%s” but got “%s”"
msgstr "Error setting property “%s”: Expected type “%s” but got “%s”"
-#: gio/gdbusconnection.c:4453 gio/gdbusconnection.c:4661
-#: gio/gdbusconnection.c:6632
+#: gio/gdbusconnection.c:4476 gio/gdbusconnection.c:4684
+#: gio/gdbusconnection.c:6681
#, c-format
msgid "No such interface “%s”"
msgstr "No such interface “%s”"
-#: gio/gdbusconnection.c:4879 gio/gdbusconnection.c:7141
+#: gio/gdbusconnection.c:4902 gio/gdbusconnection.c:7190
#, c-format
msgid "No such interface “%s” on object at path %s"
msgstr "No such interface “%s” on object at path %s"
-#: gio/gdbusconnection.c:4977
+#: gio/gdbusconnection.c:5000
#, c-format
msgid "No such method “%s”"
msgstr "No such method “%s”"
-#: gio/gdbusconnection.c:5008
+#: gio/gdbusconnection.c:5031
#, c-format
msgid "Type of message, “%s”, does not match expected type “%s”"
msgstr "Type of message, “%s”, does not match expected type “%s”"
-#: gio/gdbusconnection.c:5206
+#: gio/gdbusconnection.c:5229
#, c-format
msgid "An object is already exported for the interface %s at %s"
msgstr "An object is already exported for the interface %s at %s"
-#: gio/gdbusconnection.c:5432
+#: gio/gdbusconnection.c:5455
#, c-format
msgid "Unable to retrieve property %s.%s"
msgstr "Unable to retrieve property %s.%s"
-#: gio/gdbusconnection.c:5488
+#: gio/gdbusconnection.c:5511
#, c-format
msgid "Unable to set property %s.%s"
msgstr "Unable to set property %s.%s"
-#: gio/gdbusconnection.c:5666
+#: gio/gdbusconnection.c:5690
#, c-format
msgid "Method “%s” returned type “%s”, but expected “%s”"
msgstr "Method “%s” returned type “%s”, but expected “%s”"
-#: gio/gdbusconnection.c:6743
+#: gio/gdbusconnection.c:6792
#, c-format
msgid "Method “%s” on interface “%s” with signature “%s” does not exist"
msgstr "Method “%s” on interface “%s” with signature “%s” does not exist"
-#: gio/gdbusconnection.c:6864
+#: gio/gdbusconnection.c:6913
#, c-format
msgid "A subtree is already exported for %s"
msgstr "A subtree is already exported for %s"
-#: gio/gdbusmessage.c:1255
+#: gio/gdbusmessage.c:1266
msgid "type is INVALID"
msgstr "type is INVALID"
-#: gio/gdbusmessage.c:1266
+#: gio/gdbusmessage.c:1277
msgid "METHOD_CALL message: PATH or MEMBER header field is missing"
msgstr "METHOD_CALL message: PATH or MEMBER header field is missing"
-#: gio/gdbusmessage.c:1277
+#: gio/gdbusmessage.c:1288
msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing"
msgstr "METHOD_RETURN message: REPLY_SERIAL header field is missing"
-#: gio/gdbusmessage.c:1289
+#: gio/gdbusmessage.c:1300
msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing"
msgstr "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing"
-#: gio/gdbusmessage.c:1302
+#: gio/gdbusmessage.c:1313
msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing"
msgstr "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing"
-#: gio/gdbusmessage.c:1310
+#: gio/gdbusmessage.c:1321
msgid ""
"SIGNAL message: The PATH header field is using the reserved value /org/"
"freedesktop/DBus/Local"
@@ -746,7 +761,7 @@ msgstr ""
"SIGNAL message: The PATH header field is using the reserved value /org/"
"freedesktop/DBus/Local"
-#: gio/gdbusmessage.c:1318
+#: gio/gdbusmessage.c:1329
msgid ""
"SIGNAL message: The INTERFACE header field is using the reserved value org."
"freedesktop.DBus.Local"
@@ -754,19 +769,21 @@ msgstr ""
"SIGNAL message: The INTERFACE header field is using the reserved value org."
"freedesktop.DBus.Local"
-#: gio/gdbusmessage.c:1366 gio/gdbusmessage.c:1426
+#: gio/gdbusmessage.c:1377 gio/gdbusmessage.c:1437
#, c-format
msgid "Wanted to read %lu byte but only got %lu"
msgid_plural "Wanted to read %lu bytes but only got %lu"
-msgstr[0] "Wanted to read %lu byte but only got %lu"
-msgstr[1] "Wanted to read %lu bytes but only got %lu"
+msgstr[0] "‫Wanted to read %lu byte but only got %lu"
+msgstr[1] "‫Wanted to read %lu bytes but only got %lu"
+msgstr[2] "‫Wanted to read %lu bytes but only got %lu"
+msgstr[3] "‫Wanted to read %lu bytes but only got %lu"
-#: gio/gdbusmessage.c:1380
+#: gio/gdbusmessage.c:1391
#, c-format
msgid "Expected NUL byte after the string “%s” but found byte %d"
msgstr "Expected NUL byte after the string “%s” but found byte %d"
-#: gio/gdbusmessage.c:1399
+#: gio/gdbusmessage.c:1410
#, c-format
msgid ""
"Expected valid UTF-8 string but found invalid bytes at byte offset %d "
@@ -775,21 +792,21 @@ msgstr ""
"Expected valid UTF-8 string but found invalid bytes at byte offset %d "
"(length of string is %d). The valid UTF-8 string up until that point was “%s”"
-#: gio/gdbusmessage.c:1463 gio/gdbusmessage.c:1711 gio/gdbusmessage.c:1900
+#: gio/gdbusmessage.c:1474 gio/gdbusmessage.c:1722 gio/gdbusmessage.c:1911
msgid "Value nested too deeply"
msgstr "Value nested too deeply"
-#: gio/gdbusmessage.c:1609
+#: gio/gdbusmessage.c:1620
#, c-format
msgid "Parsed value “%s” is not a valid D-Bus object path"
msgstr "Parsed value “%s” is not a valid D-Bus object path"
-#: gio/gdbusmessage.c:1631
+#: gio/gdbusmessage.c:1642
#, c-format
msgid "Parsed value “%s” is not a valid D-Bus signature"
msgstr "Parsed value “%s” is not a valid D-Bus signature"
-#: gio/gdbusmessage.c:1678
+#: gio/gdbusmessage.c:1689
#, c-format
msgid ""
"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)."
@@ -799,8 +816,12 @@ msgstr[0] ""
"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)."
msgstr[1] ""
"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)."
+msgstr[2] ""
+"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)."
+msgstr[3] ""
+"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)."
-#: gio/gdbusmessage.c:1698
+#: gio/gdbusmessage.c:1709
#, c-format
msgid ""
"Encountered array of type “a%c”, expected to have a length a multiple of %u "
@@ -809,19 +830,19 @@ msgstr ""
"Encountered array of type “a%c”, expected to have a length a multiple of %u "
"bytes, but found to be %u bytes in length"
-#: gio/gdbusmessage.c:1884
+#: gio/gdbusmessage.c:1895
#, c-format
msgid "Parsed value “%s” for variant is not a valid D-Bus signature"
msgstr "Parsed value “%s” for variant is not a valid D-Bus signature"
-#: gio/gdbusmessage.c:1925
+#: gio/gdbusmessage.c:1936
#, c-format
msgid ""
"Error deserializing GVariant with type string “%s” from the D-Bus wire format"
msgstr ""
"Error deserializing GVariant with type string “%s” from the D-Bus wire format"
-#: gio/gdbusmessage.c:2110
+#: gio/gdbusmessage.c:2121
#, c-format
msgid ""
"Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value "
@@ -830,60 +851,62 @@ msgstr ""
"Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value "
"0x%02x"
-#: gio/gdbusmessage.c:2123
+#: gio/gdbusmessage.c:2134
#, c-format
msgid "Invalid major protocol version. Expected 1 but found %d"
msgstr "Invalid major protocol version. Expected 1 but found %d"
-#: gio/gdbusmessage.c:2177 gio/gdbusmessage.c:2773
+#: gio/gdbusmessage.c:2188 gio/gdbusmessage.c:2784
msgid "Signature header found but is not of type signature"
msgstr "Signature header found but is not of type signature"
-#: gio/gdbusmessage.c:2189
+#: gio/gdbusmessage.c:2200
#, c-format
msgid "Signature header with signature “%s” found but message body is empty"
msgstr "Signature header with signature “%s” found but message body is empty"
-#: gio/gdbusmessage.c:2204
+#: gio/gdbusmessage.c:2215
#, c-format
msgid "Parsed value “%s” is not a valid D-Bus signature (for body)"
msgstr "Parsed value “%s” is not a valid D-Bus signature (for body)"
-#: gio/gdbusmessage.c:2236
+#: gio/gdbusmessage.c:2247
#, c-format
msgid "No signature header in message but the message body is %u byte"
msgid_plural "No signature header in message but the message body is %u bytes"
-msgstr[0] "No signature header in message but the message body is %u byte"
-msgstr[1] "No signature header in message but the message body is %u bytes"
+msgstr[0] "‫No signature header in message but the message body is %u byte"
+msgstr[1] "‫No signature header in message but the message body is %u bytes"
+msgstr[2] "‫No signature header in message but the message body is %u byte"
+msgstr[3] "‫No signature header in message but the message body is %u byte"
-#: gio/gdbusmessage.c:2246
+#: gio/gdbusmessage.c:2257
msgid "Cannot deserialize message: "
msgstr "Cannot deserialize message: "
-#: gio/gdbusmessage.c:2590
+#: gio/gdbusmessage.c:2601
#, c-format
msgid ""
"Error serializing GVariant with type string “%s” to the D-Bus wire format"
msgstr ""
"Error serializing GVariant with type string “%s” to the D-Bus wire format"
-#: gio/gdbusmessage.c:2727
+#: gio/gdbusmessage.c:2738
#, c-format
msgid ""
"Number of file descriptors in message (%d) differs from header field (%d)"
msgstr ""
"Number of file descriptors in message (%d) differs from header field (%d)"
-#: gio/gdbusmessage.c:2735
+#: gio/gdbusmessage.c:2746
msgid "Cannot serialize message: "
msgstr "Cannot serialize message: "
-#: gio/gdbusmessage.c:2788
+#: gio/gdbusmessage.c:2799
#, c-format
msgid "Message body has signature “%s” but there is no signature header"
msgstr "Message body has signature “%s” but there is no signature header"
-#: gio/gdbusmessage.c:2798
+#: gio/gdbusmessage.c:2809
#, c-format
msgid ""
"Message body has type signature “%s” but signature in the header field is "
@@ -892,38 +915,41 @@ msgstr ""
"Message body has type signature “%s” but signature in the header field is "
"“%s”"
-#: gio/gdbusmessage.c:2814
+#: gio/gdbusmessage.c:2825
#, c-format
msgid "Message body is empty but signature in the header field is “(%s)”"
msgstr "Message body is empty but signature in the header field is “(%s)”"
-#: gio/gdbusmessage.c:3367
+#: gio/gdbusmessage.c:3378
#, c-format
msgid "Error return with body of type “%s”"
msgstr "Error return with body of type “%s”"
-#: gio/gdbusmessage.c:3375
+#: gio/gdbusmessage.c:3386
msgid "Error return with empty body"
msgstr "Error return with empty body"
-#: gio/gdbusprivate.c:2244
+#: gio/gdbusprivate.c:2246
#, c-format
msgid "(Type any character to close this window)\n"
msgstr "(Type any character to close this window)\n"
-#: gio/gdbusprivate.c:2418
+#: gio/gdbusprivate.c:2420
#, c-format
msgid "Session dbus not running, and autolaunch failed"
msgstr "Session dbus not running, and autolaunch failed"
-#: gio/gdbusprivate.c:2441
+#: gio/gdbusprivate.c:2443
#, c-format
msgid "Unable to get Hardware profile: %s"
msgstr "Unable to get Hardware profile: %s"
-#: gio/gdbusprivate.c:2486
-msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: "
-msgstr "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: "
+#. Translators: Both placeholders are file paths
+#: gio/gdbusprivate.c:2494
+#, c-format
+#| msgid "Unable to trash file %s: %s"
+msgid "Unable to load %s or %s: "
+msgstr "Unable to load %s or %s: "
#: gio/gdbusproxy.c:1562
#, c-format
@@ -944,30 +970,30 @@ msgstr ""
"Cannot invoke method; proxy is for the well-known name %s without an owner, "
"and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag"
-#: gio/gdbusserver.c:755
+#: gio/gdbusserver.c:763
msgid "Abstract namespace not supported"
msgstr "Abstract namespace not supported"
-#: gio/gdbusserver.c:848
+#: gio/gdbusserver.c:856
msgid "Cannot specify nonce file when creating a server"
msgstr "Cannot specify nonce file when creating a server"
-#: gio/gdbusserver.c:930
+#: gio/gdbusserver.c:938
#, c-format
msgid "Error writing nonce file at “%s”: %s"
msgstr "Error writing nonce file at “%s”: %s"
-#: gio/gdbusserver.c:1103
+#: gio/gdbusserver.c:1113
#, c-format
msgid "The string “%s” is not a valid D-Bus GUID"
msgstr "The string “%s” is not a valid D-Bus GUID"
-#: gio/gdbusserver.c:1143
+#: gio/gdbusserver.c:1153
#, c-format
msgid "Cannot listen on unsupported transport “%s”"
msgstr "Cannot listen on unsupported transport “%s”"
-#: gio/gdbus-tool.c:107
+#: gio/gdbus-tool.c:111
#, c-format
msgid ""
"Commands:\n"
@@ -990,61 +1016,67 @@ msgstr ""
"\n"
"Use “%s COMMAND --help” to get help on each command.\n"
-#: gio/gdbus-tool.c:197 gio/gdbus-tool.c:264 gio/gdbus-tool.c:336
-#: gio/gdbus-tool.c:360 gio/gdbus-tool.c:850 gio/gdbus-tool.c:1187
-#: gio/gdbus-tool.c:1672
+#: gio/gdbus-tool.c:201 gio/gdbus-tool.c:273 gio/gdbus-tool.c:345
+#: gio/gdbus-tool.c:369 gio/gdbus-tool.c:859 gio/gdbus-tool.c:1236
+#: gio/gdbus-tool.c:1724
#, c-format
msgid "Error: %s\n"
msgstr "Error: %s\n"
-#: gio/gdbus-tool.c:208 gio/gdbus-tool.c:277 gio/gdbus-tool.c:1688
+#: gio/gdbus-tool.c:212 gio/gdbus-tool.c:286 gio/gdbus-tool.c:1740
#, c-format
msgid "Error parsing introspection XML: %s\n"
msgstr "Error parsing introspection XML: %s\n"
-#: gio/gdbus-tool.c:246
+#: gio/gdbus-tool.c:250
#, c-format
msgid "Error: %s is not a valid name\n"
msgstr "Error: %s is not a valid name\n"
-#: gio/gdbus-tool.c:394
+#: gio/gdbus-tool.c:255 gio/gdbus-tool.c:745 gio/gdbus-tool.c:1060
+#: gio/gdbus-tool.c:1890 gio/gdbus-tool.c:2130
+#, c-format
+msgid "Error: %s is not a valid object path\n"
+msgstr "Error: %s is not a valid object path\n"
+
+#: gio/gdbus-tool.c:403
msgid "Connect to the system bus"
msgstr "Connect to the system bus"
-#: gio/gdbus-tool.c:395
+#: gio/gdbus-tool.c:404
msgid "Connect to the session bus"
msgstr "Connect to the session bus"
-#: gio/gdbus-tool.c:396
+#: gio/gdbus-tool.c:405
msgid "Connect to given D-Bus address"
msgstr "Connect to given D-Bus address"
-#: gio/gdbus-tool.c:406
+#: gio/gdbus-tool.c:415
msgid "Connection Endpoint Options:"
msgstr "Connection Endpoint Options:"
-#: gio/gdbus-tool.c:407
+#: gio/gdbus-tool.c:416
msgid "Options specifying the connection endpoint"
msgstr "Options specifying the connection endpoint"
-#: gio/gdbus-tool.c:430
+#: gio/gdbus-tool.c:439
#, c-format
msgid "No connection endpoint specified"
msgstr "No connection endpoint specified"
-#: gio/gdbus-tool.c:440
+#: gio/gdbus-tool.c:449
#, c-format
msgid "Multiple connection endpoints specified"
msgstr "Multiple connection endpoints specified"
-#: gio/gdbus-tool.c:513
+#: gio/gdbus-tool.c:522
#, c-format
msgid ""
"Warning: According to introspection data, interface “%s” does not exist\n"
msgstr ""
"Warning: According to introspection data, interface “%s” does not exist\n"
-#: gio/gdbus-tool.c:522
+#: gio/gdbus-tool.c:531
#, c-format
msgid ""
"Warning: According to introspection data, method “%s” does not exist on "
@@ -1053,161 +1085,161 @@ msgstr ""
"Warning: According to introspection data, method “%s” does not exist on "
"interface “%s”\n"
-#: gio/gdbus-tool.c:584
+#: gio/gdbus-tool.c:593
msgid "Optional destination for signal (unique name)"
msgstr "Optional destination for signal (unique name)"
-#: gio/gdbus-tool.c:585
+#: gio/gdbus-tool.c:594
msgid "Object path to emit signal on"
msgstr "Object path to emit signal on"
-#: gio/gdbus-tool.c:586
+#: gio/gdbus-tool.c:595
msgid "Signal and interface name"
msgstr "Signal and interface name"
-#: gio/gdbus-tool.c:619
+#: gio/gdbus-tool.c:628
msgid "Emit a signal."
msgstr "Emit a signal."
-#: gio/gdbus-tool.c:674 gio/gdbus-tool.c:981 gio/gdbus-tool.c:1775
-#: gio/gdbus-tool.c:2007 gio/gdbus-tool.c:2227
+#: gio/gdbus-tool.c:683 gio/gdbus-tool.c:997 gio/gdbus-tool.c:1827
+#: gio/gdbus-tool.c:2059 gio/gdbus-tool.c:2279
#, c-format
msgid "Error connecting: %s\n"
msgstr "Error connecting: %s\n"
-#: gio/gdbus-tool.c:694
+#: gio/gdbus-tool.c:703
#, c-format
msgid "Error: %s is not a valid unique bus name.\n"
msgstr "Error: %s is not a valid unique bus name.\n"
-#: gio/gdbus-tool.c:713 gio/gdbus-tool.c:1024 gio/gdbus-tool.c:1818
+#: gio/gdbus-tool.c:722 gio/gdbus-tool.c:1040 gio/gdbus-tool.c:1870
msgid "Error: Object path is not specified\n"
msgstr "Error: Object path is not specified\n"
-#: gio/gdbus-tool.c:736 gio/gdbus-tool.c:1044 gio/gdbus-tool.c:1838
-#: gio/gdbus-tool.c:2078
-#, c-format
-msgid "Error: %s is not a valid object path\n"
-msgstr "Error: %s is not a valid object path\n"
-
-#: gio/gdbus-tool.c:756
+#: gio/gdbus-tool.c:765
msgid "Error: Signal name is not specified\n"
msgstr "Error: Signal name is not specified\n"
-#: gio/gdbus-tool.c:770
+#: gio/gdbus-tool.c:779
#, c-format
msgid "Error: Signal name “%s” is invalid\n"
msgstr "Error: Signal name “%s” is invalid\n"
-#: gio/gdbus-tool.c:782
+#: gio/gdbus-tool.c:791
#, c-format
msgid "Error: %s is not a valid interface name\n"
msgstr "Error: %s is not a valid interface name\n"
-#: gio/gdbus-tool.c:788
+#: gio/gdbus-tool.c:797
#, c-format
msgid "Error: %s is not a valid member name\n"
msgstr "Error: %s is not a valid member name\n"
#. Use the original non-"parse-me-harder" error
-#: gio/gdbus-tool.c:825 gio/gdbus-tool.c:1156
+#: gio/gdbus-tool.c:834 gio/gdbus-tool.c:1172
#, c-format
msgid "Error parsing parameter %d: %s\n"
msgstr "Error parsing parameter %d: %s\n"
-#: gio/gdbus-tool.c:857
+#: gio/gdbus-tool.c:866
#, c-format
msgid "Error flushing connection: %s\n"
msgstr "Error flushing connection: %s\n"
-#: gio/gdbus-tool.c:884
+#: gio/gdbus-tool.c:893
msgid "Destination name to invoke method on"
msgstr "Destination name to invoke method on"
-#: gio/gdbus-tool.c:885
+#: gio/gdbus-tool.c:894
msgid "Object path to invoke method on"
msgstr "Object path to invoke method on"
-#: gio/gdbus-tool.c:886
+#: gio/gdbus-tool.c:895
msgid "Method and interface name"
msgstr "Method and interface name"
-#: gio/gdbus-tool.c:887
+#: gio/gdbus-tool.c:896
msgid "Timeout in seconds"
msgstr "Timeout in seconds"
-#: gio/gdbus-tool.c:926
+#: gio/gdbus-tool.c:942
msgid "Invoke a method on a remote object."
msgstr "Invoke a method on a remote object."
-#: gio/gdbus-tool.c:998 gio/gdbus-tool.c:1792 gio/gdbus-tool.c:2032
+#: gio/gdbus-tool.c:1014 gio/gdbus-tool.c:1844 gio/gdbus-tool.c:2084
msgid "Error: Destination is not specified\n"
msgstr "Error: Destination is not specified\n"
-#: gio/gdbus-tool.c:1009 gio/gdbus-tool.c:1809 gio/gdbus-tool.c:2043
+#: gio/gdbus-tool.c:1025 gio/gdbus-tool.c:1861 gio/gdbus-tool.c:2095
#, c-format
msgid "Error: %s is not a valid bus name\n"
msgstr "Error: %s is not a valid bus name\n"
-#: gio/gdbus-tool.c:1059
+#: gio/gdbus-tool.c:1075
msgid "Error: Method name is not specified\n"
msgstr "Error: Method name is not specified\n"
-#: gio/gdbus-tool.c:1070
+#: gio/gdbus-tool.c:1086
#, c-format
msgid "Error: Method name “%s” is invalid\n"
msgstr "Error: Method name “%s” is invalid\n"
-#: gio/gdbus-tool.c:1148
+#: gio/gdbus-tool.c:1164
#, c-format
msgid "Error parsing parameter %d of type “%s”: %s\n"
msgstr "Error parsing parameter %d of type “%s”: %s\n"
-#: gio/gdbus-tool.c:1634
+#: gio/gdbus-tool.c:1190
+#, c-format
+#| msgid "Error reading from handle: %s"
+msgid "Error adding handle %d: %s\n"
+msgstr "Error adding handle %d: %s\n"
+
+#: gio/gdbus-tool.c:1686
msgid "Destination name to introspect"
msgstr "Destination name to introspect"
-#: gio/gdbus-tool.c:1635
+#: gio/gdbus-tool.c:1687
msgid "Object path to introspect"
msgstr "Object path to introspect"
-#: gio/gdbus-tool.c:1636
+#: gio/gdbus-tool.c:1688
msgid "Print XML"
msgstr "Print XML"
-#: gio/gdbus-tool.c:1637
+#: gio/gdbus-tool.c:1689
msgid "Introspect children"
msgstr "Introspect children"
-#: gio/gdbus-tool.c:1638
+#: gio/gdbus-tool.c:1690
msgid "Only print properties"
msgstr "Only print properties"
-#: gio/gdbus-tool.c:1727
+#: gio/gdbus-tool.c:1779
msgid "Introspect a remote object."
msgstr "Introspect a remote object."
-#: gio/gdbus-tool.c:1933
+#: gio/gdbus-tool.c:1985
msgid "Destination name to monitor"
msgstr "Destination name to monitor"
-#: gio/gdbus-tool.c:1934
+#: gio/gdbus-tool.c:1986
msgid "Object path to monitor"
msgstr "Object path to monitor"
-#: gio/gdbus-tool.c:1959
+#: gio/gdbus-tool.c:2011
msgid "Monitor a remote object."
-msgstr "corrupted object"
+msgstr "Monitor a remote object."
-#: gio/gdbus-tool.c:2017
+#: gio/gdbus-tool.c:2069
msgid "Error: can’t monitor a non-message-bus connection\n"
msgstr "Error: can’t monitor a non-message-bus connection\n"
-#: gio/gdbus-tool.c:2141
+#: gio/gdbus-tool.c:2193
msgid "Service to activate before waiting for the other one (well-known name)"
msgstr "Service to activate before waiting for the other one (well-known name)"
-#: gio/gdbus-tool.c:2144
+#: gio/gdbus-tool.c:2196
msgid ""
"Timeout to wait for before exiting with an error (seconds); 0 for no timeout "
"(default)"
@@ -1215,63 +1247,63 @@ msgstr ""
"Timeout to wait for before exiting with an error (seconds); 0 for no timeout "
"(default)"
-#: gio/gdbus-tool.c:2192
+#: gio/gdbus-tool.c:2244
msgid "[OPTION…] BUS-NAME"
msgstr "[OPTION…] BUS-NAME"
-#: gio/gdbus-tool.c:2193
+#: gio/gdbus-tool.c:2245
msgid "Wait for a bus name to appear."
msgstr "Wait for a bus name to appear."
-#: gio/gdbus-tool.c:2269
+#: gio/gdbus-tool.c:2321
msgid "Error: A service to activate for must be specified.\n"
msgstr "Error: A service to activate for must be specified.\n"
-#: gio/gdbus-tool.c:2274
+#: gio/gdbus-tool.c:2326
msgid "Error: A service to wait for must be specified.\n"
msgstr "Error: A service to wait for must be specified.\n"
-#: gio/gdbus-tool.c:2279
+#: gio/gdbus-tool.c:2331
msgid "Error: Too many arguments.\n"
msgstr "Error: Too many arguments.\n"
-#: gio/gdbus-tool.c:2287 gio/gdbus-tool.c:2294
+#: gio/gdbus-tool.c:2339 gio/gdbus-tool.c:2346
#, c-format
msgid "Error: %s is not a valid well-known bus name.\n"
msgstr "Error: %s is not a valid well-known bus name.\n"
-#: gio/gdesktopappinfo.c:2073 gio/gdesktopappinfo.c:4893
+#: gio/gdesktopappinfo.c:2106 gio/gdesktopappinfo.c:4932
msgid "Unnamed"
msgstr "Unnamed"
-#: gio/gdesktopappinfo.c:2483
+#: gio/gdesktopappinfo.c:2516
msgid "Desktop file didn’t specify Exec field"
msgstr "Desktop file didn’t specify Exec field"
-#: gio/gdesktopappinfo.c:2763
+#: gio/gdesktopappinfo.c:2801
msgid "Unable to find terminal required for application"
msgstr "Unable to find terminal required for application"
-#: gio/gdesktopappinfo.c:3414
+#: gio/gdesktopappinfo.c:3452
#, c-format
msgid "Can’t create user application configuration folder %s: %s"
msgstr "Can’t create user application configuration folder %s: %s"
-#: gio/gdesktopappinfo.c:3418
+#: gio/gdesktopappinfo.c:3456
#, c-format
msgid "Can’t create user MIME configuration folder %s: %s"
msgstr "Can’t create user MIME configuration folder %s: %s"
-#: gio/gdesktopappinfo.c:3660 gio/gdesktopappinfo.c:3684
+#: gio/gdesktopappinfo.c:3698 gio/gdesktopappinfo.c:3722
msgid "Application information lacks an identifier"
msgstr "Application information lacks an identifier"
-#: gio/gdesktopappinfo.c:3920
+#: gio/gdesktopappinfo.c:3958
#, c-format
msgid "Can’t create user desktop file %s"
msgstr "Can’t create user desktop file %s"
-#: gio/gdesktopappinfo.c:4056
+#: gio/gdesktopappinfo.c:4094
#, c-format
msgid "Custom definition for %s"
msgstr "Custom definition for %s"
@@ -1336,87 +1368,77 @@ msgstr "Malformed number of tokens (%d) in GEmblemedIcon encoding"
msgid "Expected a GEmblem for GEmblemedIcon"
msgstr "Expected a GEmblem for GEmblemedIcon"
-#: gio/gfile.c:1044 gio/gfile.c:1282 gio/gfile.c:1420 gio/gfile.c:1658
-#: gio/gfile.c:1713 gio/gfile.c:1771 gio/gfile.c:1855 gio/gfile.c:1912
-#: gio/gfile.c:1976 gio/gfile.c:2031 gio/gfile.c:3722 gio/gfile.c:3777
-#: gio/gfile.c:4070 gio/gfile.c:4540 gio/gfile.c:4951 gio/gfile.c:5036
-#: gio/gfile.c:5126 gio/gfile.c:5223 gio/gfile.c:5310 gio/gfile.c:5411
-#: gio/gfile.c:8121 gio/gfile.c:8211 gio/gfile.c:8295
-#: gio/win32/gwinhttpfile.c:437
-msgid "Operation not supported"
-msgstr "Operation not supported"
-
#. Translators: This is an error message when
#. * trying to find the enclosing (user visible)
#. * mount of a file, but none exists.
#.
-#: gio/gfile.c:1543
+#: gio/gfile.c:1561
msgid "Containing mount does not exist"
msgstr "Containing mount does not exist"
-#: gio/gfile.c:2590 gio/glocalfile.c:2430
+#: gio/gfile.c:2608 gio/glocalfile.c:2472
msgid "Can’t copy over directory"
msgstr "Can’t copy over directory"
-#: gio/gfile.c:2650
+#: gio/gfile.c:2668
msgid "Can’t copy directory over directory"
msgstr "Can’t copy directory over directory"
-#: gio/gfile.c:2658
+#: gio/gfile.c:2676
msgid "Target file exists"
msgstr "Target file exists"
-#: gio/gfile.c:2677
+#: gio/gfile.c:2695
msgid "Can’t recursively copy directory"
msgstr "Can’t recursively copy directory"
-#: gio/gfile.c:2952
+#: gio/gfile.c:2996
msgid "Splice not supported"
msgstr "Symbolic links not supported"
-#: gio/gfile.c:2956 gio/gfile.c:3001
+#: gio/gfile.c:3000
#, c-format
msgid "Error splicing file: %s"
msgstr "Error opening file: %s"
-#: gio/gfile.c:3117
+#: gio/gfile.c:3152
msgid "Copy (reflink/clone) between mounts is not supported"
msgstr "Copy (reflink/clone) between mounts is not supported"
-#: gio/gfile.c:3121
+#: gio/gfile.c:3156
msgid "Copy (reflink/clone) is not supported or invalid"
msgstr "Copy (reflink/clone) is not supported or invalid"
-#: gio/gfile.c:3126
+#: gio/gfile.c:3161
msgid "Copy (reflink/clone) is not supported or didn’t work"
msgstr "Copy (reflink/clone) is not supported or didn’t work"
-#: gio/gfile.c:3190
+#: gio/gfile.c:3226
msgid "Can’t copy special file"
msgstr "Can’t copy special file"
-#: gio/gfile.c:4003
+#: gio/gfile.c:4035
msgid "Invalid symlink value given"
msgstr "Invalid symlink value given"
-#: gio/gfile.c:4013 glib/gfileutils.c:2349
+#: gio/gfile.c:4045 glib/gfileutils.c:2354
msgid "Symbolic links not supported"
msgstr "Symbolic links not supported"
-#: gio/gfile.c:4181
+#: gio/gfile.c:4213
msgid "Trash not supported"
msgstr "Trash not supported"
-#: gio/gfile.c:4293
+#: gio/gfile.c:4325
#, c-format
msgid "File names cannot contain “%c”"
msgstr "File names cannot contain “%c”"
-#: gio/gfile.c:6774 gio/gvolume.c:364
+#: gio/gfile.c:6806 gio/gvolume.c:364
msgid "volume doesn’t implement mount"
msgstr "volume doesn’t implement mount"
-#: gio/gfile.c:6888 gio/gfile.c:6936
+#: gio/gfile.c:6920 gio/gfile.c:6968
msgid "No application is registered as handling this file"
msgstr "No application is registered as handling this file"
@@ -1433,12 +1455,12 @@ msgstr "File enumerator has outstanding operation"
msgid "File enumerator is already closed"
msgstr "File enumerator is already closed"
-#: gio/gfileicon.c:236
+#: gio/gfileicon.c:250
#, c-format
msgid "Can’t handle version %d of GFileIcon encoding"
msgstr "Can’t handle version %d of GFileIcon encoding"
-#: gio/gfileicon.c:246
+#: gio/gfileicon.c:260
msgid "Malformed input data for GFileIcon"
msgstr "Malformed input data for GFileIcon"
@@ -1487,7 +1509,12 @@ msgstr "HTTP proxy authentication required"
msgid "HTTP proxy connection failed: %i"
msgstr "HTTP proxy connection failed: %i"
-#: gio/ghttpproxy.c:269
+#: gio/ghttpproxy.c:266
+#| msgid "HTTP proxy connection failed: %i"
+msgid "HTTP proxy response too big"
+msgstr "HTTP proxy response too big"
+
+#: gio/ghttpproxy.c:283
msgid "HTTP proxy server closed connection unexpectedly."
msgstr "HTTP proxy server closed connection unexpectedly."
@@ -1562,7 +1589,7 @@ msgstr "Input stream doesn’t implement read"
#. Translators: This is an error you get if there is
#. * already an operation running against this stream when
#. * you try to start one
-#: gio/ginputstream.c:1218 gio/giostream.c:310 gio/goutputstream.c:2208
+#: gio/ginputstream.c:1247 gio/giostream.c:310 gio/goutputstream.c:2208
msgid "Stream has outstanding operation"
msgstr "Stream has outstanding operation"
@@ -1603,58 +1630,63 @@ msgid "Show information about locations"
msgstr "Show information about locations"
#: gio/gio-tool.c:232
+#| msgid "List static actions for an application (from .desktop file)"
+msgid "Launch an application from a desktop file"
+msgstr "Launch an application from a desktop file"
+
+#: gio/gio-tool.c:233
msgid "List the contents of locations"
msgstr "List the contents of locations"
-#: gio/gio-tool.c:233
+#: gio/gio-tool.c:234
msgid "Get or set the handler for a mimetype"
msgstr "Get or set the handler for a mimetype"
-#: gio/gio-tool.c:234
+#: gio/gio-tool.c:235
msgid "Create directories"
msgstr "Create directories"
-#: gio/gio-tool.c:235
+#: gio/gio-tool.c:236
msgid "Monitor files and directories for changes"
msgstr "Monitor files and directories for changes"
-#: gio/gio-tool.c:236
+#: gio/gio-tool.c:237
msgid "Mount or unmount the locations"
msgstr "Mount or unmount the locations"
-#: gio/gio-tool.c:237
+#: gio/gio-tool.c:238
msgid "Move one or more files"
msgstr "Move one or more files"
-#: gio/gio-tool.c:238
+#: gio/gio-tool.c:239
msgid "Open files with the default application"
msgstr "Open files with the default application"
-#: gio/gio-tool.c:239
+#: gio/gio-tool.c:240
msgid "Rename a file"
msgstr "Rename a file"
-#: gio/gio-tool.c:240
+#: gio/gio-tool.c:241
msgid "Delete one or more files"
msgstr "Delete one or more files"
-#: gio/gio-tool.c:241
+#: gio/gio-tool.c:242
msgid "Read from standard input and save"
msgstr "Read from standard input and save"
-#: gio/gio-tool.c:242
+#: gio/gio-tool.c:243
msgid "Set a file attribute"
msgstr "Set a file attribute"
-#: gio/gio-tool.c:243
+#: gio/gio-tool.c:244
msgid "Move files or directories to the trash"
msgstr "Move files or directories to the trash"
-#: gio/gio-tool.c:244
+#: gio/gio-tool.c:245
msgid "Lists the contents of locations in a tree"
msgstr "Lists the contents of locations in a tree"
-#: gio/gio-tool.c:246
+#: gio/gio-tool.c:247
#, c-format
msgid "Use %s to get detailed help.\n"
msgstr "Use %s to get detailed help.\n"
@@ -1664,12 +1696,12 @@ msgid "Error writing to stdout"
msgstr "Error writing to stdout"
#. Translators: commandline placeholder
-#: gio/gio-tool-cat.c:133 gio/gio-tool-info.c:333 gio/gio-tool-list.c:172
+#: gio/gio-tool-cat.c:133 gio/gio-tool-info.c:340 gio/gio-tool-list.c:172
#: gio/gio-tool-mkdir.c:48 gio/gio-tool-monitor.c:37 gio/gio-tool-monitor.c:39
#: gio/gio-tool-monitor.c:41 gio/gio-tool-monitor.c:43
-#: gio/gio-tool-monitor.c:203 gio/gio-tool-mount.c:1199 gio/gio-tool-open.c:70
+#: gio/gio-tool-monitor.c:204 gio/gio-tool-mount.c:1199 gio/gio-tool-open.c:70
#: gio/gio-tool-remove.c:48 gio/gio-tool-rename.c:45 gio/gio-tool-set.c:89
-#: gio/gio-tool-trash.c:81 gio/gio-tool-tree.c:239
+#: gio/gio-tool-trash.c:220 gio/gio-tool-tree.c:239
msgid "LOCATION"
msgstr "LOCATION"
@@ -1687,9 +1719,9 @@ msgstr ""
"locations instead of local files: for example, you can use something\n"
"like smb://server/resource/file.txt as location."
-#: gio/gio-tool-cat.c:162 gio/gio-tool-info.c:364 gio/gio-tool-mkdir.c:76
-#: gio/gio-tool-monitor.c:228 gio/gio-tool-mount.c:1250 gio/gio-tool-open.c:96
-#: gio/gio-tool-remove.c:72 gio/gio-tool-trash.c:136
+#: gio/gio-tool-cat.c:162 gio/gio-tool-info.c:371 gio/gio-tool-mkdir.c:76
+#: gio/gio-tool-monitor.c:229 gio/gio-tool-mount.c:1250 gio/gio-tool-open.c:96
+#: gio/gio-tool-remove.c:72 gio/gio-tool-trash.c:303
msgid "No locations given"
msgstr "No locations given"
@@ -1824,24 +1856,24 @@ msgstr "uri: %s\n"
msgid "local path: %s\n"
msgstr "local path: %s\n"
-#: gio/gio-tool-info.c:199
+#: gio/gio-tool-info.c:205
#, c-format
msgid "unix mount: %s%s %s %s %s\n"
msgstr "unix mount: %s%s %s %s %s\n"
-#: gio/gio-tool-info.c:279
+#: gio/gio-tool-info.c:286
msgid "Settable attributes:\n"
msgstr "Settable attributes:\n"
-#: gio/gio-tool-info.c:303
+#: gio/gio-tool-info.c:310
msgid "Writable attribute namespaces:\n"
msgstr "Writable attribute namespaces:\n"
-#: gio/gio-tool-info.c:338
+#: gio/gio-tool-info.c:345
msgid "Show information about locations."
msgstr "Show information about locations."
-#: gio/gio-tool-info.c:340
+#: gio/gio-tool-info.c:347
msgid ""
"gio info is similar to the traditional ls utility, but using GIO\n"
"locations instead of local files: for example, you can use something\n"
@@ -1855,6 +1887,47 @@ msgstr ""
"be specified with their GIO name, e.g. standard::icon, or just by\n"
"namespace, e.g. unix, or by “*”, which matches all attributes"
+#. Translators: commandline placeholder
+#: gio/gio-tool-launch.c:54
+msgid "DESKTOP-FILE [FILE-ARG …]"
+msgstr "DESKTOP-FILE [FILE-ARG …]"
+
+#: gio/gio-tool-launch.c:57
+msgid ""
+"Launch an application from a desktop file, passing optional filename "
+"arguments to it."
+msgstr ""
+"Launch an application from a desktop file, passing optional filename "
+"arguments to it."
+
+#: gio/gio-tool-launch.c:77
+#| msgid "No files given"
+msgid "No desktop file given"
+msgstr "No desktop file given"
+
+#: gio/gio-tool-launch.c:85
+#| msgid "There is no GCredentials support for your platform"
+msgid "The launch command is not currently supported on this platform"
+msgstr "The launch command is not currently supported on this platform"
+
+#: gio/gio-tool-launch.c:98
+#, c-format
+#| msgid "Unable to trash file %s: %s"
+msgid "Unable to load ‘%s‘: %s"
+msgstr "Unable to load ‘%s‘: %s"
+
+#: gio/gio-tool-launch.c:107
+#, c-format
+#| msgid "Failed to load info for handler “%s”"
+msgid "Unable to load application information for ‘%s‘"
+msgstr "Unable to load application information for ‘%s‘"
+
+#: gio/gio-tool-launch.c:119
+#, c-format
+#| msgid "Default application for “%s”: %s\n"
+msgid "Unable to launch application ‘%s’: %s"
+msgstr "Unable to launch application ‘%s’: %s"
+
#: gio/gio-tool-list.c:37 gio/gio-tool-tree.c:32
msgid "Show hidden files"
msgstr "Show hidden files"
@@ -1992,7 +2065,7 @@ msgstr "Report moves and renames as simple deleted/created events"
msgid "Watch for mount events"
msgstr "Watch for mount events"
-#: gio/gio-tool-monitor.c:208
+#: gio/gio-tool-monitor.c:209
msgid "Monitor files or directories for changes."
msgstr "Monitor files or directories for changes."
@@ -2116,7 +2189,7 @@ msgstr ""
"Open files with the default application that\n"
"is registered to handle files of this type."
-#: gio/gio-tool-remove.c:31 gio/gio-tool-trash.c:31
+#: gio/gio-tool-remove.c:31 gio/gio-tool-trash.c:33
msgid "Ignore nonexistent files, never prompt"
msgstr "Ignore nonexistent files, never prompt"
@@ -2229,13 +2302,54 @@ msgstr "Value not specified"
msgid "Invalid attribute type “%s”"
msgstr "Invalid attribute type “%s”"
-#: gio/gio-tool-trash.c:32
+#: gio/gio-tool-trash.c:34
msgid "Empty the trash"
msgstr "Empty the trash"
-#: gio/gio-tool-trash.c:86
-msgid "Move files or directories to the trash."
-msgstr "Move files or directories to the trash."
+#: gio/gio-tool-trash.c:35
+#| msgid "List the contents of the locations."
+msgid "List files in the trash with their original locations"
+msgstr "List files in the trash with their original locations"
+
+#: gio/gio-tool-trash.c:36
+msgid ""
+"Restore a file from trash to its original location (possibly recreating the "
+"directory)"
+msgstr ""
+"Restore a file from trash to its original location (possibly recreating the "
+"directory)"
+
+#: gio/gio-tool-trash.c:106
+#| msgid "Unable to find terminal required for application"
+msgid "Unable to find original path"
+msgstr "Unable to find original path"
+
+#: gio/gio-tool-trash.c:123
+#| msgid "Unable to create socket: %s"
+msgid "Unable to recreate original location: "
+msgstr "Unable to recreate original location: "
+
+#: gio/gio-tool-trash.c:136
+#| msgid "unable to find desktop file for application %s\n"
+msgid "Unable to move file to its original location: "
+msgstr "Unable to move file to its original location: "
+
+#: gio/gio-tool-trash.c:225
+#| msgid "Move files or directories to the trash."
+msgid "Move/Restore files or directories to the trash."
+msgstr "Move/Restore files or directories to the trash."
+
+#: gio/gio-tool-trash.c:227
+msgid ""
+"Note: for --restore switch, if the original location of the trashed file \n"
+"already exists, it will not be overwritten unless --force is set."
+msgstr ""
+"Note: for --restore switch, if the original location of the trashed file \n"
+"already exists, it will not be overwritten unless --force is set."
+
+#: gio/gio-tool-trash.c:258
+msgid "Location given doesn't start with trash:///"
+msgstr "Location given doesn't start with trash:///"
#: gio/gio-tool-tree.c:33
msgid "Follow symbolic links, mounts and shortcuts"
@@ -2853,7 +2967,7 @@ msgstr "No schema files found: doing nothing."
msgid "No schema files found: removed existing output file."
msgstr "No schema files found: removed existing output file."
-#: gio/glocalfile.c:549 gio/win32/gwinhttpfile.c:420
+#: gio/glocalfile.c:549 gio/win32/gwinhttpfile.c:436
#, c-format
msgid "Invalid filename %s"
msgstr "Invalid filename %s"
@@ -2885,8 +2999,8 @@ msgstr "Error renaming file %s: %s"
msgid "Can’t rename file, filename already exists"
msgstr "Can’t rename file, filename already exists"
-#: gio/glocalfile.c:1182 gio/glocalfile.c:2324 gio/glocalfile.c:2352
-#: gio/glocalfile.c:2491 gio/glocalfileoutputstream.c:650
+#: gio/glocalfile.c:1182 gio/glocalfile.c:2366 gio/glocalfile.c:2394
+#: gio/glocalfile.c:2533 gio/glocalfileoutputstream.c:656
msgid "Invalid filename"
msgstr "Invalid filename"
@@ -2900,91 +3014,93 @@ msgstr "Error opening file %s: %s"
msgid "Error removing file %s: %s"
msgstr "Error removing file %s: %s"
-#: gio/glocalfile.c:1969
+#: gio/glocalfile.c:1980 gio/glocalfile.c:1991
#, c-format
msgid "Error trashing file %s: %s"
msgstr "Error trashing file %s: %s"
-#: gio/glocalfile.c:2010
+#: gio/glocalfile.c:2029
#, c-format
-msgid "Unable to create trash dir %s: %s"
-msgstr "Unable to create trash dir %s: %s"
+#| msgid "Unable to create trash dir %s: %s"
+msgid "Unable to create trash directory %s: %s"
+msgstr "Unable to create trash directory %s: %s"
-#: gio/glocalfile.c:2030
+#: gio/glocalfile.c:2050
#, c-format
msgid "Unable to find toplevel directory to trash %s"
msgstr "Unable to find toplevel directory to trash %s"
-#: gio/glocalfile.c:2038
+#: gio/glocalfile.c:2058
#, c-format
msgid "Trashing on system internal mounts is not supported"
msgstr "Trashing on system internal mounts is not supported"
-#: gio/glocalfile.c:2118 gio/glocalfile.c:2138
+#: gio/glocalfile.c:2141 gio/glocalfile.c:2169
#, c-format
-msgid "Unable to find or create trash directory for %s"
-msgstr "Unable to find or create trash directory for %s"
+#| msgid "Unable to find or create trash directory for %s"
+msgid "Unable to find or create trash directory %s to trash %s"
+msgstr "Unable to find or create trash directory %s to trash %s"
-#: gio/glocalfile.c:2173
+#: gio/glocalfile.c:2215
#, c-format
msgid "Unable to create trashing info file for %s: %s"
msgstr "Unable to create trashing info file for %s: %s"
-#: gio/glocalfile.c:2235
+#: gio/glocalfile.c:2277
#, c-format
msgid "Unable to trash file %s across filesystem boundaries"
msgstr "Unable to trash file %s across filesystem boundaries"
-#: gio/glocalfile.c:2239 gio/glocalfile.c:2295
+#: gio/glocalfile.c:2281 gio/glocalfile.c:2337
#, c-format
msgid "Unable to trash file %s: %s"
msgstr "Unable to trash file %s: %s"
-#: gio/glocalfile.c:2301
+#: gio/glocalfile.c:2343
#, c-format
msgid "Unable to trash file %s"
msgstr "Unable to trash file %s"
-#: gio/glocalfile.c:2327
+#: gio/glocalfile.c:2369
#, c-format
msgid "Error creating directory %s: %s"
msgstr "Error creating directory %s: %s"
-#: gio/glocalfile.c:2356
+#: gio/glocalfile.c:2398
#, c-format
msgid "Filesystem does not support symbolic links"
msgstr "Filesystem does not support symbolic links"
-#: gio/glocalfile.c:2359
+#: gio/glocalfile.c:2401
#, c-format
msgid "Error making symbolic link %s: %s"
msgstr "Error making symbolic link %s: %s"
-#: gio/glocalfile.c:2402 gio/glocalfile.c:2437 gio/glocalfile.c:2494
+#: gio/glocalfile.c:2444 gio/glocalfile.c:2479 gio/glocalfile.c:2536
#, c-format
msgid "Error moving file %s: %s"
msgstr "Error moving file %s: %s"
-#: gio/glocalfile.c:2425
+#: gio/glocalfile.c:2467
msgid "Can’t move directory over directory"
msgstr "Can’t move directory over directory"
-#: gio/glocalfile.c:2451 gio/glocalfileoutputstream.c:1039
-#: gio/glocalfileoutputstream.c:1053 gio/glocalfileoutputstream.c:1068
-#: gio/glocalfileoutputstream.c:1085 gio/glocalfileoutputstream.c:1099
+#: gio/glocalfile.c:2493 gio/glocalfileoutputstream.c:1079
+#: gio/glocalfileoutputstream.c:1093 gio/glocalfileoutputstream.c:1108
+#: gio/glocalfileoutputstream.c:1125 gio/glocalfileoutputstream.c:1139
msgid "Backup file creation failed"
msgstr "Backup file creation failed"
-#: gio/glocalfile.c:2470
+#: gio/glocalfile.c:2512
#, c-format
msgid "Error removing target file: %s"
msgstr "Error removing target file: %s"
-#: gio/glocalfile.c:2484
+#: gio/glocalfile.c:2526
msgid "Move between mounts not supported"
msgstr "Move between mounts not supported"
-#: gio/glocalfile.c:2658
+#: gio/glocalfile.c:2700
#, c-format
msgid "Could not determine the disk usage of %s: %s"
msgstr "Could not determine the disk usage of %s: %s"
@@ -3006,189 +3122,185 @@ msgstr "Invalid extended attribute name"
msgid "Error setting extended attribute “%s”: %s"
msgstr "Error setting extended attribute “%s”: %s"
-#: gio/glocalfileinfo.c:1663
+#: gio/glocalfileinfo.c:1709 gio/win32/gwinhttpfile.c:191
msgid " (invalid encoding)"
msgstr " (invalid encoding)"
-#: gio/glocalfileinfo.c:1822 gio/glocalfileoutputstream.c:915
+#: gio/glocalfileinfo.c:1868 gio/glocalfileoutputstream.c:943
#, c-format
msgid "Error when getting information for file “%s”: %s"
msgstr "Error when getting information for file “%s”: %s"
-#: gio/glocalfileinfo.c:2088
+#: gio/glocalfileinfo.c:2134
#, c-format
msgid "Error when getting information for file descriptor: %s"
msgstr "Error when getting information for file descriptor: %s"
-#: gio/glocalfileinfo.c:2133
+#: gio/glocalfileinfo.c:2179
msgid "Invalid attribute type (uint32 expected)"
msgstr "Invalid attribute type (uint32 expected)"
-#: gio/glocalfileinfo.c:2151
+#: gio/glocalfileinfo.c:2197
msgid "Invalid attribute type (uint64 expected)"
msgstr "Invalid attribute type (uint64 expected)"
-#: gio/glocalfileinfo.c:2170 gio/glocalfileinfo.c:2189
+#: gio/glocalfileinfo.c:2216 gio/glocalfileinfo.c:2235
msgid "Invalid attribute type (byte string expected)"
msgstr "Invalid attribute type (byte string expected)"
-#: gio/glocalfileinfo.c:2236
+#: gio/glocalfileinfo.c:2282
msgid "Cannot set permissions on symlinks"
msgstr "Cannot set permissions on symlinks"
-#: gio/glocalfileinfo.c:2252
+#: gio/glocalfileinfo.c:2298
#, c-format
msgid "Error setting permissions: %s"
msgstr "Error setting permissions: %s"
-#: gio/glocalfileinfo.c:2303
+#: gio/glocalfileinfo.c:2349
#, c-format
msgid "Error setting owner: %s"
msgstr "Error setting owner: %s"
-#: gio/glocalfileinfo.c:2326
+#: gio/glocalfileinfo.c:2372
msgid "symlink must be non-NULL"
msgstr "symlink must be non-NULL"
-#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355
-#: gio/glocalfileinfo.c:2366
+#: gio/glocalfileinfo.c:2382 gio/glocalfileinfo.c:2401
+#: gio/glocalfileinfo.c:2412
#, c-format
msgid "Error setting symlink: %s"
msgstr "Error setting symlink: %s"
-#: gio/glocalfileinfo.c:2345
+#: gio/glocalfileinfo.c:2391
msgid "Error setting symlink: file is not a symlink"
msgstr "Error setting symlink: file is not a symlink"
-#: gio/glocalfileinfo.c:2417
+#: gio/glocalfileinfo.c:2463
#, c-format
msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative"
msgstr "Extra nanoseconds %d for UNIX timestamp %lld are negative"
-#: gio/glocalfileinfo.c:2426
+#: gio/glocalfileinfo.c:2472
#, c-format
msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second"
msgstr "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second"
-#: gio/glocalfileinfo.c:2436
+#: gio/glocalfileinfo.c:2482
#, c-format
msgid "UNIX timestamp %lld does not fit into 64 bits"
msgstr "UNIX timestamp %lld does not fit into 64 bits"
-#: gio/glocalfileinfo.c:2447
+#: gio/glocalfileinfo.c:2493
#, c-format
msgid "UNIX timestamp %lld is outside of the range supported by Windows"
msgstr "UNIX timestamp %lld is outside of the range supported by Windows"
-#: gio/glocalfileinfo.c:2511
+#: gio/glocalfileinfo.c:2557
#, c-format
-#| msgid "Value “%s” cannot be interpreted as a number."
msgid "File name “%s” cannot be converted to UTF-16"
msgstr "File name “%s” cannot be converted to UTF-16"
-#: gio/glocalfileinfo.c:2530
+#: gio/glocalfileinfo.c:2576
#, c-format
-#| msgid "Value “%s” cannot be interpreted as a number."
msgid "File “%s” cannot be opened: Windows Error %lu"
msgstr "File “%s” cannot be opened: Windows Error %lu"
-#: gio/glocalfileinfo.c:2543
+#: gio/glocalfileinfo.c:2589
#, c-format
-#| msgid "Error setting modification or access time: %s"
msgid "Error setting modification or access time for file “%s”: %lu"
msgstr "Error setting modification or access time for file “%s”: %lu"
-#: gio/glocalfileinfo.c:2644
+#: gio/glocalfileinfo.c:2690
#, c-format
msgid "Error setting modification or access time: %s"
msgstr "Error setting modification or access time: %s"
# c-format
-#: gio/glocalfileinfo.c:2667
+#: gio/glocalfileinfo.c:2713
msgid "SELinux context must be non-NULL"
msgstr "SELinux context must be non-NULL"
-#: gio/glocalfileinfo.c:2682
+#: gio/glocalfileinfo.c:2720
+msgid "SELinux is not enabled on this system"
+msgstr "SELinux is not enabled on this system"
+
+#: gio/glocalfileinfo.c:2730
#, c-format
msgid "Error setting SELinux context: %s"
msgstr "Error setting SELinux context: %s"
-#: gio/glocalfileinfo.c:2689
-msgid "SELinux is not enabled on this system"
-msgstr "SELinux is not enabled on this system"
-
-#: gio/glocalfileinfo.c:2781
+#: gio/glocalfileinfo.c:2823
#, c-format
msgid "Setting attribute %s not supported"
msgstr "Setting attribute %s not supported"
-#: gio/glocalfileinputstream.c:168 gio/glocalfileoutputstream.c:795
+#: gio/glocalfileinputstream.c:163 gio/glocalfileoutputstream.c:801
#, c-format
msgid "Error reading from file: %s"
msgstr "Error reading from file: %s"
-#: gio/glocalfileinputstream.c:199 gio/glocalfileinputstream.c:211
-#: gio/glocalfileinputstream.c:225 gio/glocalfileinputstream.c:333
-#: gio/glocalfileoutputstream.c:557 gio/glocalfileoutputstream.c:1117
-#, c-format
-msgid "Error seeking in file: %s"
-msgstr "Error seeking in file: %s"
-
-#: gio/glocalfileinputstream.c:255 gio/glocalfileoutputstream.c:347
-#: gio/glocalfileoutputstream.c:441
+#: gio/glocalfileinputstream.c:194 gio/glocalfileoutputstream.c:353
+#: gio/glocalfileoutputstream.c:447
#, c-format
msgid "Error closing file: %s"
msgstr "Error closing file: %s"
-#: gio/glocalfilemonitor.c:865
+#: gio/glocalfileinputstream.c:272 gio/glocalfileoutputstream.c:563
+#: gio/glocalfileoutputstream.c:1157
+#, c-format
+msgid "Error seeking in file: %s"
+msgstr "Error seeking in file: %s"
+
+#: gio/glocalfilemonitor.c:866
msgid "Unable to find default local file monitor type"
msgstr "Unable to find default local file monitor type"
-#: gio/glocalfileoutputstream.c:214 gio/glocalfileoutputstream.c:292
-#: gio/glocalfileoutputstream.c:328 gio/glocalfileoutputstream.c:816
+#: gio/glocalfileoutputstream.c:220 gio/glocalfileoutputstream.c:298
+#: gio/glocalfileoutputstream.c:334 gio/glocalfileoutputstream.c:822
#, c-format
msgid "Error writing to file: %s"
msgstr "Error writing to file: %s"
-#: gio/glocalfileoutputstream.c:374
+#: gio/glocalfileoutputstream.c:380
#, c-format
msgid "Error removing old backup link: %s"
msgstr "Error removing old backup link: %s"
-#: gio/glocalfileoutputstream.c:388 gio/glocalfileoutputstream.c:401
+#: gio/glocalfileoutputstream.c:394 gio/glocalfileoutputstream.c:407
#, c-format
msgid "Error creating backup copy: %s"
msgstr "Error creating backup copy: %s"
-#: gio/glocalfileoutputstream.c:419
+#: gio/glocalfileoutputstream.c:425
#, c-format
msgid "Error renaming temporary file: %s"
msgstr "Error renaming temporary file: %s"
-#: gio/glocalfileoutputstream.c:603 gio/glocalfileoutputstream.c:1168
+#: gio/glocalfileoutputstream.c:609 gio/glocalfileoutputstream.c:1208
#, c-format
msgid "Error truncating file: %s"
msgstr "Error truncating file: %s"
-#: gio/glocalfileoutputstream.c:656 gio/glocalfileoutputstream.c:894
-#: gio/glocalfileoutputstream.c:1149 gio/gsubprocess.c:380
+#: gio/glocalfileoutputstream.c:662 gio/glocalfileoutputstream.c:907
+#: gio/glocalfileoutputstream.c:1189 gio/gsubprocess.c:226
#, c-format
msgid "Error opening file “%s”: %s"
msgstr "Error opening file “%s”: %s"
-#: gio/glocalfileoutputstream.c:928
+#: gio/glocalfileoutputstream.c:957
msgid "Target file is a directory"
msgstr "Target file is a directory"
-#: gio/glocalfileoutputstream.c:933
+#: gio/glocalfileoutputstream.c:971
msgid "Target file is not a regular file"
msgstr "Target file is not a regular file"
-#: gio/glocalfileoutputstream.c:945
+#: gio/glocalfileoutputstream.c:984
msgid "The file was externally modified"
msgstr "The file was externally modified"
-#: gio/glocalfileoutputstream.c:1133
+#: gio/glocalfileoutputstream.c:1173
#, c-format
msgid "Error removing old file: %s"
msgstr "Error removing old file: %s"
@@ -3343,15 +3455,15 @@ msgstr "%s not implemented"
msgid "Invalid domain"
msgstr "Invalid domain"
-#: gio/gresource.c:672 gio/gresource.c:931 gio/gresource.c:970
-#: gio/gresource.c:1094 gio/gresource.c:1166 gio/gresource.c:1239
-#: gio/gresource.c:1320 gio/gresourcefile.c:476 gio/gresourcefile.c:599
+#: gio/gresource.c:681 gio/gresource.c:943 gio/gresource.c:983
+#: gio/gresource.c:1107 gio/gresource.c:1179 gio/gresource.c:1253
+#: gio/gresource.c:1334 gio/gresourcefile.c:476 gio/gresourcefile.c:599
#: gio/gresourcefile.c:736
#, c-format
msgid "The resource at “%s” does not exist"
msgstr "The resource at “%s” does not exist"
-#: gio/gresource.c:837
+#: gio/gresource.c:848
#, c-format
msgid "The resource at “%s” failed to decompress"
msgstr "The resource at “%s” failed to decompress"
@@ -3726,7 +3838,7 @@ msgstr "Invalid socket, initialization failed due to: %s"
msgid "Socket is already closed"
msgstr "Socket is already closed"
-#: gio/gsocket.c:443 gio/gsocket.c:3180 gio/gsocket.c:4403 gio/gsocket.c:4461
+#: gio/gsocket.c:443 gio/gsocket.c:3190 gio/gsocket.c:4420 gio/gsocket.c:4478
msgid "Socket I/O timed out"
msgstr "Socket I/O timed out"
@@ -3735,176 +3847,182 @@ msgstr "Socket I/O timed out"
msgid "creating GSocket from fd: %s"
msgstr "creating GSocket from fd: %s"
-#: gio/gsocket.c:607 gio/gsocket.c:661 gio/gsocket.c:668
+#: gio/gsocket.c:607 gio/gsocket.c:671 gio/gsocket.c:678
#, c-format
msgid "Unable to create socket: %s"
msgstr "Unable to create socket: %s"
-#: gio/gsocket.c:661
+#: gio/gsocket.c:671
msgid "Unknown family was specified"
msgstr "Unknown family was specified"
-#: gio/gsocket.c:668
+#: gio/gsocket.c:678
msgid "Unknown protocol was specified"
msgstr "Unknown protocol was specified"
-#: gio/gsocket.c:1159
+#: gio/gsocket.c:1169
#, c-format
msgid "Cannot use datagram operations on a non-datagram socket."
msgstr "Cannot use datagram operations on a non-datagram socket."
-#: gio/gsocket.c:1176
+#: gio/gsocket.c:1186
#, c-format
msgid "Cannot use datagram operations on a socket with a timeout set."
msgstr "Cannot use datagram operations on a socket with a timeout set."
-#: gio/gsocket.c:1983
+#: gio/gsocket.c:1993
#, c-format
msgid "could not get local address: %s"
msgstr "could not get local address: %s"
-#: gio/gsocket.c:2029
+#: gio/gsocket.c:2039
#, c-format
msgid "could not get remote address: %s"
msgstr "could not get remote address: %s"
-#: gio/gsocket.c:2095
+#: gio/gsocket.c:2105
#, c-format
msgid "could not listen: %s"
msgstr "could not listen: %s"
-#: gio/gsocket.c:2199
+#: gio/gsocket.c:2209
#, c-format
msgid "Error binding to address %s: %s"
msgstr "Error binding to address %s: %s"
-#: gio/gsocket.c:2375 gio/gsocket.c:2412 gio/gsocket.c:2522 gio/gsocket.c:2547
-#: gio/gsocket.c:2610 gio/gsocket.c:2668 gio/gsocket.c:2686
+#: gio/gsocket.c:2385 gio/gsocket.c:2422 gio/gsocket.c:2532 gio/gsocket.c:2557
+#: gio/gsocket.c:2620 gio/gsocket.c:2678 gio/gsocket.c:2696
#, c-format
msgid "Error joining multicast group: %s"
msgstr "Error joining multicast group: %s"
-#: gio/gsocket.c:2376 gio/gsocket.c:2413 gio/gsocket.c:2523 gio/gsocket.c:2548
-#: gio/gsocket.c:2611 gio/gsocket.c:2669 gio/gsocket.c:2687
+#: gio/gsocket.c:2386 gio/gsocket.c:2423 gio/gsocket.c:2533 gio/gsocket.c:2558
+#: gio/gsocket.c:2621 gio/gsocket.c:2679 gio/gsocket.c:2697
#, c-format
msgid "Error leaving multicast group: %s"
msgstr "Error leaving multicast group: %s"
-#: gio/gsocket.c:2377
+#: gio/gsocket.c:2387
msgid "No support for source-specific multicast"
msgstr "No support for source-specific multicast"
-#: gio/gsocket.c:2524
+#: gio/gsocket.c:2534
msgid "Unsupported socket family"
msgstr "Unsupported socket family"
-#: gio/gsocket.c:2549
+#: gio/gsocket.c:2559
msgid "source-specific not an IPv4 address"
msgstr "source-specific not an IPv4 address"
-#: gio/gsocket.c:2573
+#: gio/gsocket.c:2583
#, c-format
msgid "Interface name too long"
msgstr "Interface name too long"
-#: gio/gsocket.c:2586 gio/gsocket.c:2636
+#: gio/gsocket.c:2596 gio/gsocket.c:2646
#, c-format
msgid "Interface not found: %s"
msgstr "Interface not found: %s"
-#: gio/gsocket.c:2612
+#: gio/gsocket.c:2622
msgid "No support for IPv4 source-specific multicast"
msgstr "No support for IPv4 source-specific multicast"
-#: gio/gsocket.c:2670
+#: gio/gsocket.c:2680
msgid "No support for IPv6 source-specific multicast"
msgstr "No support for IPv6 source-specific multicast"
-#: gio/gsocket.c:2879
+#: gio/gsocket.c:2889
#, c-format
msgid "Error accepting connection: %s"
msgstr "Error accepting connection: %s"
-#: gio/gsocket.c:3005
+#: gio/gsocket.c:3015
msgid "Connection in progress"
msgstr "Connection in progress"
-#: gio/gsocket.c:3056
+#: gio/gsocket.c:3066
msgid "Unable to get pending error: "
msgstr "Unable to get pending error: "
-#: gio/gsocket.c:3245
+#: gio/gsocket.c:3255
#, c-format
msgid "Error receiving data: %s"
msgstr "Error receiving data: %s"
-#: gio/gsocket.c:3442
+#: gio/gsocket.c:3452
#, c-format
msgid "Error sending data: %s"
msgstr "Error sending data: %s"
-#: gio/gsocket.c:3629
+#: gio/gsocket.c:3639
#, c-format
msgid "Unable to shutdown socket: %s"
msgstr "Unable to shutdown socket: %s"
-#: gio/gsocket.c:3710
+#: gio/gsocket.c:3720
#, c-format
msgid "Error closing socket: %s"
msgstr "Error closing socket: %s"
-#: gio/gsocket.c:4396
+#: gio/gsocket.c:4413
#, c-format
msgid "Waiting for socket condition: %s"
msgstr "Waiting for socket condition: %s"
-#: gio/gsocket.c:4774 gio/gsocket.c:4776 gio/gsocket.c:4923 gio/gsocket.c:5008
-#: gio/gsocket.c:5186 gio/gsocket.c:5226 gio/gsocket.c:5228
+#: gio/gsocket.c:4804 gio/gsocket.c:4820 gio/gsocket.c:4833
+#, c-format
+#| msgid "Error sending message: %s"
+msgid "Unable to send message: %s"
+msgstr "Unable to send message: %s"
+
+#: gio/gsocket.c:4805 gio/gsocket.c:4821 gio/gsocket.c:4834
+msgid "Message vectors too large"
+msgstr "Message vectors too large"
+
+#: gio/gsocket.c:4850 gio/gsocket.c:4852 gio/gsocket.c:4999 gio/gsocket.c:5084
+#: gio/gsocket.c:5262 gio/gsocket.c:5302 gio/gsocket.c:5304
#, c-format
msgid "Error sending message: %s"
msgstr "Error sending message: %s"
-#: gio/gsocket.c:4950
+#: gio/gsocket.c:5026
msgid "GSocketControlMessage not supported on Windows"
msgstr "GSocketControlMessage not supported on Windows"
-#: gio/gsocket.c:5419 gio/gsocket.c:5492 gio/gsocket.c:5718
+#: gio/gsocket.c:5495 gio/gsocket.c:5571 gio/gsocket.c:5797
#, c-format
msgid "Error receiving message: %s"
msgstr "Error receiving message: %s"
-#: gio/gsocket.c:5990 gio/gsocket.c:6038
+#: gio/gsocket.c:6070 gio/gsocket.c:6081 gio/gsocket.c:6127
#, c-format
msgid "Unable to read socket credentials: %s"
msgstr "Unable to read socket credentials: %s"
-#: gio/gsocket.c:6047
+#: gio/gsocket.c:6136
msgid "g_socket_get_credentials not implemented for this OS"
msgstr "g_socket_get_credentials not implemented for this OS"
-#: gio/gsocketclient.c:182
+#: gio/gsocketclient.c:191
#, c-format
msgid "Could not connect to proxy server %s: "
msgstr "Could not connect to proxy server %s: "
-#: gio/gsocketclient.c:196
+#: gio/gsocketclient.c:205
#, c-format
msgid "Could not connect to %s: "
msgstr "Could not connect to %s: "
-#: gio/gsocketclient.c:198
+#: gio/gsocketclient.c:207
msgid "Could not connect: "
msgstr "Could not connect: "
-#: gio/gsocketclient.c:1037 gio/gsocketclient.c:1866
-msgid "Unknown error on connect"
-msgstr "Unknown error on connect"
-
-#: gio/gsocketclient.c:1091 gio/gsocketclient.c:1668
+#: gio/gsocketclient.c:1162 gio/gsocketclient.c:1749
msgid "Proxying over a non-TCP connection is not supported."
msgstr "Proxying over a non-TCP connection is not supported."
-#: gio/gsocketclient.c:1120 gio/gsocketclient.c:1698
+#: gio/gsocketclient.c:1194 gio/gsocketclient.c:1778
#, c-format
msgid "Proxy protocol “%s” is not supported."
msgstr "Proxy protocol “%s” is not supported."
@@ -4035,26 +4153,30 @@ msgstr "Temporarily unable to resolve “%s”"
msgid "Error resolving “%s”"
msgstr "Error resolving “%s”"
-#: gio/gtlscertificate.c:243
+#: gio/gtlscertificate.c:298
msgid "No PEM-encoded private key found"
msgstr "No PEM-encoded private key found"
-#: gio/gtlscertificate.c:253
+#: gio/gtlscertificate.c:308
msgid "Cannot decrypt PEM-encoded private key"
msgstr "Cannot decrypt PEM-encoded private key"
-#: gio/gtlscertificate.c:264
+#: gio/gtlscertificate.c:319
msgid "Could not parse PEM-encoded private key"
msgstr "Could not parse PEM-encoded private key"
-#: gio/gtlscertificate.c:291
+#: gio/gtlscertificate.c:346
msgid "No PEM-encoded certificate found"
msgstr "No PEM-encoded certificate found"
-#: gio/gtlscertificate.c:300
+#: gio/gtlscertificate.c:355
msgid "Could not parse PEM-encoded certificate"
msgstr "Could not parse PEM-encoded certificate"
+#: gio/gtlscertificate.c:710
+msgid "This GTlsBackend does not support creating PKCS #11 certificates"
+msgstr "This GTlsBackend does not support creating PKCS #11 certificates"
+
#: gio/gtlspassword.c:111
msgid ""
"This is the last chance to enter the password correctly before your access "
@@ -4081,8 +4203,10 @@ msgstr "The password entered is incorrect."
#, c-format
msgid "Expecting 1 control message, got %d"
msgid_plural "Expecting 1 control message, got %d"
-msgstr[0] "Expecting 1 control message, got %d"
-msgstr[1] "Expecting 1 control message, got %d"
+msgstr[0] "‫Expecting 1 control message, got %d"
+msgstr[1] "‫Expecting 1 control message, got %d"
+msgstr[2] "‫Expecting 1 control message, got %d"
+msgstr[3] "‫Expecting 1 control message, got %d"
#: gio/gunixconnection.c:182 gio/gunixconnection.c:591
msgid "Unexpected type of ancillary data"
@@ -4092,8 +4216,18 @@ msgstr "Unexpected type of ancillary data"
#, c-format
msgid "Expecting one fd, but got %d\n"
msgid_plural "Expecting one fd, but got %d\n"
-msgstr[0] "Expecting one fd, but got %d\n"
-msgstr[1] "Expecting one fd, but got %d\n"
+msgstr[0] ""
+"‫Expecting one fd, but got %d\n"
+"‬\n"
+msgstr[1] ""
+"‫Expecting one fd, but got %d\n"
+"‬\n"
+msgstr[2] ""
+"‫Expecting one fd, but got %d\n"
+"‬\n"
+msgstr[3] ""
+"‫Expecting one fd, but got %d\n"
+"‬\n"
#: gio/gunixconnection.c:219
msgid "Received invalid fd"
@@ -4101,7 +4235,7 @@ msgstr "Received invalid fd"
#: gio/gunixconnection.c:363
msgid "Error sending credentials: "
-msgstr "Error sending data: %s"
+msgstr "Error sending credentials: "
#: gio/gunixconnection.c:520
#, c-format
@@ -4129,24 +4263,24 @@ msgstr "Not expecting control message, but got %d"
msgid "Error while disabling SO_PASSCRED: %s"
msgstr "Error while disabling SO_PASSCRED: %s"
-#: gio/gunixinputstream.c:362 gio/gunixinputstream.c:383
+#: gio/gunixinputstream.c:357 gio/gunixinputstream.c:378
#, c-format
msgid "Error reading from file descriptor: %s"
msgstr "Error reading from file descriptor: %s"
-#: gio/gunixinputstream.c:416 gio/gunixoutputstream.c:525
+#: gio/gunixinputstream.c:411 gio/gunixoutputstream.c:520
#: gio/gwin32inputstream.c:217 gio/gwin32outputstream.c:204
#, c-format
msgid "Error closing file descriptor: %s"
msgstr "Error closing file descriptor: %s"
-#: gio/gunixmounts.c:2755 gio/gunixmounts.c:2808
+#: gio/gunixmounts.c:2780 gio/gunixmounts.c:2833
msgid "Filesystem root"
msgstr "Filesystem root"
-#: gio/gunixoutputstream.c:362 gio/gunixoutputstream.c:382
-#: gio/gunixoutputstream.c:469 gio/gunixoutputstream.c:489
-#: gio/gunixoutputstream.c:635
+#: gio/gunixoutputstream.c:357 gio/gunixoutputstream.c:377
+#: gio/gunixoutputstream.c:464 gio/gunixoutputstream.c:484
+#: gio/gunixoutputstream.c:630
#, c-format
msgid "Error writing to file descriptor: %s"
msgstr "Error writing to file descriptor: %s"
@@ -4183,7 +4317,7 @@ msgstr "Error writing to file: %s"
#: gio/gzlibcompressor.c:394 gio/gzlibdecompressor.c:347
msgid "Not enough memory"
-msgstr "out of memory"
+msgstr "Not enough memory"
#: gio/gzlibcompressor.c:401 gio/gzlibdecompressor.c:354
#, c-format
@@ -4350,25 +4484,25 @@ msgid "The pathname “%s” is not an absolute path"
msgstr "The pathname “%s” is not an absolute path"
#. Translators: this is the preferred format for expressing the date and the time
-#: glib/gdatetime.c:220
+#: glib/gdatetime.c:226
msgctxt "GDateTime"
msgid "%a %b %e %H:%M:%S %Y"
msgstr "%Z %H:%M:%S %Y %b %d %a"
#. Translators: this is the preferred format for expressing the date
-#: glib/gdatetime.c:223
+#: glib/gdatetime.c:229
msgctxt "GDateTime"
msgid "%m/%d/%y"
msgstr "%d/%m/%y"
#. Translators: this is the preferred format for expressing the time
-#: glib/gdatetime.c:226
+#: glib/gdatetime.c:232
msgctxt "GDateTime"
msgid "%H:%M:%S"
msgstr "%H:%M:%S"
#. Translators: this is the preferred format for expressing 12 hour time
-#: glib/gdatetime.c:229
+#: glib/gdatetime.c:235
msgctxt "GDateTime"
msgid "%I:%M:%S %p"
msgstr "%I:%M:%S %P"
@@ -4389,62 +4523,62 @@ msgstr "%I:%M:%S %P"
#. * non-European) there is no difference between the standalone and
#. * complete date form.
#.
-#: glib/gdatetime.c:268
+#: glib/gdatetime.c:274
msgctxt "full month name"
msgid "January"
msgstr "ינואר"
-#: glib/gdatetime.c:270
+#: glib/gdatetime.c:276
msgctxt "full month name"
msgid "February"
msgstr "פברואר"
-#: glib/gdatetime.c:272
+#: glib/gdatetime.c:278
msgctxt "full month name"
msgid "March"
msgstr "מרץ"
-#: glib/gdatetime.c:274
+#: glib/gdatetime.c:280
msgctxt "full month name"
msgid "April"
msgstr "אפריל"
-#: glib/gdatetime.c:276
+#: glib/gdatetime.c:282
msgctxt "full month name"
msgid "May"
msgstr "מאי"
-#: glib/gdatetime.c:278
+#: glib/gdatetime.c:284
msgctxt "full month name"
msgid "June"
msgstr "יוני"
-#: glib/gdatetime.c:280
+#: glib/gdatetime.c:286
msgctxt "full month name"
msgid "July"
msgstr "יולי"
-#: glib/gdatetime.c:282
+#: glib/gdatetime.c:288
msgctxt "full month name"
msgid "August"
msgstr "אוגוסט"
-#: glib/gdatetime.c:284
+#: glib/gdatetime.c:290
msgctxt "full month name"
msgid "September"
msgstr "ספטמבר"
-#: glib/gdatetime.c:286
+#: glib/gdatetime.c:292
msgctxt "full month name"
msgid "October"
msgstr "אוקטובר"
-#: glib/gdatetime.c:288
+#: glib/gdatetime.c:294
msgctxt "full month name"
msgid "November"
msgstr "נובמבר"
-#: glib/gdatetime.c:290
+#: glib/gdatetime.c:296
msgctxt "full month name"
msgid "December"
msgstr "דצמבר"
@@ -4466,132 +4600,132 @@ msgstr "דצמבר"
#. * other platform. Here are abbreviated month names in a form
#. * appropriate when they are used standalone.
#.
-#: glib/gdatetime.c:322
+#: glib/gdatetime.c:328
msgctxt "abbreviated month name"
msgid "Jan"
msgstr "ינו"
-#: glib/gdatetime.c:324
+#: glib/gdatetime.c:330
msgctxt "abbreviated month name"
msgid "Feb"
msgstr "פבר"
-#: glib/gdatetime.c:326
+#: glib/gdatetime.c:332
msgctxt "abbreviated month name"
msgid "Mar"
msgstr "מרץ"
-#: glib/gdatetime.c:328
+#: glib/gdatetime.c:334
msgctxt "abbreviated month name"
msgid "Apr"
msgstr "אפר"
-#: glib/gdatetime.c:330
+#: glib/gdatetime.c:336
msgctxt "abbreviated month name"
msgid "May"
msgstr "מאי"
-#: glib/gdatetime.c:332
+#: glib/gdatetime.c:338
msgctxt "abbreviated month name"
msgid "Jun"
msgstr "יונ"
-#: glib/gdatetime.c:334
+#: glib/gdatetime.c:340
msgctxt "abbreviated month name"
msgid "Jul"
msgstr "יול"
-#: glib/gdatetime.c:336
+#: glib/gdatetime.c:342
msgctxt "abbreviated month name"
msgid "Aug"
msgstr "אוג"
-#: glib/gdatetime.c:338
+#: glib/gdatetime.c:344
msgctxt "abbreviated month name"
msgid "Sep"
msgstr "ספט"
-#: glib/gdatetime.c:340
+#: glib/gdatetime.c:346
msgctxt "abbreviated month name"
msgid "Oct"
msgstr "אוק"
-#: glib/gdatetime.c:342
+#: glib/gdatetime.c:348
msgctxt "abbreviated month name"
msgid "Nov"
msgstr "נוב"
-#: glib/gdatetime.c:344
+#: glib/gdatetime.c:350
msgctxt "abbreviated month name"
msgid "Dec"
msgstr "דצמ"
-#: glib/gdatetime.c:359
+#: glib/gdatetime.c:365
msgctxt "full weekday name"
msgid "Monday"
msgstr "יום שני"
-#: glib/gdatetime.c:361
+#: glib/gdatetime.c:367
msgctxt "full weekday name"
msgid "Tuesday"
msgstr "יום שלישי"
-#: glib/gdatetime.c:363
+#: glib/gdatetime.c:369
msgctxt "full weekday name"
msgid "Wednesday"
msgstr "יום רביעי"
-#: glib/gdatetime.c:365
+#: glib/gdatetime.c:371
msgctxt "full weekday name"
msgid "Thursday"
msgstr "יום חמישי"
-#: glib/gdatetime.c:367
+#: glib/gdatetime.c:373
msgctxt "full weekday name"
msgid "Friday"
msgstr "יום שישי"
-#: glib/gdatetime.c:369
+#: glib/gdatetime.c:375
msgctxt "full weekday name"
msgid "Saturday"
msgstr "שבת"
-#: glib/gdatetime.c:371
+#: glib/gdatetime.c:377
msgctxt "full weekday name"
msgid "Sunday"
msgstr "יום ראשון"
-#: glib/gdatetime.c:386
+#: glib/gdatetime.c:392
msgctxt "abbreviated weekday name"
msgid "Mon"
msgstr "ב׳"
-#: glib/gdatetime.c:388
+#: glib/gdatetime.c:394
msgctxt "abbreviated weekday name"
msgid "Tue"
msgstr "ג׳"
-#: glib/gdatetime.c:390
+#: glib/gdatetime.c:396
msgctxt "abbreviated weekday name"
msgid "Wed"
msgstr "ד׳"
-#: glib/gdatetime.c:392
+#: glib/gdatetime.c:398
msgctxt "abbreviated weekday name"
msgid "Thu"
msgstr "ה"
-#: glib/gdatetime.c:394
+#: glib/gdatetime.c:400
msgctxt "abbreviated weekday name"
msgid "Fri"
msgstr "ו׳"
-#: glib/gdatetime.c:396
+#: glib/gdatetime.c:402
msgctxt "abbreviated weekday name"
msgid "Sat"
msgstr "ש׳"
-#: glib/gdatetime.c:398
+#: glib/gdatetime.c:404
msgctxt "abbreviated weekday name"
msgid "Sun"
msgstr "א׳"
@@ -4613,62 +4747,62 @@ msgstr "א׳"
#. * (western European, non-European) there is no difference between the
#. * standalone and complete date form.
#.
-#: glib/gdatetime.c:462
+#: glib/gdatetime.c:468
msgctxt "full month name with day"
msgid "January"
msgstr "ינואר"
-#: glib/gdatetime.c:464
+#: glib/gdatetime.c:470
msgctxt "full month name with day"
msgid "February"
msgstr "פברואר"
-#: glib/gdatetime.c:466
+#: glib/gdatetime.c:472
msgctxt "full month name with day"
msgid "March"
msgstr "מרץ"
-#: glib/gdatetime.c:468
+#: glib/gdatetime.c:474
msgctxt "full month name with day"
msgid "April"
msgstr "אפריל"
-#: glib/gdatetime.c:470
+#: glib/gdatetime.c:476
msgctxt "full month name with day"
msgid "May"
msgstr "מאי"
-#: glib/gdatetime.c:472
+#: glib/gdatetime.c:478
msgctxt "full month name with day"
msgid "June"
msgstr "יוני"
-#: glib/gdatetime.c:474
+#: glib/gdatetime.c:480
msgctxt "full month name with day"
msgid "July"
msgstr "יולי"
-#: glib/gdatetime.c:476
+#: glib/gdatetime.c:482
msgctxt "full month name with day"
msgid "August"
msgstr "אוגוסט"
-#: glib/gdatetime.c:478
+#: glib/gdatetime.c:484
msgctxt "full month name with day"
msgid "September"
msgstr "ספטמבר"
-#: glib/gdatetime.c:480
+#: glib/gdatetime.c:486
msgctxt "full month name with day"
msgid "October"
msgstr "אוקטובר"
-#: glib/gdatetime.c:482
+#: glib/gdatetime.c:488
msgctxt "full month name with day"
msgid "November"
msgstr "נובמבר"
-#: glib/gdatetime.c:484
+#: glib/gdatetime.c:490
msgctxt "full month name with day"
msgid "December"
msgstr "דצמבר"
@@ -4690,74 +4824,74 @@ msgstr "דצמבר"
#. * month names almost ready to copy and paste here. In other systems
#. * due to a bug the result is incorrect in some languages.
#.
-#: glib/gdatetime.c:549
+#: glib/gdatetime.c:555
msgctxt "abbreviated month name with day"
msgid "Jan"
msgstr "ינו"
-#: glib/gdatetime.c:551
+#: glib/gdatetime.c:557
msgctxt "abbreviated month name with day"
msgid "Feb"
msgstr "פבר"
-#: glib/gdatetime.c:553
+#: glib/gdatetime.c:559
msgctxt "abbreviated month name with day"
msgid "Mar"
msgstr "מרץ"
-#: glib/gdatetime.c:555
+#: glib/gdatetime.c:561
msgctxt "abbreviated month name with day"
msgid "Apr"
msgstr "אפר"
-#: glib/gdatetime.c:557
+#: glib/gdatetime.c:563
msgctxt "abbreviated month name with day"
msgid "May"
msgstr "מאי"
-#: glib/gdatetime.c:559
+#: glib/gdatetime.c:565
msgctxt "abbreviated month name with day"
msgid "Jun"
msgstr "יונ"
-#: glib/gdatetime.c:561
+#: glib/gdatetime.c:567
msgctxt "abbreviated month name with day"
msgid "Jul"
msgstr "יול"
-#: glib/gdatetime.c:563
+#: glib/gdatetime.c:569
msgctxt "abbreviated month name with day"
msgid "Aug"
msgstr "אוג"
-#: glib/gdatetime.c:565
+#: glib/gdatetime.c:571
msgctxt "abbreviated month name with day"
msgid "Sep"
msgstr "ספט"
-#: glib/gdatetime.c:567
+#: glib/gdatetime.c:573
msgctxt "abbreviated month name with day"
msgid "Oct"
msgstr "אוק"
-#: glib/gdatetime.c:569
+#: glib/gdatetime.c:575
msgctxt "abbreviated month name with day"
msgid "Nov"
msgstr "נוב"
-#: glib/gdatetime.c:571
+#: glib/gdatetime.c:577
msgctxt "abbreviated month name with day"
msgid "Dec"
msgstr "דצמ"
#. Translators: 'before midday' indicator
-#: glib/gdatetime.c:588
+#: glib/gdatetime.c:594
msgctxt "GDateTime"
msgid "AM"
msgstr "AM"
#. Translators: 'after midday' indicator
-#: glib/gdatetime.c:591
+#: glib/gdatetime.c:597
msgctxt "GDateTime"
msgid "PM"
msgstr "PM"
@@ -4771,8 +4905,10 @@ msgstr "Error opening directory “%s”: %s"
#, c-format
msgid "Could not allocate %lu byte to read file “%s”"
msgid_plural "Could not allocate %lu bytes to read file “%s”"
-msgstr[0] "Could not allocate %lu bytes to read file “%s”"
-msgstr[1] "Could not allocate %lu bytes to read file \"%s\""
+msgstr[0] "‫Could not allocate %lu byte to read file “%s”"
+msgstr[1] "‫Could not allocate %lu bytes to read file “%s”"
+msgstr[2] "‫Could not allocate %lu bytes to read file “%s”"
+msgstr[3] "‫Could not allocate %lu bytes to read file “%s”"
#: glib/gfileutils.c:754
#, c-format
@@ -4789,79 +4925,79 @@ msgstr "File “%s” is too large"
msgid "Failed to read from file “%s”: %s"
msgstr "Failed to read from file “%s”: %s"
-#: glib/gfileutils.c:902 glib/gfileutils.c:974 glib/gfileutils.c:1466
+#: glib/gfileutils.c:904 glib/gfileutils.c:979 glib/gfileutils.c:1468
#, c-format
msgid "Failed to open file “%s”: %s"
msgstr "Failed to open file “%s”: %s"
-#: glib/gfileutils.c:914
+#: glib/gfileutils.c:917
#, c-format
msgid "Failed to get attributes of file “%s”: fstat() failed: %s"
msgstr "Failed to get attributes of file “%s”: fstat() failed: %s"
-#: glib/gfileutils.c:944
+#: glib/gfileutils.c:948
#, c-format
msgid "Failed to open file “%s”: fdopen() failed: %s"
msgstr "Failed to open file “%s”: fdopen() failed: %s"
-#: glib/gfileutils.c:1044
+#: glib/gfileutils.c:1049
#, c-format
msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s"
msgstr "Failed to rename file “%s” to “%s”: g_rename() failed: %s"
-#: glib/gfileutils.c:1169
+#: glib/gfileutils.c:1175
#, c-format
msgid "Failed to write file “%s”: write() failed: %s"
msgstr "Failed to write file “%s”: write() failed: %s"
-#: glib/gfileutils.c:1189
+#: glib/gfileutils.c:1196
#, c-format
msgid "Failed to write file “%s”: fsync() failed: %s"
msgstr "Failed to write file “%s”: fsync() failed: %s"
-#: glib/gfileutils.c:1357 glib/gfileutils.c:1769
+#: glib/gfileutils.c:1357 glib/gfileutils.c:1772
#, c-format
msgid "Failed to create file “%s”: %s"
msgstr "Failed to create file “%s”: %s"
-#: glib/gfileutils.c:1401
+#: glib/gfileutils.c:1402
#, c-format
msgid "Existing file “%s” could not be removed: g_unlink() failed: %s"
msgstr "Existing file “%s” could not be removed: g_unlink() failed: %s"
-#: glib/gfileutils.c:1735
+#: glib/gfileutils.c:1737
#, c-format
msgid "Template “%s” invalid, should not contain a “%s”"
msgstr "Template “%s” invalid, should not contain a “%s”"
-#: glib/gfileutils.c:1748
+#: glib/gfileutils.c:1750
#, c-format
msgid "Template “%s” doesn’t contain XXXXXX"
msgstr "Template “%s” doesn’t contain XXXXXX"
-#: glib/gfileutils.c:2306 glib/gfileutils.c:2334
+#: glib/gfileutils.c:2310 glib/gfileutils.c:2339
#, c-format
msgid "Failed to read the symbolic link “%s”: %s"
msgstr "Failed to read the symbolic link “%s”: %s"
-#: glib/giochannel.c:1396
+#: glib/giochannel.c:1405
#, c-format
msgid "Could not open converter from “%s” to “%s”: %s"
msgstr "Could not open converter from “%s” to “%s”: %s"
-#: glib/giochannel.c:1749
+#: glib/giochannel.c:1758
msgid "Can’t do a raw read in g_io_channel_read_line_string"
msgstr "Can’t do a raw read in g_io_channel_read_line_string"
-#: glib/giochannel.c:1796 glib/giochannel.c:2054 glib/giochannel.c:2141
+#: glib/giochannel.c:1805 glib/giochannel.c:2063 glib/giochannel.c:2150
msgid "Leftover unconverted data in read buffer"
msgstr "Left over unconverted data in read buffer"
-#: glib/giochannel.c:1877 glib/giochannel.c:1954
+#: glib/giochannel.c:1886 glib/giochannel.c:1963
msgid "Channel terminates in a partial character"
msgstr "Channel terminates in a partial character"
-#: glib/giochannel.c:1940
+#: glib/giochannel.c:1949
msgid "Can’t do a raw read in g_io_channel_read_to_end"
msgstr "Can’t do a raw read in g_io_channel_read_to_end"
@@ -4873,57 +5009,57 @@ msgstr "Valid key file could not be found in search dirs"
msgid "Not a regular file"
msgstr "Not a regular file"
-#: glib/gkeyfile.c:1275
+#: glib/gkeyfile.c:1281
#, c-format
msgid ""
"Key file contains line “%s” which is not a key-value pair, group, or comment"
msgstr ""
"Key file contains line “%s” which is not a key-value pair, group, or comment"
-#: glib/gkeyfile.c:1332
+#: glib/gkeyfile.c:1338
#, c-format
msgid "Invalid group name: %s"
msgstr "Invalid group name: %s"
-#: glib/gkeyfile.c:1354
+#: glib/gkeyfile.c:1360
msgid "Key file does not start with a group"
msgstr "Key file does not start with a group"
-#: glib/gkeyfile.c:1380
+#: glib/gkeyfile.c:1386
#, c-format
msgid "Invalid key name: %s"
msgstr "Invalid key name: %s"
-#: glib/gkeyfile.c:1407
+#: glib/gkeyfile.c:1413
#, c-format
msgid "Key file contains unsupported encoding “%s”"
msgstr "Key file contains unsupported encoding “%s”"
-#: glib/gkeyfile.c:1650 glib/gkeyfile.c:1823 glib/gkeyfile.c:3276
-#: glib/gkeyfile.c:3340 glib/gkeyfile.c:3470 glib/gkeyfile.c:3602
-#: glib/gkeyfile.c:3748 glib/gkeyfile.c:3977 glib/gkeyfile.c:4044
+#: glib/gkeyfile.c:1662 glib/gkeyfile.c:1835 glib/gkeyfile.c:3288
+#: glib/gkeyfile.c:3352 glib/gkeyfile.c:3482 glib/gkeyfile.c:3614
+#: glib/gkeyfile.c:3760 glib/gkeyfile.c:3995 glib/gkeyfile.c:4062
#, c-format
msgid "Key file does not have group “%s”"
msgstr "Key file does not have group “%s”"
-#: glib/gkeyfile.c:1778
+#: glib/gkeyfile.c:1790
#, c-format
msgid "Key file does not have key “%s” in group “%s”"
msgstr "Key file does not have key “%s” in group “%s”"
-#: glib/gkeyfile.c:1940 glib/gkeyfile.c:2056
+#: glib/gkeyfile.c:1952 glib/gkeyfile.c:2068
#, c-format
msgid "Key file contains key “%s” with value “%s” which is not UTF-8"
msgstr "Key file contains key “%s” with value “%s” which is not UTF-8"
-#: glib/gkeyfile.c:1960 glib/gkeyfile.c:2076 glib/gkeyfile.c:2518
+#: glib/gkeyfile.c:1972 glib/gkeyfile.c:2088 glib/gkeyfile.c:2530
#, c-format
msgid ""
"Key file contains key “%s” which has a value that cannot be interpreted."
msgstr ""
"Key file contains key “%s” which has a value that cannot be interpreted."
-#: glib/gkeyfile.c:2736 glib/gkeyfile.c:3105
+#: glib/gkeyfile.c:2748 glib/gkeyfile.c:3117
#, c-format
msgid ""
"Key file contains key “%s” in group “%s” which has a value that cannot be "
@@ -4932,36 +5068,36 @@ msgstr ""
"Key file contains key “%s” in group “%s” which has a value that cannot be "
"interpreted."
-#: glib/gkeyfile.c:2814 glib/gkeyfile.c:2891
+#: glib/gkeyfile.c:2826 glib/gkeyfile.c:2903
#, c-format
msgid "Key “%s” in group “%s” has value “%s” where %s was expected"
msgstr "Key “%s” in group “%s” has value “%s” where %s was expected"
-#: glib/gkeyfile.c:4284
+#: glib/gkeyfile.c:4305
msgid "Key file contains escape character at end of line"
msgstr "Key file contains escape character at end of line"
-#: glib/gkeyfile.c:4306
+#: glib/gkeyfile.c:4327
#, c-format
msgid "Key file contains invalid escape sequence “%s”"
msgstr "Key file contains invalid escape sequence “%s”"
-#: glib/gkeyfile.c:4450
+#: glib/gkeyfile.c:4471
#, c-format
msgid "Value “%s” cannot be interpreted as a number."
msgstr "Value “%s” cannot be interpreted as a number."
-#: glib/gkeyfile.c:4464
+#: glib/gkeyfile.c:4485
#, c-format
msgid "Integer value “%s” out of range"
msgstr "Integer value “%s” out of range"
-#: glib/gkeyfile.c:4497
+#: glib/gkeyfile.c:4518
#, c-format
msgid "Value “%s” cannot be interpreted as a float number."
msgstr "Value “%s” cannot be interpreted as a float number."
-#: glib/gkeyfile.c:4536
+#: glib/gkeyfile.c:4557
#, c-format
msgid "Value “%s” cannot be interpreted as a boolean."
msgstr "Value “%s” cannot be interpreted as a boolean."
@@ -5246,12 +5382,12 @@ msgstr "Double value “%s” for %s out of range"
msgid "Error parsing option %s"
msgstr "Error parsing option %s"
-#: glib/goption.c:1570 glib/goption.c:1683
+#: glib/goption.c:1561 glib/goption.c:1674
#, c-format
msgid "Missing argument for %s"
msgstr "Missing·argument·for·%s"
-#: glib/goption.c:2194
+#: glib/goption.c:2185
#, c-format
msgid "Unknown option %s"
msgstr "Unknown option %s"
@@ -5645,82 +5781,82 @@ msgstr "Text ended before matching quote was found for %c. (The text was “%s
msgid "Text was empty (or contained only whitespace)"
msgstr "Text was empty (or contained only whitespace)"
-#: glib/gspawn.c:323
+#: glib/gspawn.c:308
#, c-format
msgid "Failed to read data from child process (%s)"
msgstr "Failed to read data from child process (%s)"
-#: glib/gspawn.c:468
+#: glib/gspawn.c:455
#, c-format
msgid "Unexpected error in reading data from a child process (%s)"
msgstr "Unexpected error in reading data from a child process (%s)"
-#: glib/gspawn.c:553
+#: glib/gspawn.c:540
#, c-format
msgid "Unexpected error in waitpid() (%s)"
msgstr "Unexpected error in waitpid() (%s)"
-#: glib/gspawn.c:1061 glib/gspawn-win32.c:1329
+#: glib/gspawn.c:1144 glib/gspawn-win32.c:1383
#, c-format
msgid "Child process exited with code %ld"
msgstr "Child process exited with code %ld"
-#: glib/gspawn.c:1069
+#: glib/gspawn.c:1152
#, c-format
msgid "Child process killed by signal %ld"
msgstr "Child process killed by signal %ld"
-#: glib/gspawn.c:1076
+#: glib/gspawn.c:1159
#, c-format
msgid "Child process stopped by signal %ld"
msgstr "Child process stopped by signal %ld"
-#: glib/gspawn.c:1083
+#: glib/gspawn.c:1166
#, c-format
msgid "Child process exited abnormally"
msgstr "Child process exited abnormally"
-#: glib/gspawn.c:1532 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358
+#: glib/gspawn.c:1757 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358
#, c-format
msgid "Failed to read from child pipe (%s)"
msgstr "Failed to read from child pipe (%s)"
-#: glib/gspawn.c:1788
+#: glib/gspawn.c:2059
#, c-format
msgid "Failed to spawn child process “%s” (%s)"
msgstr "Failed to spawn child process “%s” (%s)"
-#: glib/gspawn.c:1871
+#: glib/gspawn.c:2176
#, c-format
msgid "Failed to fork (%s)"
msgstr "Failed to fork (%s)"
-#: glib/gspawn.c:2026 glib/gspawn-win32.c:381
+#: glib/gspawn.c:2336 glib/gspawn-win32.c:381
#, c-format
msgid "Failed to change to directory “%s” (%s)"
msgstr "Failed to change to directory “%s” (%s)"
-#: glib/gspawn.c:2036
+#: glib/gspawn.c:2346
#, c-format
msgid "Failed to execute child process “%s” (%s)"
msgstr "Failed to execute child process “%s” (%s)"
-#: glib/gspawn.c:2046
+#: glib/gspawn.c:2356
#, c-format
msgid "Failed to redirect output or input of child process (%s)"
msgstr "Failed to redirect output or input of child process (%s)"
-#: glib/gspawn.c:2055
+#: glib/gspawn.c:2365
#, c-format
msgid "Failed to fork child process (%s)"
msgstr "Failed to fork child process (%s)"
-#: glib/gspawn.c:2063
+#: glib/gspawn.c:2373
#, c-format
msgid "Unknown error executing child process “%s”"
msgstr "Unknown error executing child process “%s”"
-#: glib/gspawn.c:2087
+#: glib/gspawn.c:2397
#, c-format
msgid "Failed to read enough data from child pid pipe (%s)"
msgstr "Failed to read enough data from child pid pipe (%s)"
@@ -5744,27 +5880,27 @@ msgstr "Failed to execute child process (%s)"
msgid "Invalid program name: %s"
msgstr "Invalid program name: %s"
-#: glib/gspawn-win32.c:471 glib/gspawn-win32.c:725
+#: glib/gspawn-win32.c:471 glib/gspawn-win32.c:757
#, c-format
msgid "Invalid string in argument vector at %d: %s"
msgstr "Invalid string in argument vector at %d: %s"
-#: glib/gspawn-win32.c:482 glib/gspawn-win32.c:740
+#: glib/gspawn-win32.c:482 glib/gspawn-win32.c:772
#, c-format
msgid "Invalid string in environment: %s"
msgstr "Invalid string in environment: %s"
-#: glib/gspawn-win32.c:721
+#: glib/gspawn-win32.c:753
#, c-format
msgid "Invalid working directory: %s"
msgstr "Invalid working directory: %s"
-#: glib/gspawn-win32.c:783
+#: glib/gspawn-win32.c:815
#, c-format
msgid "Failed to execute helper program (%s)"
msgstr "Failed to execute helper program (%s)"
-#: glib/gspawn-win32.c:1056
+#: glib/gspawn-win32.c:1042
msgid ""
"Unexpected error in g_io_channel_win32_poll() reading data from a child "
"process"
@@ -5772,77 +5908,79 @@ msgstr ""
"Unexpected error in g_io_channel_win32_poll() reading data from a child "
"process"
-#: glib/gstrfuncs.c:3303 glib/gstrfuncs.c:3405
+#: glib/gstrfuncs.c:3338 glib/gstrfuncs.c:3440
msgid "Empty string is not a number"
msgstr "Empty string is not a number"
-#: glib/gstrfuncs.c:3327
+#: glib/gstrfuncs.c:3362
#, c-format
msgid "“%s” is not a signed number"
msgstr "“%s” is not a signed number"
-#: glib/gstrfuncs.c:3337 glib/gstrfuncs.c:3441
+#: glib/gstrfuncs.c:3372 glib/gstrfuncs.c:3476
#, c-format
msgid "Number “%s” is out of bounds [%s, %s]"
msgstr "Number “%s” is out of bounds [%s, %s]"
-#: glib/gstrfuncs.c:3431
+#: glib/gstrfuncs.c:3466
#, c-format
msgid "“%s” is not an unsigned number"
msgstr "“%s” is not an unsigned number"
-#: glib/guri.c:313
+#: glib/guri.c:315
#, no-c-format
-#| msgid " (invalid encoding)"
msgid "Invalid %-encoding in URI"
msgstr "Invalid %-encoding in URI"
-#: glib/guri.c:330
+#: glib/guri.c:332
msgid "Illegal character in URI"
msgstr "Illegal character in URI"
-#: glib/guri.c:359
+#: glib/guri.c:366
msgid "Non-UTF-8 characters in URI"
msgstr "Non-UTF-8 characters in URI"
-#: glib/guri.c:462
+#: glib/guri.c:546
#, c-format
msgid "Invalid IPv6 address ‘%.*s’ in URI"
msgstr "Invalid IPv6 address ‘%.*s’ in URI"
-#: glib/guri.c:524
+#: glib/guri.c:601
#, c-format
msgid "Illegal encoded IP address ‘%.*s’ in URI"
msgstr "Illegal encoded IP address ‘%.*s’ in URI"
-#: glib/guri.c:558 glib/guri.c:570
+#: glib/guri.c:613
+#, c-format
+#| msgid "Illegal encoded IP address ‘%.*s’ in URI"
+msgid "Illegal internationalized hostname ‘%.*s’ in URI"
+msgstr "Illegal internationalized hostname ‘%.*s’ in URI"
+
+#: glib/guri.c:645 glib/guri.c:657
#, c-format
-#| msgid "Could not parse “%s” as IP address mask"
msgid "Could not parse port ‘%.*s’ in URI"
msgstr "Could not parse port ‘%.*s’ in URI"
-#: glib/guri.c:577
+#: glib/guri.c:664
#, c-format
-#| msgid "Double value “%s” for %s out of range"
msgid "Port ‘%.*s’ in URI is out of range"
msgstr "Port ‘%.*s’ in URI is out of range"
-#: glib/guri.c:1055 glib/guri.c:1119
+#: glib/guri.c:1224 glib/guri.c:1288
#, c-format
-#| msgid "The pathname “%s” is not an absolute path"
msgid "URI ‘%s’ is not an absolute URI"
msgstr "URI ‘%s’ is not an absolute URI"
-#: glib/guri.c:1061
+#: glib/guri.c:1230
#, c-format
msgid "URI ‘%s’ has no host component"
msgstr "URI ‘%s’ has no host component"
-#: glib/guri.c:1263
+#: glib/guri.c:1435
msgid "URI is not absolute, and no base URI was provided"
msgstr "URI is not absolute, and no base URI was provided"
-#: glib/guri.c:2019
+#: glib/guri.c:2209
msgid "Missing ‘=’ and parameter value"
msgstr "Missing ‘=’ and parameter value"
@@ -5864,596 +6002,218 @@ msgid "Character out of range for UTF-16"
msgstr "Character out of range for UTF-16"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2756
+#: glib/gutils.c:2767
#, c-format
msgid "%.1f kB"
msgstr "%.1f ק״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2758
+#: glib/gutils.c:2769
#, c-format
msgid "%.1f MB"
msgstr "%.1f מ״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2760
+#: glib/gutils.c:2771
#, c-format
msgid "%.1f GB"
msgstr "%.1f ג״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2762
+#: glib/gutils.c:2773
#, c-format
msgid "%.1f TB"
msgstr "%.1f ט״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2764
+#: glib/gutils.c:2775
#, c-format
msgid "%.1f PB"
msgstr "%.1f פ״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2766
+#: glib/gutils.c:2777
#, c-format
msgid "%.1f EB"
msgstr "%.1f א״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2770
+#: glib/gutils.c:2781
#, c-format
msgid "%.1f KiB"
msgstr "%.1f קי״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2772
+#: glib/gutils.c:2783
#, c-format
msgid "%.1f MiB"
msgstr "%.1f מבי״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2774
+#: glib/gutils.c:2785
#, c-format
msgid "%.1f GiB"
msgstr "%.1f גיב״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2776
+#: glib/gutils.c:2787
#, c-format
msgid "%.1f TiB"
msgstr "%.1f טבי״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2778
+#: glib/gutils.c:2789
#, c-format
msgid "%.1f PiB"
msgstr "%.1f פבי״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2780
+#: glib/gutils.c:2791
#, c-format
msgid "%.1f EiB"
msgstr "%.1f אק״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2784
+#: glib/gutils.c:2795
#, c-format
msgid "%.1f kb"
msgstr "%.1f ק״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2786
+#: glib/gutils.c:2797
#, c-format
msgid "%.1f Mb"
msgstr "%.1f מ״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2788
+#: glib/gutils.c:2799
#, c-format
msgid "%.1f Gb"
msgstr "%.1f ג״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2790
+#: glib/gutils.c:2801
#, c-format
msgid "%.1f Tb"
msgstr "%.1f ט״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2792
+#: glib/gutils.c:2803
#, c-format
msgid "%.1f Pb"
msgstr "%.1f פ״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2794
+#: glib/gutils.c:2805
#, c-format
msgid "%.1f Eb"
msgstr "%.1f א״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2798
+#: glib/gutils.c:2809
#, c-format
msgid "%.1f Kib"
msgstr "%.1f ק״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2800
+#: glib/gutils.c:2811
#, c-format
msgid "%.1f Mib"
msgstr "%.1f מ״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2802
+#: glib/gutils.c:2813
#, c-format
msgid "%.1f Gib"
msgstr "%.1f ג״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2804
+#: glib/gutils.c:2815
#, c-format
msgid "%.1f Tib"
msgstr "%.1f ט״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2806
+#: glib/gutils.c:2817
#, c-format
msgid "%.1f Pib"
msgstr "%.1f פ״ב"
#. Translators: Keep the no-break space between %.1f and the unit symbol
-#: glib/gutils.c:2808
+#: glib/gutils.c:2819
#, c-format
msgid "%.1f Eib"
msgstr "%.1f א״ב"
-#: glib/gutils.c:2842 glib/gutils.c:2959
+#: glib/gutils.c:2853 glib/gutils.c:2970
#, c-format
msgid "%u byte"
msgid_plural "%u bytes"
msgstr[0] "בית אחד"
-msgstr[1] "%u בתים"
+msgstr[1] "שני בתים"
+msgstr[2] "‫%u בתים"
+msgstr[3] "‫%u בתים"
-#: glib/gutils.c:2846
+#: glib/gutils.c:2857
#, c-format
msgid "%u bit"
msgid_plural "%u bits"
msgstr[0] "סיבית אחת"
-msgstr[1] "%u סיביות"
+msgstr[1] "שתי סיביות"
+msgstr[2] "‫%u סיביות"
+msgstr[3] "‫%u סיביות"
#. Translators: the %s in "%s bytes" will always be replaced by a number.
-#: glib/gutils.c:2913
+#: glib/gutils.c:2924
#, c-format
msgid "%s byte"
msgid_plural "%s bytes"
msgstr[0] "בית אחד"
-msgstr[1] "%s בתים"
+msgstr[1] "שני בתים"
+msgstr[2] "‫%s בתים"
+msgstr[3] "‫%s בתים"
#. Translators: the %s in "%s bits" will always be replaced by a number.
-#: glib/gutils.c:2918
+#: glib/gutils.c:2929
#, c-format
msgid "%s bit"
msgid_plural "%s bits"
msgstr[0] "סיבית אחת"
-msgstr[1] "%s סיביות"
+msgstr[1] "שתי סיביות"
+msgstr[2] "‫%s סיביות"
+msgstr[3] "‫%s סיביות"
#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to
#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of
#. * compatibility. Users will not see this string unless a program is using this deprecated function.
#. * Please translate as literally as possible.
#.
-#: glib/gutils.c:2972
+#: glib/gutils.c:2983
#, c-format
msgid "%.1f KB"
msgstr "%.1f ק״ב"
-#: glib/gutils.c:2977
+#: glib/gutils.c:2988
#, c-format
msgid "%.1f MB"
msgstr "%.1f מ״ב"
-#: glib/gutils.c:2982
+#: glib/gutils.c:2993
#, c-format
msgid "%.1f GB"
msgstr "%.1f ג״ב"
-#: glib/gutils.c:2987
+#: glib/gutils.c:2998
#, c-format
msgid "%.1f TB"
msgstr "%.1f ט״ב"
-#: glib/gutils.c:2992
+#: glib/gutils.c:3003
#, c-format
msgid "%.1f PB"
msgstr "%.1f פ״ב"
-#: glib/gutils.c:2997
+#: glib/gutils.c:3008
#, c-format
msgid "%.1f EB"
msgstr "%.1f א״ב"
-
-#~ msgid "Error in address “%s” — the family attribute is malformed"
-#~ msgstr "Error in address “%s” — the family attribute is malformed"
-
-#~ msgid "No such method '%s'"
-#~ msgstr "No such method '%s'"
-
-#~ msgid ""
-#~ "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment "
-#~ "variable - unknown value '%s'"
-#~ msgstr ""
-#~ "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment "
-#~ "variable - unknown value '%s'"
-
-#~ msgid ""
-#~ "Message has %d file descriptors but the header field indicates %d file "
-#~ "descriptors"
-#~ msgstr ""
-#~ "Message has %d file descriptors but the header field indicates %d file "
-#~ "descriptors"
-
-#~ msgid "[ARGS...]"
-#~ msgstr "[ARGS...]"
-
-#~ msgid "Mounted %s at %s\n"
-#~ msgstr "Mounted %s at %s\n"
-
-#~ msgid "Failed to create temp file: %s"
-#~ msgstr "Failed to create temp file: %s"
-
-#~ msgid "; ignoring override for this key.\n"
-#~ msgstr "; ignoring override for this key.\n"
-
-#~ msgid " and --strict was specified; exiting.\n"
-#~ msgstr " and --strict was specified; exiting.\n"
-
-#~ msgid "Ignoring override for this key.\n"
-#~ msgstr "Ignoring override for this key.\n"
-
-#~ msgid "doing nothing.\n"
-#~ msgstr "doing nothing.\n"
-
-#~ msgid "Error: object path not specified.\n"
-#~ msgstr "Error: object path not specified.\n"
-
-#~ msgid "Error: signal not specified.\n"
-#~ msgstr "Error: signal not specified.\n"
-
-#~ msgid "Error: signal must be the fully-qualified name.\n"
-#~ msgstr "Error: signal must be the fully-qualified name.\n"
-
-#~ msgid "No files given"
-#~ msgstr "No files given"
-
-#~ msgid "Error getting writable attributes: %s\n"
-#~ msgstr "Error getting writable attributes: %s\n"
-
-#~ msgid "Error mounting location: %s\n"
-#~ msgstr "Error mounting location: %s\n"
-
-#~ msgid "Error unmounting mount: %s\n"
-#~ msgstr "Error unmounting mount: %s\n"
-
-#~ msgid "Error finding enclosing mount: %s\n"
-#~ msgstr "Error finding enclosing mount: %s\n"
-
-#~ msgid "Error ejecting mount: %s\n"
-#~ msgstr "Error ejecting mount: %s\n"
-
-#~ msgid "Error mounting %s: %s\n"
-#~ msgstr "Error mounting %s: %s\n"
-
-#~ msgid "No files to open"
-#~ msgstr "No files to open"
-
-#~ msgid "No files to delete"
-#~ msgstr "No files to delete"
-
-#~ msgid "Error setting attribute: %s\n"
-#~ msgstr "Error setting attribute: %s\n"
-
-#~ msgid "No such interface"
-#~ msgstr "No such interface"
-
-#~ msgid "Error creating directory '%s': %s"
-#~ msgstr "Error creating directory '%s': %s"
-
-#~ msgid "Error opening file '%s': %s"
-#~ msgstr "Error opening file '%s': %s"
-
-#~ msgid "Error reading file '%s': %s"
-#~ msgstr "Error reading file '%s': %s"
-
-#~ msgid "No locations gives"
-#~ msgstr "No locations gives"
-
-#~ msgid "Error renaming file: %s"
-#~ msgstr "Error renaming file: %s"
-
-#~ msgid "Can't open directory"
-#~ msgstr "Can't open directory"
-
-#~ msgid "Error opening file: %s"
-#~ msgstr "Error opening file: %s"
-
-#~ msgid "Error creating directory: %s"
-#~ msgstr "Error creating directory: %s"
-
-#~ msgid "association changes not supported on win32"
-#~ msgstr "association changes not supported on win32"
-
-#~ msgid "Association creation not supported on win32"
-#~ msgstr "Association creation not supported on win32"
-
-#~ msgid "Unable to find default local directory monitor type"
-#~ msgstr "Unable to find default local directory monitor type"
-
-#~ msgid "URIs not supported"
-#~ msgstr "URIs not supported"
-
-#~ msgid "Key file does not have key '%s'"
-#~ msgstr "Key file does not have key '%s'"
-
-#~ msgid ""
-#~ "Error processing input file with xmllint:\n"
-#~ "%s"
-#~ msgstr ""
-#~ "Error processing input file with xmllint:\n"
-#~ "%s"
-
-#~ msgid ""
-#~ "Error processing input file with to-pixdata:\n"
-#~ "%s"
-#~ msgstr ""
-#~ "Error processing input file with to-pixdata:\n"
-#~ "%s"
-
-#~ msgid "Unable to get pending error: %s"
-#~ msgstr "Unable to get pending error: %s"
-
-#~ msgid "Failed to open file '%s' for writing: fdopen() failed: %s"
-#~ msgstr "Failed to open file '%s' for writing: fdopen() failed: %s"
-
-#~ msgid "Failed to write file '%s': fflush() failed: %s"
-#~ msgstr "Failed to write file '%s': fflush() failed: %s"
-
-#~ msgid "Failed to close file '%s': fclose() failed: %s"
-#~ msgstr "Failed to close file '%s': fclose() failed: %s"
-
-#~ msgid "Incomplete data received for '%s'"
-#~ msgstr "Incomplete data received for '%s'"
-
-#~ msgid ""
-#~ "Unexpected option length while checking if SO_PASSCRED is enabled for "
-#~ "socket. Expected %d bytes, got %d"
-#~ msgstr ""
-#~ "Unexpected option length while checking if SO_PASSCRED is enabled for "
-#~ "socket. Expected %d bytes, got %d"
-
-#~ msgid "Abnormal program termination spawning command line '%s': %s"
-#~ msgstr "Abnormal program termination spawning command line '%s': %s"
-
-#~ msgid "Command line '%s' exited with non-zero exit status %d: %s"
-#~ msgstr "Command line '%s' exited with non-zero exit status %d: %s"
-
-#~ msgid "workspace limit for empty substrings reached"
-#~ msgstr "workspace limit for empty substrings reached"
-
-#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here"
-#~ msgstr "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here"
-
-#~ msgid "repeating a DEFINE group is not allowed"
-#~ msgstr "repeating a DEFINE group is not allowed"
-
-#~ msgid "No service record for '%s'"
-#~ msgstr "No service record for '%s'"
-
-#~ msgid "Error connecting: "
-#~ msgstr "Error connecting: "
-
-#~ msgid "Error connecting: %s"
-#~ msgstr "Error connecting: %s"
-
-#~ msgid "Error reading from unix: %s"
-#~ msgstr "Error reading from unix: %s"
-
-#~ msgid "Error writing to unix: %s"
-#~ msgstr "Error writing to unix: %s"
-
-#~ msgid "File is empty"
-#~ msgstr "File is empty"
-
-#~ msgid ""
-#~ "Key file contains key '%s' which has value that cannot be interpreted."
-#~ msgstr ""
-#~ "Key file contains key '%s' which has value that cannot be interpreted."
-
-#~ msgid "This option will be removed soon."
-#~ msgstr "This option will be removed soon."
-
-#~ msgid "Error stating file '%s': %s"
-#~ msgstr "Error stating file '%s': %s"
-
-#~ msgid "SOCKSv4 implementation limits username to %i characters"
-#~ msgstr "SOCKSv4 implementation limits username to %i characters"
-
-#~ msgid "SOCKSv4a implementation limits hostname to %i characters"
-#~ msgstr "SOCKSv4a implementation limits hostname to %i characters"
-
-#~ msgctxt "GDateTime"
-#~ msgid "am"
-#~ msgstr "am"
-
-#~ msgctxt "GDateTime"
-#~ msgid "pm"
-#~ msgstr "pm"
-
-#~ msgid "Failed to set value\n"
-#~ msgstr "Failed to set value\n"
-
-#~ msgid "Type of return value is incorrect, got '%s', expected '%s'"
-#~ msgstr "Type of return value is incorrect, got '%s', expected '%s'"
-
-#~ msgid ""
-#~ "Trying to set property %s of type %s but according to the expected "
-#~ "interface the type is %s"
-#~ msgstr ""
-#~ "Trying to set property %s of type %s but according to the expected "
-#~ "interface the type is %s"
-
-#~ msgid "No such schema '%s' specified in override file '%s'"
-#~ msgstr "No such schema '%s' specified in override file '%s'"
-
-#~ msgid ""
-#~ "Commands:\n"
-#~ " help Show this information\n"
-#~ " get Get the value of a key\n"
-#~ " set Set the value of a key\n"
-#~ " reset Reset the value of a key\n"
-#~ " monitor Monitor a key for changes\n"
-#~ " writable Check if a key is writable\n"
-#~ "\n"
-#~ "Use '%s COMMAND --help' to get help for individual commands.\n"
-#~ msgstr ""
-#~ "Commands:\n"
-#~ " help Show this information\n"
-#~ " get Get the value of a key\n"
-#~ " set Set the value of a key\n"
-#~ " reset Reset the value of a key\n"
-#~ " monitor Monitor a key for changes\n"
-#~ " writable Check if a key is writable\n"
-#~ "\n"
-#~ "Use '%s COMMAND --help' to get help for individual commands.\n"
-
-#~ msgid "Specify the path for the schema"
-#~ msgstr "Specify the path for the schema"
-
-#~ msgid ""
-#~ "Arguments:\n"
-#~ " SCHEMA The id of the schema\n"
-#~ " KEY The name of the key\n"
-#~ " VALUE The value to set key to, as a serialized GVariant\n"
-#~ msgstr ""
-#~ "Arguments:\n"
-#~ " SCHEMA The id of the schema\n"
-#~ " KEY The name of the key\n"
-#~ " VALUE The value to set key to, as a serialized GVariant\n"
-
-#~ msgid ""
-#~ "Monitor KEY for changes and print the changed values.\n"
-#~ "Monitoring will continue until the process is terminated."
-#~ msgstr ""
-#~ "Monitor KEY for changes and print the changed values.\n"
-#~ "Monitoring will continue until the process is terminated."
-
-#~ msgid "Error writing first 16 bytes of message to socket: "
-#~ msgstr "Error writing first 16 bytes of message to socket: "
-
-#~ msgid "The nonce-file '%s' was %lu bytes. Expected 16 bytes."
-#~ msgstr "The nonce-file '%s' was %lu bytes. Expected 16 bytes."
-
-#~ msgid "Encountered array of length %"
-#~ msgstr "Encountered array of length %"
-
-#~ msgid "Do not give error for empty directory"
-#~ msgstr "Can't move directory over directory"
-
-#~ msgid "Invalid UTF-8 sequence in input"
-#~ msgstr "Invalid sequence in conversion input"
-
-#~ msgid "Reached maximum data array limit"
-#~ msgstr "Reached maximum data array limit"
-
-#~ msgid "do not hide entries"
-#~ msgstr "do not hide entries"
-
-#~ msgid ""
-#~ "Character '%s' is not valid at the start of an entity name; the & "
-#~ "character begins an entity; if this ampersand isn't supposed to be an "
-#~ "entity, escape it as &amp;"
-#~ msgstr ""
-#~ "Character '%s' is not valid at the start of an entity name; the & "
-#~ "character begins an entity; if this ampersand isn't supposed to be an "
-#~ "entity, escape it as &amp;"
-
-#~ msgid "Character '%s' is not valid inside an entity name"
-#~ msgstr "Character '%s' is not valid inside an entity name"
-
-#~ msgid "Empty character reference; should include a digit such as &#454;"
-#~ msgstr "Empty character reference; should include a digit such as &#454;"
-
-#~ msgid "Unfinished entity reference"
-#~ msgstr "Unfinished entity reference"
-
-#~ msgid "Unfinished character reference"
-#~ msgstr "Unfinished character reference"
-
-#~ msgid "Invalid UTF-8 encoded text - overlong sequence"
-#~ msgstr "Invalid UTF-8 encoded text - overlong sequence"
-
-#~ msgid "Invalid UTF-8 encoded text - not a start char"
-#~ msgstr "Invalid UTF-8 encoded text - not a start char"
-
-#~ msgid "file"
-#~ msgstr "file"
-
-#~ msgid "The file containing the icon"
-#~ msgstr "The file containing the icon"
-
-#~ msgid "An array containing the icon names"
-#~ msgstr "An array containing the icon names"
-
-#~ msgid ""
-#~ "Whether to use default fallbacks found by shortening the name at '-' "
-#~ "characters. Ignores names after the first if multiple names are given."
-#~ msgstr ""
-#~ "Whether to use default fallbacks found by shortening the name at '-' "
-#~ "characters. Ignores names after the first if multiple names are given."
-
-#~ msgid "File descriptor"
-#~ msgstr "File descriptor"
-
-#~ msgid "The file descriptor to read from"
-#~ msgstr "The file descriptor to read from"
-
-#~ msgid "Close file descriptor"
-#~ msgstr "Close file descriptor"
-
-#~ msgid "Whether to close the file descriptor when the stream is closed"
-#~ msgstr "Whether to close the file descriptor when the stream is closed"
-
-#~ msgid "Can't load just created desktop file"
-#~ msgstr "Can't load just created desktop file"
-
-#~ msgid "Error creating backup link: %s"
-#~ msgstr "Error creating backup link: %s"
-
-#~ msgid "Too large count value passed to g_input_stream_read_async"
-#~ msgstr "Too large count value passed to g_input_stream_read_async"
-
-#~ msgid "Too large count value passed to g_input_stream_skip"
-#~ msgstr "Too large count value passed to g_input_stream_skip"
-
-#~ msgid "Too large count value passed to g_input_stream_skip_async"
-#~ msgstr "Too large count value passed to g_input_stream_skip_async"
-
-#~ msgid "Target file already exists"
-#~ msgstr "Target file already exists"
-
-#~ msgid "Too large count value passed to g_output_stream_write"
-#~ msgstr "Too large count value passed to g_output_stream_write"
-
-#~ msgid "Too large count value passed to g_output_stream_write_async"
-#~ msgstr "Too large count value passed to g_output_stream_write_async"
-
-#~ msgid "Could not change file mode: fork() failed: %s"
-#~ msgstr "Could not change file mode: fork() failed: %s"
-
-#~ msgid "Could not change file mode: chmod() failed: %s"
-#~ msgstr "Could not change file mode: chmod() failed: %s"
-
-#~ msgid "Could not change file mode: Child terminated by signal: %s"
-#~ msgstr "Could not change file mode: Child terminated by signal: %s"
-
-#~ msgid "Could not change file mode: Child terminated abnormally"
-#~ msgstr "Could not change file mode: Child terminated abnormally"
diff --git a/subprojects/gtk-doc.wrap b/subprojects/gtk-doc.wrap
index 79ec37220..0490a03a1 100644
--- a/subprojects/gtk-doc.wrap
+++ b/subprojects/gtk-doc.wrap
@@ -1,5 +1,5 @@
[wrap-git]
directory=gtk-doc
url=https://gitlab.gnome.org/GNOME/gtk-doc.git
-revision=master
+revision=1.33.2
depth=1
diff --git a/tests/gobject/references.c b/tests/gobject/references.c
index 8c1266042..36ff35c63 100644
--- a/tests/gobject/references.c
+++ b/tests/gobject/references.c
@@ -256,7 +256,8 @@ main (int argc,
g_assert (object_destroyed == FALSE);
clear_flags ();
- g_object_remove_toggle_ref (object, toggle_ref2, GUINT_TO_POINTER (24));
+ /* Check that removing a toggle ref with %NULL data works fine. */
+ g_object_remove_toggle_ref (object, toggle_ref2, NULL);
g_assert (toggle_ref1_weakened == FALSE);
g_assert (toggle_ref1_strengthened == FALSE);
g_assert (toggle_ref2_weakened == FALSE);
diff --git a/tests/slice-threadinit.c b/tests/slice-threadinit.c
index 30b186147..e303aa0b2 100644
--- a/tests/slice-threadinit.c
+++ b/tests/slice-threadinit.c
@@ -31,7 +31,7 @@
static struct {
void *page;
void *sample;
-} pages[N_PAGES] = { { NULL, }, };
+} pages[N_PAGES] = { { NULL, NULL }, };
static const guint magazine_probes[] = MAGAZINE_PROBES;
#define N_MAGAZINE_PROBES G_N_ELEMENTS (magazine_probes)