Blame SOURCES/tty-restore-flags-if-changed.patch

ecb1aa
diff -up ./src/polkitagent/polkitagenttextlistener.c.ori ./src/polkitagent/polkitagenttextlistener.c
ecb1aa
--- ./src/polkitagent/polkitagenttextlistener.c.ori	2018-05-31 13:52:23.000000000 +0200
ecb1aa
+++ ./src/polkitagent/polkitagenttextlistener.c	2022-10-21 17:21:11.227665209 +0200
ecb1aa
@@ -121,6 +121,12 @@ polkit_agent_text_listener_class_init (P
ecb1aa
   listener_class = POLKIT_AGENT_LISTENER_CLASS (klass);
ecb1aa
   listener_class->initiate_authentication        = polkit_agent_text_listener_initiate_authentication;
ecb1aa
   listener_class->initiate_authentication_finish = polkit_agent_text_listener_initiate_authentication_finish;
ecb1aa
+
ecb1aa
+  g_signal_new("tty_attrs_changed",
ecb1aa
+               G_TYPE_FROM_CLASS(gobject_class),
ecb1aa
+               G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
ecb1aa
+               0, NULL, NULL, NULL,
ecb1aa
+               G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
ecb1aa
 }
ecb1aa
 
ecb1aa
 /**
ecb1aa
@@ -268,6 +274,7 @@ on_request (PolkitAgentSession *session,
ecb1aa
    *       the problem.
ecb1aa
    */
ecb1aa
 
ecb1aa
+  g_signal_emit_by_name(listener, "tty_attrs_changed", TRUE);
ecb1aa
   tcgetattr (fileno (listener->tty), &ts);
ecb1aa
   ots = ts;
ecb1aa
   ts.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);
ecb1aa
@@ -296,6 +303,7 @@ on_request (PolkitAgentSession *session,
ecb1aa
         }
ecb1aa
     }
ecb1aa
   tcsetattr (fileno (listener->tty), TCSAFLUSH, &ots;;
ecb1aa
+  g_signal_emit_by_name(listener, "tty_attrs_changed", FALSE);
ecb1aa
   putc ('\n', listener->tty);
ecb1aa
 
ecb1aa
   polkit_agent_session_response (session, str->str);
ecb1aa
diff -up ./src/programs/pkttyagent.c.ori ./src/programs/pkttyagent.c
ecb1aa
--- ./src/programs/pkttyagent.c.ori	2020-01-28 14:16:32.000000000 +0100
ecb1aa
+++ ./src/programs/pkttyagent.c	2022-10-21 16:56:12.449760361 +0200
ecb1aa
@@ -34,6 +34,7 @@
ecb1aa
 
ecb1aa
 
ecb1aa
 static volatile sig_atomic_t tty_flags_saved;
ecb1aa
+static volatile sig_atomic_t tty_flags_changed;
ecb1aa
 struct termios ts;
ecb1aa
 FILE *tty = NULL;
ecb1aa
 struct sigaction savesigterm, savesigint, savesigtstp;
ecb1aa
@@ -54,7 +55,7 @@ static void tty_handler(int signal)
ecb1aa
       break;
ecb1aa
   }
ecb1aa
 
ecb1aa
-  if (tty_flags_saved)
ecb1aa
+  if (tty_flags_saved && tty_flags_changed)
ecb1aa
   {
ecb1aa
     tcsetattr (fileno (tty), TCSADRAIN, &ts);
ecb1aa
   }
ecb1aa
@@ -63,6 +64,14 @@ static void tty_handler(int signal)
ecb1aa
 }
ecb1aa
 
ecb1aa
 
ecb1aa
+static void tty_attrs_changed(PolkitAgentListener *listener G_GNUC_UNUSED,
ecb1aa
+                              gboolean changed,
ecb1aa
+                              gpointer user_data G_GNUC_UNUSED)
ecb1aa
+{
ecb1aa
+  tty_flags_changed = changed;
ecb1aa
+}
ecb1aa
+
ecb1aa
+
ecb1aa
 int
ecb1aa
 main (int argc, char *argv[])
ecb1aa
 {
ecb1aa
@@ -221,6 +230,9 @@ main (int argc, char *argv[])
ecb1aa
       ret = 127;
ecb1aa
       goto out;
ecb1aa
     }
ecb1aa
+  g_signal_connect(G_OBJECT(listener), "tty_attrs_changed",
ecb1aa
+                   G_CALLBACK(tty_attrs_changed), NULL);
ecb1aa
+
ecb1aa
   local_agent_handle = polkit_agent_listener_register_with_options (listener,
ecb1aa
                                                                     POLKIT_AGENT_REGISTER_FLAGS_RUN_IN_THREAD,
ecb1aa
                                                                     subject,