From 8425a13987c3657bc59791715befd8fe9cbc8c6c Mon Sep 17 00:00:00 2001 From: Eric Hameleers Date: Sun, 13 Sep 2015 13:04:59 +0200 Subject: Updated 'deps' for KDE 5_15.09_02 LoginKit: removed. It was causing a minute-long delay on logout and display of the 'Leave' menu. ConsoleKit2 offers a systemd-logind API as well. ConsoleKit2: rebuilt with patches to make it work correctly on x86_64 (lib64). libproxy: added a rebuilt version of Slackware's package with KDE4 support removed, which prevents crashes in Qt5/KF5 applications which use libproxy (such as OwnCloud). --- .../0001-Revert-Minor-code-refactoring.patch | 477 +++++++++++++++++++++ ...bdir-scripts-stuff-missed-in-4d87a25ea0af.patch | 42 ++ .../patches/0003-Filter-out-the-kdm-user.patch | 29 ++ ...overlooked-prefix-lib-libdir-substitution.patch | 22 + deps/ConsoleKit2/patches/ConsoleKit2_lib64.patch | 14 - 5 files changed, 570 insertions(+), 14 deletions(-) create mode 100644 deps/ConsoleKit2/patches/0001-Revert-Minor-code-refactoring.patch create mode 100644 deps/ConsoleKit2/patches/0002-Fix-some-libdir-scripts-stuff-missed-in-4d87a25ea0af.patch create mode 100644 deps/ConsoleKit2/patches/0003-Filter-out-the-kdm-user.patch create mode 100644 deps/ConsoleKit2/patches/0004-Apply-overlooked-prefix-lib-libdir-substitution.patch delete mode 100644 deps/ConsoleKit2/patches/ConsoleKit2_lib64.patch (limited to 'deps/ConsoleKit2/patches') diff --git a/deps/ConsoleKit2/patches/0001-Revert-Minor-code-refactoring.patch b/deps/ConsoleKit2/patches/0001-Revert-Minor-code-refactoring.patch new file mode 100644 index 0000000..b6cadb3 --- /dev/null +++ b/deps/ConsoleKit2/patches/0001-Revert-Minor-code-refactoring.patch @@ -0,0 +1,477 @@ +From 1e3f7f9862dceec3fa11ee4205c343ed64ce5b63 Mon Sep 17 00:00:00 2001 +From: Eric Koegel +Date: Sat, 22 Aug 2015 10:51:20 +0300 +Subject: [PATCH 1/5] Revert "Minor code refactoring" + +This reverts commit bee63889f4a0b8f57807a61d8396346cec8cd5b1. + +There are some cases where ConsoleKit2 would crash after successfully +suspending so revert this commit. +--- + src/ck-manager.c | 160 ++++++++++++++++++++++++++++++++++---------------- + src/ck-session.c | 56 +++++++++++++++++- + src/ck-sysdeps-unix.c | 59 ------------------- + src/ck-sysdeps.h | 6 -- + tools/Makefile.am | 3 - + 5 files changed, 163 insertions(+), 121 deletions(-) + +diff --git a/src/ck-manager.c b/src/ck-manager.c +index db5f906..66da8b2 100644 +--- a/src/ck-manager.c ++++ b/src/ck-manager.c +@@ -960,11 +960,13 @@ logind_ready_cb (PolkitAuthority *authority, + g_object_unref (ret); + } + ++/* We use this to avoid breaking API compability with ConsoleKit1 for ++ * CanStop and CanRestart, but this method emulates how logind ++ * presents it's API */ + static void +-get_polkit_permissions_for_callback (CkManager *manager, +- const char *action, +- GDBusMethodInvocation *context, +- GAsyncReadyCallback callback) ++get_polkit_logind_permissions (CkManager *manager, ++ const char *action, ++ GDBusMethodInvocation *context) + { + const char *sender; + PolkitSubject *subject; +@@ -980,37 +982,96 @@ get_polkit_permissions_for_callback (CkManager *manager, + NULL, + 0, + NULL, +- callback, ++ (GAsyncReadyCallback) logind_ready_cb, + context); + g_object_unref (subject); + } + +-/* We use this to avoid breaking API compability with ConsoleKit1 for +- * CanStop and CanRestart, but this method emulates how logind +- * presents it's API */ +-static void +-get_polkit_logind_permissions (CkManager *manager, +- const char *action, +- GDBusMethodInvocation *context) +-{ +- get_polkit_permissions_for_callback (manager, +- action, +- context, +- (GAsyncReadyCallback) logind_ready_cb); +-} +- + static void + get_polkit_permissions (CkManager *manager, + const char *action, + GDBusMethodInvocation *context) + { +- get_polkit_permissions_for_callback (manager, +- action, +- context, +- (GAsyncReadyCallback) ready_cb); ++ const char *sender; ++ PolkitSubject *subject; ++ ++ g_debug ("get permissions for action %s", action); ++ ++ sender = g_dbus_method_invocation_get_sender (context); ++ subject = polkit_system_bus_name_new (sender); ++ ++ polkit_authority_check_authorization (manager->priv->pol_ctx, ++ subject, ++ action, ++ NULL, ++ 0, ++ NULL, ++ (GAsyncReadyCallback) ready_cb, ++ context); ++ g_object_unref (subject); + } + #endif + ++/* adapted from PolicyKit */ ++static gboolean ++get_caller_info (CkManager *manager, ++ const char *sender, ++ uid_t *calling_uid, ++ pid_t *calling_pid) ++{ ++ gboolean res = FALSE; ++ GVariant *value = NULL; ++ GError *error = NULL; ++ ++ if (sender == NULL) { ++ g_debug ("sender == NULL"); ++ goto out; ++ } ++ ++ if (manager->priv->bus_proxy == NULL) { ++ g_debug ("manager->priv->bus_proxy == NULL"); ++ goto out; ++ } ++ ++ value = g_dbus_proxy_call_sync (manager->priv->bus_proxy, "GetConnectionUnixUser", ++ g_variant_new ("(s)", sender), ++ G_DBUS_CALL_FLAGS_NONE, ++ 2000, ++ NULL, ++ &error); ++ ++ if (value == NULL) { ++ g_warning ("GetConnectionUnixUser() failed: %s", error->message); ++ g_error_free (error); ++ goto out; ++ } ++ g_variant_get (value, "(u)", calling_uid); ++ g_variant_unref (value); ++ ++ value = g_dbus_proxy_call_sync (manager->priv->bus_proxy, "GetConnectionUnixProcessID", ++ g_variant_new ("(s)", sender), ++ G_DBUS_CALL_FLAGS_NONE, ++ 2000, ++ NULL, ++ &error); ++ ++ if (value == NULL) { ++ g_warning ("GetConnectionUnixProcessID() failed: %s", error->message); ++ g_error_free (error); ++ goto out; ++ } ++ g_variant_get (value, "(u)", calling_pid); ++ g_variant_unref (value); ++ ++ res = TRUE; ++ ++ g_debug ("uid = %d", *calling_uid); ++ g_debug ("pid = %d", *calling_pid); ++ ++out: ++ return res; ++} ++ + static char * + get_user_name (uid_t uid) + { +@@ -1118,7 +1179,7 @@ check_rbac_permissions (CkManager *manager, + + username = NULL; + sender = g_dbus_method_invocation_get_sender (context); +- res = get_caller_info (manager->priv->bus_proxy, ++ res = get_caller_info (manager, + sender, + &uid, + &pid); +@@ -2055,7 +2116,7 @@ dbus_inhibit (ConsoleKitManager *ckmanager, + priv = CK_MANAGER_GET_PRIVATE (CK_MANAGER (ckmanager)); + + sender = g_dbus_method_invocation_get_sender (context); +- res = get_caller_info (priv->bus_proxy, ++ res = get_caller_info (CK_MANAGER (ckmanager), + sender, + &uid, + &pid); +@@ -2698,7 +2759,7 @@ create_session_for_sender (CkManager *manager, + + g_debug ("CkManager: create session for sender: %s", sender); + +- res = get_caller_info (manager->priv->bus_proxy, ++ res = get_caller_info (manager, + sender, + &uid, + &pid); +@@ -2767,7 +2828,7 @@ dbus_get_session_for_cookie (ConsoleKitManager *ckmanager, + + sender = g_dbus_method_invocation_get_sender (context); + +- res = get_caller_info (manager->priv->bus_proxy, ++ res = get_caller_info (manager, + sender, + &calling_uid, + &calling_pid); +@@ -2852,7 +2913,7 @@ dbus_get_session_for_unix_process (ConsoleKitManager *ckmanager, + TRACE (); + g_debug ("pid: %u", pid); + +- res = get_caller_info (manager->priv->bus_proxy, ++ res = get_caller_info (manager, + sender, + &calling_uid, + &calling_pid); +@@ -2900,7 +2961,7 @@ dbus_get_current_session (ConsoleKitManager *ckmanager, + + g_debug ("CkManager: get current session"); + +- res = get_caller_info (manager->priv->bus_proxy, ++ res = get_caller_info (manager, + sender, + &calling_uid, + &calling_pid); +@@ -3100,7 +3161,7 @@ dbus_close_session (ConsoleKitManager *ckmanager, + manager = CK_MANAGER (ckmanager); + + sender = g_dbus_method_invocation_get_sender (context); +- res = get_caller_info (manager->priv->bus_proxy, ++ res = get_caller_info (manager, + sender, + &calling_uid, + &calling_pid); +@@ -3443,17 +3504,6 @@ create_seats (CkManager *manager) + } + + static void +-cancel_timeout_and_call_system_action (CkManagerPrivate *priv) +-{ +- /* The inhibit lock for this action was removed. +- * Stop the timeout and call the system action now. +- */ +- g_source_remove (priv->system_action_idle_id); +- priv->system_action_idle_id = 0; +- system_action_idle_cb (priv->system_action_data); +-} +- +-static void + on_inhibit_manager_changed_event (CkInhibitManager *manager, gint inhibit_mode, gint event, gboolean enabled, gpointer user_data) + { + CkManagerPrivate *priv; +@@ -3472,6 +3522,17 @@ on_inhibit_manager_changed_event (CkInhibitManager *manager, gint inhibit_mode, + return; + } + ++ /* this system action must be for a sleep or shutdown operation */ ++ if (priv->system_action_data->signal != PREPARE_FOR_SLEEP && ++ priv->system_action_data->signal != PREPARE_FOR_SHUTDOWN) { ++ return; ++ } ++ ++ /* the inhibit change must be for sleep or shutdown */ ++ if (event != CK_INHIBIT_EVENT_SUSPEND && event != CK_INHIBIT_EVENT_SHUTDOWN) { ++ return; ++ } ++ + /* must be a delay inhibitor */ + if (inhibit_mode != CK_INHIBIT_MODE_DELAY) { + return; +@@ -3482,17 +3543,12 @@ on_inhibit_manager_changed_event (CkInhibitManager *manager, gint inhibit_mode, + return; + } + +- /* Did we stop inhibiting sleep? */ +- if (priv->system_action_data->signal == PREPARE_FOR_SLEEP && +- event == CK_INHIBIT_EVENT_SUSPEND) { +- cancel_timeout_and_call_system_action (priv); +- } +- +- /* Did we stop inhibiting shutdown? */ +- if (priv->system_action_data->signal == PREPARE_FOR_SHUTDOWN && +- event == CK_INHIBIT_EVENT_SHUTDOWN) { +- cancel_timeout_and_call_system_action (priv); +- } ++ /* The inhibit lock for this action was removed. ++ * Stop the timeout and call the system action now. ++ */ ++ g_source_remove (priv->system_action_idle_id); ++ priv->system_action_idle_id = 0; ++ system_action_idle_cb (priv->system_action_data); + } + + static void +diff --git a/src/ck-session.c b/src/ck-session.c +index 478dce2..ca0f8ca 100644 +--- a/src/ck-session.c ++++ b/src/ck-session.c +@@ -248,6 +248,60 @@ dbus_unlock (ConsoleKitSession *cksession, + return TRUE; + } + ++/* adapted from PolicyKit */ ++static gboolean ++get_caller_info (CkSession *session, ++ const char *sender, ++ uid_t *calling_uid, ++ pid_t *calling_pid) ++{ ++ gboolean res = FALSE; ++ GVariant *value = NULL; ++ GError *error = NULL; ++ ++ if (sender == NULL) { ++ goto out; ++ } ++ ++ value = g_dbus_proxy_call_sync (session->priv->bus_proxy, "GetConnectionUnixUser", ++ g_variant_new ("(s)", sender), ++ G_DBUS_CALL_FLAGS_NONE, ++ 2000, ++ NULL, ++ &error); ++ ++ if (value == NULL) { ++ g_warning ("GetConnectionUnixUser() failed: %s", error->message); ++ g_error_free (error); ++ goto out; ++ } ++ g_variant_get (value, "(u)", calling_uid); ++ g_variant_unref (value); ++ ++ value = g_dbus_proxy_call_sync (session->priv->bus_proxy, "GetConnectionUnixProcessID", ++ g_variant_new ("(s)", sender), ++ G_DBUS_CALL_FLAGS_NONE, ++ 2000, ++ NULL, ++ &error); ++ ++ if (value == NULL) { ++ g_warning ("GetConnectionUnixProcessID() failed: %s", error->message); ++ g_error_free (error); ++ goto out; ++ } ++ g_variant_get (value, "(u)", calling_pid); ++ g_variant_unref (value); ++ ++ res = TRUE; ++ ++ g_debug ("uid = %d", *calling_uid); ++ g_debug ("pid = %d", *calling_pid); ++ ++out: ++ return res; ++} ++ + static gboolean + session_set_idle_hint_internal (CkSession *session, + gboolean idle_hint) +@@ -326,7 +380,7 @@ dbus_set_idle_hint (ConsoleKitSession *cksession, + + sender = g_dbus_method_invocation_get_sender (context); + +- res = get_caller_info (session->priv->bus_proxy, ++ res = get_caller_info (session, + sender, + &calling_uid, + &calling_pid); +diff --git a/src/ck-sysdeps-unix.c b/src/ck-sysdeps-unix.c +index 87333d1..0f751b9 100644 +--- a/src/ck-sysdeps-unix.c ++++ b/src/ck-sysdeps-unix.c +@@ -132,65 +132,6 @@ ck_get_socket_peer_credentials (int socket_fd, + return ret; + } + +-/* adapted from PolicyKit */ +-gboolean +-get_caller_info (GDBusProxy *bus_proxy, +- const char *sender, +- uid_t *calling_uid, +- pid_t *calling_pid) +-{ +- gboolean res = FALSE; +- GVariant *value = NULL; +- GError *error = NULL; +- +- if (sender == NULL) { +- g_debug ("sender == NULL"); +- goto out; +- } +- +- if (bus_proxy == NULL) { +- g_debug ("bus_proxy == NULL"); +- goto out; +- } +- +- value = g_dbus_proxy_call_sync (bus_proxy, "GetConnectionUnixUser", +- g_variant_new ("(s)", sender), +- G_DBUS_CALL_FLAGS_NONE, +- 2000, +- NULL, +- &error); +- +- if (value == NULL) { +- g_warning ("GetConnectionUnixUser() failed: %s", error->message); +- g_error_free (error); +- goto out; +- } +- g_variant_get (value, "(u)", calling_uid); +- g_variant_unref (value); +- +- value = g_dbus_proxy_call_sync (bus_proxy, "GetConnectionUnixProcessID", +- g_variant_new ("(s)", sender), +- G_DBUS_CALL_FLAGS_NONE, +- 2000, +- NULL, +- &error); +- +- if (value == NULL) { +- g_warning ("GetConnectionUnixProcessID() failed: %s", error->message); +- g_error_free (error); +- goto out; +- } +- g_variant_get (value, "(u)", calling_pid); +- g_variant_unref (value); +- +- res = TRUE; +- +- g_debug ("uid = %d", *calling_uid); +- g_debug ("pid = %d", *calling_pid); +- +-out: +- return res; +-} + + /* + * getfd.c +diff --git a/src/ck-sysdeps.h b/src/ck-sysdeps.h +index 66df581..bc32631 100644 +--- a/src/ck-sysdeps.h ++++ b/src/ck-sysdeps.h +@@ -24,7 +24,6 @@ + #include "config.h" + + #include +-#include + + G_BEGIN_DECLS + +@@ -55,11 +54,6 @@ gboolean ck_get_socket_peer_credentials (int socket_fd, + uid_t *uid, + GError **error); + +-gboolean get_caller_info (GDBusProxy *bus_proxy, +- const char *sender, +- uid_t *calling_uid, +- pid_t *calling_pid); +- + int ck_get_a_console_fd (void); + + gboolean ck_fd_is_a_console (int fd); +diff --git a/tools/Makefile.am b/tools/Makefile.am +index 69dd1eb..81f4d1f 100644 +--- a/tools/Makefile.am ++++ b/tools/Makefile.am +@@ -131,7 +131,6 @@ ck_collect_session_info_SOURCES = \ + $(NULL) + + ck_collect_session_info_LDADD = \ +- $(CONSOLE_KIT_LIBS) \ + $(TOOLS_LIBS) \ + $(top_builddir)/src/libck.la \ + $(NULL) +@@ -141,7 +140,6 @@ ck_get_x11_server_pid_SOURCES = \ + $(NULL) + + ck_get_x11_server_pid_LDADD = \ +- $(CONSOLE_KIT_LIBS) \ + $(TOOLS_LIBS) \ + $(XLIB_LIBS) \ + $(top_builddir)/src/libck.la \ +@@ -152,7 +150,6 @@ ck_get_x11_display_device_SOURCES = \ + $(NULL) + + ck_get_x11_display_device_LDADD = \ +- $(CONSOLE_KIT_LIBS) \ + $(TOOLS_LIBS) \ + $(top_builddir)/src/libck.la \ + $(NULL) +-- +2.5.1 + diff --git a/deps/ConsoleKit2/patches/0002-Fix-some-libdir-scripts-stuff-missed-in-4d87a25ea0af.patch b/deps/ConsoleKit2/patches/0002-Fix-some-libdir-scripts-stuff-missed-in-4d87a25ea0af.patch new file mode 100644 index 0000000..2c46bbd --- /dev/null +++ b/deps/ConsoleKit2/patches/0002-Fix-some-libdir-scripts-stuff-missed-in-4d87a25ea0af.patch @@ -0,0 +1,42 @@ +From b045a4245199b12dfc04f03b22bc1e9b1f80aae9 Mon Sep 17 00:00:00 2001 +From: Robby Workman +Date: Sun, 23 Aug 2015 16:53:52 -0500 +Subject: [PATCH 2/5] Fix some libdir/scripts stuff missed in 4d87a25ea0af + +--- + src/ck-seat.c | 2 +- + tools/Makefile.am | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/ck-seat.c b/src/ck-seat.c +index ead6425..47e6933 100644 +--- a/src/ck-seat.c ++++ b/src/ck-seat.c +@@ -1443,7 +1443,7 @@ ck_seat_run_programs (CkSeat *seat, + g_assert(n <= G_N_ELEMENTS(extra_env)); + + ck_run_programs (SYSCONFDIR "/ConsoleKit/run-seat.d", action, extra_env); +- ck_run_programs (PREFIX "/lib/ConsoleKit/run-seat.d", action, extra_env); ++ ck_run_programs (LIBDIR "/ConsoleKit/run-seat.d", action, extra_env); + + for (n = 0; extra_env[n] != NULL; n++) { + g_free (extra_env[n]); +diff --git a/tools/Makefile.am b/tools/Makefile.am +index 69dd1eb..d61b845 100644 +--- a/tools/Makefile.am ++++ b/tools/Makefile.am +@@ -171,9 +171,9 @@ udev_acl_CFLAGS = \ + $(NULL) + + install-exec-hook: +- mkdir -p $(DESTDIR)$(prefix)/lib/ConsoleKit/run-seat.d ++ mkdir -p $(DESTDIR)$(libdir)/ConsoleKit/run-seat.d + mkdir -p $(DESTDIR)$(UDEVDIR) +- ln -sf $(libexecdir)/udev-acl $(DESTDIR)$(prefix)/lib/ConsoleKit/run-seat.d/udev-acl.ck ++ ln -sf $(libexecdir)/udev-acl $(DESTDIR)$(libdir)/ConsoleKit/run-seat.d/udev-acl.ck + ln -sf $(libexecdir)/udev-acl $(DESTDIR)$(UDEVDIR)/udev-acl + endif + +-- +2.5.1 + diff --git a/deps/ConsoleKit2/patches/0003-Filter-out-the-kdm-user.patch b/deps/ConsoleKit2/patches/0003-Filter-out-the-kdm-user.patch new file mode 100644 index 0000000..c0ec63d --- /dev/null +++ b/deps/ConsoleKit2/patches/0003-Filter-out-the-kdm-user.patch @@ -0,0 +1,29 @@ +From f848c1de94ef2f5ae7d53358d30e26400a69d3d4 Mon Sep 17 00:00:00 2001 +From: Ivailo Monev +Date: Mon, 24 Aug 2015 20:18:50 +0300 +Subject: [PATCH 5/5] Filter out the kdm user + +--- + src/ck-manager.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/src/ck-manager.c b/src/ck-manager.c +index 66da8b2..4a6e511 100644 +--- a/src/ck-manager.c ++++ b/src/ck-manager.c +@@ -1111,9 +1111,10 @@ session_is_real_user (CkSession *session, + + username = get_user_name (uid); + +- /* filter out GDM/SDDM user */ ++ /* filter out GDM/SDDM/KDM user */ + if (g_strcmp0 (username, "gdm") == 0 || +- g_strcmp0 (username, "sddm") == 0) { ++ g_strcmp0 (username, "sddm") == 0 || ++ g_strcmp0 (username, "kdm") == 0) { + ret = FALSE; + goto out; + } +-- +2.5.1 + diff --git a/deps/ConsoleKit2/patches/0004-Apply-overlooked-prefix-lib-libdir-substitution.patch b/deps/ConsoleKit2/patches/0004-Apply-overlooked-prefix-lib-libdir-substitution.patch new file mode 100644 index 0000000..ee3b1e2 --- /dev/null +++ b/deps/ConsoleKit2/patches/0004-Apply-overlooked-prefix-lib-libdir-substitution.patch @@ -0,0 +1,22 @@ +From 22958330535c9e26ed537d1568925f64e3bafe4d Mon Sep 17 00:00:00 2001 +From: Eric Hameleers +Date: Thu, 10 Sep 2015 14:19:43 +0200 +Subject: [PATCH] Apply overlooked PREFIX/lib -> LIBDIR substitution + +--- + src/ck-session.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/ck-session.c b/src/ck-session.c +index ca0f8ca..1b58889 100644 +--- a/src/ck-session.c ++++ b/src/ck-session.c +@@ -1273,7 +1273,7 @@ ck_session_run_programs (CkSession *session, + g_assert(n <= G_N_ELEMENTS(extra_env)); + + ck_run_programs (SYSCONFDIR "/ConsoleKit/run-session.d", action, extra_env); +- ck_run_programs (PREFIX "/lib/ConsoleKit/run-session.d", action, extra_env); ++ ck_run_programs (LIBDIR "/ConsoleKit/run-session.d", action, extra_env); + + for (n = 0; extra_env[n] != NULL; n++) { + g_free (extra_env[n]); diff --git a/deps/ConsoleKit2/patches/ConsoleKit2_lib64.patch b/deps/ConsoleKit2/patches/ConsoleKit2_lib64.patch deleted file mode 100644 index d83917b..0000000 --- a/deps/ConsoleKit2/patches/ConsoleKit2_lib64.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- ConsoleKit2-1.0.0/tools/Makefile.am.orig 2015-08-10 08:48:27.000000000 +0200 -+++ ConsoleKit2-1.0.0/tools/Makefile.am 2015-08-23 16:54:50.559056869 +0200 -@@ -171,9 +171,9 @@ - $(NULL) - - install-exec-hook: -- mkdir -p $(DESTDIR)$(prefix)/lib/ConsoleKit/run-seat.d -+ mkdir -p $(DESTDIR)$(libdir)/ConsoleKit/run-seat.d - mkdir -p $(DESTDIR)$(UDEVDIR) -- ln -sf $(libexecdir)/udev-acl $(DESTDIR)$(prefix)/lib/ConsoleKit/run-seat.d/udev-acl.ck -+ ln -sf $(libexecdir)/udev-acl $(DESTDIR)$(libdir)/ConsoleKit/run-seat.d/udev-acl.ck - ln -sf $(libexecdir)/udev-acl $(DESTDIR)$(UDEVDIR)/udev-acl - endif - -- cgit v1.2.3-80-g2a13