X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgdbusmethodinvocation.c;h=5bd850b095a4852a07558ebb8d30a6c4f342dafa;hb=634b69219979c084837c59874e5b2aec01a1d3e4;hp=404652e3d1bb1f826156d9f447cbbef5c55aa9e6;hpb=6223341cacc7dfa34a8d60ec1b4828382dee6d07;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gdbusmethodinvocation.c b/gio/gdbusmethodinvocation.c index 404652e..5bd850b 100644 --- a/gio/gdbusmethodinvocation.c +++ b/gio/gdbusmethodinvocation.c @@ -13,9 +13,7 @@ * 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, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. + * Public License along with this library; if not, see . * * Author: David Zeuthen */ @@ -32,8 +30,11 @@ #include "gdbuserror.h" #include "gdbusprivate.h" +#ifdef G_OS_UNIX +#include "gunixfdlist.h" +#endif + #include "glibintl.h" -#include "gioalias.h" /** * SECTION:gdbusmethodinvocation @@ -49,14 +50,41 @@ * #GDBusInterfaceVTable that was passed to g_dbus_connection_register_object(). */ -struct _GDBusMethodInvocationPrivate +typedef struct _GDBusMethodInvocationClass GDBusMethodInvocationClass; + +/** + * GDBusMethodInvocationClass: + * + * Class structure for #GDBusMethodInvocation. + * + * Since: 2.26 + */ +struct _GDBusMethodInvocationClass +{ + /*< private >*/ + GObjectClass parent_class; +}; + +/** + * GDBusMethodInvocation: + * + * The #GDBusMethodInvocation structure contains only private data and + * should only be accessed using the provided API. + * + * Since: 2.26 + */ +struct _GDBusMethodInvocation { + /*< private >*/ + GObject parent_instance; + /* construct-only properties */ gchar *sender; gchar *object_path; gchar *interface_name; gchar *method_name; - const GDBusMethodInfo *method_info; + GDBusMethodInfo *method_info; + GDBusPropertyInfo *property_info; GDBusConnection *connection; GDBusMessage *message; GVariant *parameters; @@ -70,13 +98,15 @@ g_dbus_method_invocation_finalize (GObject *object) { GDBusMethodInvocation *invocation = G_DBUS_METHOD_INVOCATION (object); - g_free (invocation->priv->sender); - g_free (invocation->priv->object_path); - g_free (invocation->priv->interface_name); - g_free (invocation->priv->method_name); - g_object_unref (invocation->priv->connection); - g_object_unref (invocation->priv->message); - g_variant_unref (invocation->priv->parameters); + g_free (invocation->sender); + g_free (invocation->object_path); + g_free (invocation->interface_name); + g_free (invocation->method_name); + if (invocation->method_info) + g_dbus_method_info_unref (invocation->method_info); + g_object_unref (invocation->connection); + g_object_unref (invocation->message); + g_variant_unref (invocation->parameters); G_OBJECT_CLASS (g_dbus_method_invocation_parent_class)->finalize (object); } @@ -87,16 +117,11 @@ g_dbus_method_invocation_class_init (GDBusMethodInvocationClass *klass) GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = g_dbus_method_invocation_finalize; - - g_type_class_add_private (klass, sizeof (GDBusMethodInvocationPrivate)); } static void g_dbus_method_invocation_init (GDBusMethodInvocation *invocation) { - invocation->priv = G_TYPE_INSTANCE_GET_PRIVATE (invocation, - G_TYPE_DBUS_METHOD_INVOCATION, - GDBusMethodInvocationPrivate); } /** @@ -113,7 +138,7 @@ const gchar * g_dbus_method_invocation_get_sender (GDBusMethodInvocation *invocation) { g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); - return invocation->priv->sender; + return invocation->sender; } /** @@ -130,7 +155,7 @@ const gchar * g_dbus_method_invocation_get_object_path (GDBusMethodInvocation *invocation) { g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); - return invocation->priv->object_path; + return invocation->object_path; } /** @@ -139,6 +164,11 @@ g_dbus_method_invocation_get_object_path (GDBusMethodInvocation *invocation) * * Gets the name of the D-Bus interface the method was invoked on. * + * If this method call is a property Get, Set or GetAll call that has + * been redirected to the method call handler then + * "org.freedesktop.DBus.Properties" will be returned. See + * #GDBusInterfaceVTable for more information. + * * Returns: A string. Do not free, it is owned by @invocation. * * Since: 2.26 @@ -147,7 +177,7 @@ const gchar * g_dbus_method_invocation_get_interface_name (GDBusMethodInvocation *invocation) { g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); - return invocation->priv->interface_name; + return invocation->interface_name; } /** @@ -156,6 +186,11 @@ g_dbus_method_invocation_get_interface_name (GDBusMethodInvocation *invocation) * * Gets information about the method call, if any. * + * If this method invocation is a property Get, Set or GetAll call that + * has been redirected to the method call handler then %NULL will be + * returned. See g_dbus_method_invocation_get_property_info() and + * #GDBusInterfaceVTable for more information. + * * Returns: A #GDBusMethodInfo or %NULL. Do not free, it is owned by @invocation. * * Since: 2.26 @@ -164,7 +199,34 @@ const GDBusMethodInfo * g_dbus_method_invocation_get_method_info (GDBusMethodInvocation *invocation) { g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); - return invocation->priv->method_info; + return invocation->method_info; +} + +/** + * g_dbus_method_invocation_get_property_info: + * @invocation: A #GDBusMethodInvocation + * + * Gets information about the property that this method call is for, if + * any. + * + * This will only be set in the case of an invocation in response to a + * property Get or Set call that has been directed to the method call + * handler for an object on account of its property_get() or + * property_set() vtable pointers being unset. + * + * See #GDBusInterfaceVTable for more information. + * + * If the call was GetAll, %NULL will be returned. + * + * Returns: (transfer none): a #GDBusPropertyInfo or %NULL + * + * Since: 2.38 + */ +const GDBusPropertyInfo * +g_dbus_method_invocation_get_property_info (GDBusMethodInvocation *invocation) +{ + g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); + return invocation->property_info; } /** @@ -181,7 +243,7 @@ const gchar * g_dbus_method_invocation_get_method_name (GDBusMethodInvocation *invocation) { g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); - return invocation->priv->method_name; + return invocation->method_name; } /** @@ -190,7 +252,7 @@ g_dbus_method_invocation_get_method_name (GDBusMethodInvocation *invocation) * * Gets the #GDBusConnection the method was invoked on. * - * Returns: A #GDBusConnection. Do not free, it is owned by @invocation. + * Returns: (transfer none):A #GDBusConnection. Do not free, it is owned by @invocation. * * Since: 2.26 */ @@ -198,7 +260,7 @@ GDBusConnection * g_dbus_method_invocation_get_connection (GDBusMethodInvocation *invocation) { g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); - return invocation->priv->connection; + return invocation->connection; } /** @@ -210,11 +272,11 @@ g_dbus_method_invocation_get_connection (GDBusMethodInvocation *invocation) * descriptor passing, that cannot be properly expressed in the * #GVariant API. * - * See and for an example of how to use this - * low-level API to send and receive UNIX file descriptors. + * See this [server][gdbus-server] and [client][gdbus-unix-fd-client] + * for an example of how to use this low-level API to send and receive + * UNIX file descriptors. * - * Returns: A #GDBusMessage. Do not free, it is owned by @invocation. + * Returns: (transfer none): #GDBusMessage. Do not free, it is owned by @invocation. * * Since: 2.26 */ @@ -222,16 +284,17 @@ GDBusMessage * g_dbus_method_invocation_get_message (GDBusMethodInvocation *invocation) { g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); - return invocation->priv->message; + return invocation->message; } /** * g_dbus_method_invocation_get_parameters: * @invocation: A #GDBusMethodInvocation. * - * Gets the parameters of the method invocation. + * Gets the parameters of the method invocation. If there are no input + * parameters then this will return a GVariant with 0 children rather than NULL. * - * Returns: A #GVariant. Do not free, it is owned by @invocation. + * Returns: (transfer none): A #GVariant tuple. Do not unref this because it is owned by @invocation. * * Since: 2.26 */ @@ -239,11 +302,11 @@ GVariant * g_dbus_method_invocation_get_parameters (GDBusMethodInvocation *invocation) { g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); - return invocation->priv->parameters; + return invocation->parameters; } /** - * g_dbus_method_invocation_get_user_data: + * g_dbus_method_invocation_get_user_data: (skip) * @invocation: A #GDBusMethodInvocation. * * Gets the @user_data #gpointer passed to g_dbus_connection_register_object(). @@ -256,16 +319,17 @@ gpointer g_dbus_method_invocation_get_user_data (GDBusMethodInvocation *invocation) { g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); - return invocation->priv->user_data; + return invocation->user_data; } -/** - * g_dbus_method_invocation_new: - * @sender: The bus name that invoked the method or %NULL if @connection is not a bus connection. +/* < internal > + * _g_dbus_method_invocation_new: + * @sender: (allow-none): The bus name that invoked the method or %NULL if @connection is not a bus connection. * @object_path: The object path the method was invoked on. * @interface_name: The name of the D-Bus interface the method was invoked on. * @method_name: The name of the method that was invoked. - * @method_info: Information about the method call or %NULL. + * @method_info: (allow-none): Information about the method call or %NULL. + * @property_info: (allow-none): Information about the property or %NULL. * @connection: The #GDBusConnection the method was invoked on. * @message: The D-Bus message as a #GDBusMessage. * @parameters: The parameters as a #GVariant tuple. @@ -278,18 +342,18 @@ g_dbus_method_invocation_get_user_data (GDBusMethodInvocation *invocation) * Since: 2.26 */ GDBusMethodInvocation * -g_dbus_method_invocation_new (const gchar *sender, - const gchar *object_path, - const gchar *interface_name, - const gchar *method_name, - const GDBusMethodInfo *method_info, - GDBusConnection *connection, - GDBusMessage *message, - GVariant *parameters, - gpointer user_data) +_g_dbus_method_invocation_new (const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + const GDBusMethodInfo *method_info, + const GDBusPropertyInfo *property_info, + GDBusConnection *connection, + GDBusMessage *message, + GVariant *parameters, + gpointer user_data) { GDBusMethodInvocation *invocation; - GDBusMethodInvocationPrivate *priv; g_return_val_if_fail (sender == NULL || g_dbus_is_name (sender), NULL); g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); @@ -300,39 +364,28 @@ g_dbus_method_invocation_new (const gchar *sender, g_return_val_if_fail (g_variant_is_of_type (parameters, G_VARIANT_TYPE_TUPLE), NULL); invocation = G_DBUS_METHOD_INVOCATION (g_object_new (G_TYPE_DBUS_METHOD_INVOCATION, NULL)); - - priv = invocation->priv; - priv->sender = g_strdup (sender); - priv->object_path = g_strdup (object_path); - priv->interface_name = g_strdup (interface_name); - priv->method_name = g_strdup (method_name); - priv->method_info = g_dbus_method_info_ref ((GDBusMethodInfo *)method_info); - priv->connection = g_object_ref (connection); - priv->message = g_object_ref (message); - priv->parameters = g_variant_ref (parameters); - priv->user_data = user_data; + invocation->sender = g_strdup (sender); + invocation->object_path = g_strdup (object_path); + invocation->interface_name = g_strdup (interface_name); + invocation->method_name = g_strdup (method_name); + if (method_info) + invocation->method_info = g_dbus_method_info_ref ((GDBusMethodInfo *)method_info); + if (property_info) + invocation->property_info = g_dbus_property_info_ref ((GDBusPropertyInfo *)property_info); + invocation->connection = g_object_ref (connection); + invocation->message = g_object_ref (message); + invocation->parameters = g_variant_ref (parameters); + invocation->user_data = user_data; return invocation; } /* ---------------------------------------------------------------------------------------------------- */ -/** - * g_dbus_method_invocation_return_value: - * @invocation: A #GDBusMethodInvocation. - * @parameters: A #GVariant tuple with out parameters for the method or %NULL if not passing any parameters. - * - * Finishes handling a D-Bus method call by returning @parameters. - * - * It is an error if @parameters is not of the right format. - * - * This method will free @invocation, you cannot use it afterwards. - * - * Since: 2.26 - */ -void -g_dbus_method_invocation_return_value (GDBusMethodInvocation *invocation, - GVariant *parameters) +static void +g_dbus_method_invocation_return_value_internal (GDBusMethodInvocation *invocation, + GVariant *parameters, + GUnixFDList *fd_list) { GDBusMessage *reply; GError *error; @@ -340,52 +393,177 @@ g_dbus_method_invocation_return_value (GDBusMethodInvocation *invocation, g_return_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation)); g_return_if_fail ((parameters == NULL) || g_variant_is_of_type (parameters, G_VARIANT_TYPE_TUPLE)); - if (parameters != NULL) - g_variant_ref_sink (parameters); + if (parameters == NULL) + parameters = g_variant_new_tuple (NULL, 0); /* if we have introspection data, check that the signature of @parameters is correct */ - if (invocation->priv->method_info != NULL) + if (invocation->method_info != NULL) { - gchar *signature; - const gchar *type_string; + GVariantType *type; - type_string = "()"; - if (parameters != NULL) - type_string = g_variant_get_type_string (parameters); - signature = _g_dbus_compute_complete_signature (invocation->priv->method_info->out_args, TRUE); + type = _g_dbus_compute_complete_signature (invocation->method_info->out_args); - if (g_strcmp0 (type_string, signature) != 0) + if (!g_variant_is_of_type (parameters, type)) { - g_warning (_("Type of return value is incorrect, got `%s', expected `%s'"), - type_string, - signature); - g_free (signature); + gchar *type_string = g_variant_type_dup_string (type); + + g_warning ("Type of return value is incorrect: expected '%s', got '%s''", + type_string, g_variant_get_type_string (parameters)); + g_variant_type_free (type); + g_free (type_string); goto out; } - g_free (signature); + g_variant_type_free (type); + } + + /* property_info is only non-NULL if set that way from + * GDBusConnection, so this must be the case of async property + * handling on either 'Get', 'Set' or 'GetAll'. + */ + if (invocation->property_info != NULL) + { + if (g_str_equal (invocation->method_name, "Get")) + { + GVariant *nested; + + if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(v)"))) + { + g_warning ("Type of return value for property 'Get' call should be '(v)' but got '%s'", + g_variant_get_type_string (parameters)); + goto out; + } + + /* Go deeper and make sure that the value inside of the + * variant matches the property type. + */ + g_variant_get (parameters, "(v)", &nested); + if (!g_str_equal (g_variant_get_type_string (nested), invocation->property_info->signature)) + { + g_warning ("Value returned from property 'Get' call for '%s' should be '%s' but is '%s'", + invocation->property_info->name, invocation->property_info->signature, + g_variant_get_type_string (nested)); + g_variant_unref (nested); + goto out; + } + g_variant_unref (nested); + } + + else if (g_str_equal (invocation->method_name, "GetAll")) + { + if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(a{sv})"))) + { + g_warning ("Type of return value for property 'GetAll' call should be '(a{sv})' but got '%s'", + g_variant_get_type_string (parameters)); + goto out; + } + + /* Could iterate the list of properties and make sure that all + * of them are actually on the interface and with the correct + * types, but let's not do that for now... + */ + } + + else if (g_str_equal (invocation->method_name, "Set")) + { + if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE_UNIT)) + { + g_warning ("Type of return value for property 'Set' call should be '()' but got '%s'", + g_variant_get_type_string (parameters)); + goto out; + } + } + + else + g_assert_not_reached (); + } + + if (G_UNLIKELY (_g_dbus_debug_return ())) + { + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Return:\n" + " >>>> METHOD RETURN\n" + " in response to %s.%s()\n" + " on object %s\n" + " to name %s\n" + " reply-serial %d\n", + invocation->interface_name, invocation->method_name, + invocation->object_path, + invocation->sender, + g_dbus_message_get_serial (invocation->message)); + _g_dbus_debug_print_unlock (); } - reply = g_dbus_message_new_method_reply (invocation->priv->message); + reply = g_dbus_message_new_method_reply (invocation->message); g_dbus_message_set_body (reply, parameters); + +#ifdef G_OS_UNIX + if (fd_list != NULL) + g_dbus_message_set_unix_fd_list (reply, fd_list); +#endif + error = NULL; - if (!g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), reply, NULL, &error)) + if (!g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, &error)) { - g_warning (_("Error sending message: %s"), error->message); + g_warning ("Error sending message: %s", error->message); g_error_free (error); } g_object_unref (reply); out: g_object_unref (invocation); - if (parameters != NULL) - g_variant_unref (parameters); } +/** + * g_dbus_method_invocation_return_value: + * @invocation: (transfer full): A #GDBusMethodInvocation. + * @parameters: (allow-none): A #GVariant tuple with out parameters for the method or %NULL if not passing any parameters. + * + * Finishes handling a D-Bus method call by returning @parameters. + * If the @parameters GVariant is floating, it is consumed. + * + * It is an error if @parameters is not of the right format. + * + * This method will free @invocation, you cannot use it afterwards. + * + * Since: 2.26 + */ +void +g_dbus_method_invocation_return_value (GDBusMethodInvocation *invocation, + GVariant *parameters) +{ + g_dbus_method_invocation_return_value_internal (invocation, parameters, NULL); +} + +#ifdef G_OS_UNIX +/** + * g_dbus_method_invocation_return_value_with_unix_fd_list: + * @invocation: (transfer full): A #GDBusMethodInvocation. + * @parameters: (allow-none): A #GVariant tuple with out parameters for the method or %NULL if not passing any parameters. + * @fd_list: (allow-none): A #GUnixFDList or %NULL. + * + * Like g_dbus_method_invocation_return_value() but also takes a #GUnixFDList. + * + * This method is only available on UNIX. + * + * This method will free @invocation, you cannot use it afterwards. + * + * Since: 2.30 + */ +void +g_dbus_method_invocation_return_value_with_unix_fd_list (GDBusMethodInvocation *invocation, + GVariant *parameters, + GUnixFDList *fd_list) +{ + g_dbus_method_invocation_return_value_internal (invocation, parameters, fd_list); +} +#endif + /* ---------------------------------------------------------------------------------------------------- */ /** * g_dbus_method_invocation_return_error: - * @invocation: A #GDBusMethodInvocation. + * @invocation: (transfer full): A #GDBusMethodInvocation. * @domain: A #GQuark for the #GError error domain. * @code: The error code. * @format: printf()-style format. @@ -397,12 +575,11 @@ g_dbus_method_invocation_return_value (GDBusMethodInvocation *invocation, * will be returned on the wire. In a nutshell, if the given error is * registered using g_dbus_error_register_error() the name given * during registration is used. Otherwise, a name of the form - * org.gtk.GDBus.UnmappedGError.Quark... is - * used. This provides transparent mapping of #GError between - * applications using GDBus. + * `org.gtk.GDBus.UnmappedGError.Quark...` is used. This provides + * transparent mapping of #GError between applications using GDBus. * * If you are writing an application intended to be portable, - * always register errors with g_dbus_error_register_error() + * always register errors with g_dbus_error_register_error() * or use g_dbus_method_invocation_return_dbus_error(). * * This method will free @invocation, you cannot use it afterwards. @@ -432,7 +609,7 @@ g_dbus_method_invocation_return_error (GDBusMethodInvocation *invocation, /** * g_dbus_method_invocation_return_error_valist: - * @invocation: A #GDBusMethodInvocation. + * @invocation: (transfer full): A #GDBusMethodInvocation. * @domain: A #GQuark for the #GError error domain. * @code: The error code. * @format: printf()-style format. @@ -467,7 +644,7 @@ g_dbus_method_invocation_return_error_valist (GDBusMethodInvocation *invocation, /** * g_dbus_method_invocation_return_error_literal: - * @invocation: A #GDBusMethodInvocation. + * @invocation: (transfer full): A #GDBusMethodInvocation. * @domain: A #GQuark for the #GError error domain. * @code: The error code. * @message: The error message. @@ -496,7 +673,7 @@ g_dbus_method_invocation_return_error_literal (GDBusMethodInvocation *invocation /** * g_dbus_method_invocation_return_gerror: - * @invocation: A #GDBusMethodInvocation. + * @invocation: (transfer full): A #GDBusMethodInvocation. * @error: A #GError. * * Like g_dbus_method_invocation_return_error() but takes a #GError @@ -524,8 +701,30 @@ g_dbus_method_invocation_return_gerror (GDBusMethodInvocation *invocation, } /** + * g_dbus_method_invocation_take_error: (skip) + * @invocation: (transfer full): A #GDBusMethodInvocation. + * @error: (transfer full): A #GError. + * + * Like g_dbus_method_invocation_return_gerror() but takes ownership + * of @error so the caller does not need to free it. + * + * This method will free @invocation, you cannot use it afterwards. + * + * Since: 2.30 + */ +void +g_dbus_method_invocation_take_error (GDBusMethodInvocation *invocation, + GError *error) +{ + g_return_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation)); + g_return_if_fail (error != NULL); + g_dbus_method_invocation_return_gerror (invocation, error); + g_error_free (error); +} + +/** * g_dbus_method_invocation_return_dbus_error: - * @invocation: A #GDBusMethodInvocation. + * @invocation: (transfer full): A #GDBusMethodInvocation. * @error_name: A valid D-Bus error name. * @error_message: A valid D-Bus error message. * @@ -546,14 +745,31 @@ g_dbus_method_invocation_return_dbus_error (GDBusMethodInvocation *invocation, g_return_if_fail (error_name != NULL && g_dbus_is_name (error_name)); g_return_if_fail (error_message != NULL); - reply = g_dbus_message_new_method_error_literal (invocation->priv->message, + if (G_UNLIKELY (_g_dbus_debug_return ())) + { + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Return:\n" + " >>>> METHOD ERROR %s\n" + " message '%s'\n" + " in response to %s.%s()\n" + " on object %s\n" + " to name %s\n" + " reply-serial %d\n", + error_name, + error_message, + invocation->interface_name, invocation->method_name, + invocation->object_path, + invocation->sender, + g_dbus_message_get_serial (invocation->message)); + _g_dbus_debug_print_unlock (); + } + + reply = g_dbus_message_new_method_error_literal (invocation->message, error_name, error_message); - g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), reply, NULL, NULL); + g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); g_object_unref (reply); g_object_unref (invocation); } - -#define __G_DBUS_METHOD_INVOCATION_C__ -#include "gioaliasdef.c"