diff options
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 @@ -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", ¬_valid_before, NULL); + + return g_steal_pointer (¬_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", ¬_valid_after, NULL); + + return g_steal_pointer (¬_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(); @@ -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> @@ -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; } @@ -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 &" -#~ 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 &" - -#~ 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 dž" -#~ msgstr "Empty character reference; should include a digit such as dž" - -#~ 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) |