@@ -107,7 +107,8 @@ control_connection_message_log(ControlConnection *cc, GString *command, gpointer
107107}
108108
109109void
110- _wait_until_peer_disappears (ControlConnection * cc , gint max_seconds , gboolean * cancelled )
110+ _wait_until_peer_disappears (ControlConnection * cc , gint max_seconds , gboolean dont_release_console ,
111+ gboolean restore_initial_console , gboolean * cancelled )
111112{
112113 while (max_seconds != 0 && !(* cancelled ))
113114 {
@@ -116,29 +117,27 @@ _wait_until_peer_disappears(ControlConnection *cc, gint max_seconds, gboolean *c
116117 max_seconds -- ;
117118 control_connection_send_batched_reply (cc , g_string_new ("ALIVE\n" ));
118119 }
119- console_release (TRUE);
120+ if (FALSE == dont_release_console )
121+ console_release (restore_initial_console );
120122}
121123
122- static void
123- control_connection_attach (ControlConnection * cc , GString * command , gpointer user_data , gboolean * cancelled )
124+ typedef struct _AttachCommandArgs
124125{
125- MainLoop * main_loop = (MainLoop * ) user_data ;
126- gchar * * cmds = g_strsplit (command -> str , " " , 4 );
127-
128- GString * result = g_string_sized_new (128 );
129- gint n_seconds = -1 ;
130- gboolean start_debugger = FALSE;
131- struct
132- {
133- gboolean log_stderr ;
134- gint log_level ;
135- } old_values , new_values ;
126+ gboolean start_debugger ;
127+ gboolean restore_console_on_release ;
128+ gboolean dont_release_console ;
129+ gint n_seconds ;
130+ gboolean log_stderr ;
131+ gint log_level ;
132+ } AttachCommandArgs ;
136133
137- old_values .log_stderr = log_stderr ;
138- old_values .log_level = msg_get_log_level ();
139- new_values = old_values ;
134+ static gboolean
135+ _parse_attach_command_args (GString * command , AttachCommandArgs * args , GString * result )
136+ {
137+ gboolean success = FALSE;
138+ gchar * * cmds = g_strsplit (command -> str , " " , 6 );
140139
141- if (! cmds [1 ])
140+ if (cmds [1 ] == NULL )
142141 {
143142 g_string_assign (result , "FAIL Invalid arguments received" );
144143 goto exit ;
@@ -150,18 +149,18 @@ control_connection_attach(ControlConnection *cc, GString *command, gpointer user
150149 }
151150 else if (g_str_equal (cmds [1 ], "LOGS" ))
152151 {
153- new_values . log_stderr = TRUE;
154- if (cmds [3 ])
155- new_values . log_level = msg_map_string_to_log_level (cmds [3 ]);
156- if (new_values . log_level < 0 )
152+ args -> log_stderr = TRUE;
153+ if (cmds [5 ])
154+ args -> log_level = msg_map_string_to_log_level (cmds [5 ]);
155+ if (args -> log_level < 0 )
157156 {
158157 g_string_assign (result , "FAIL Invalid log level" );
159158 goto exit ;
160159 }
161160 }
162161 else if (g_str_equal (cmds [1 ], "DEBUGGER" ))
163162 {
164- start_debugger = TRUE;
163+ args -> start_debugger = TRUE;
165164 }
166165 else
167166 {
@@ -170,49 +169,82 @@ control_connection_attach(ControlConnection *cc, GString *command, gpointer user
170169 }
171170
172171 if (cmds [2 ])
173- n_seconds = atoi (cmds [2 ]);
172+ args -> n_seconds = atoi (cmds [2 ]);
173+
174+ if (cmds [3 ])
175+ args -> restore_console_on_release = (FALSE == (gboolean ) atoi (cmds [3 ]));
176+
177+ if (cmds [4 ])
178+ args -> dont_release_console = (gboolean ) atoi (cmds [4 ]);
179+
180+ success = TRUE;
181+
182+ exit :
183+ g_strfreev (cmds );
184+ return success ;
185+ }
186+
187+ static void
188+ control_connection_attach (ControlConnection * cc , GString * command , gpointer user_data , gboolean * cancelled )
189+ {
190+ MainLoop * main_loop = (MainLoop * ) user_data ;
191+ GString * result = g_string_sized_new (128 );
192+ struct {
193+ gboolean log_stderr ;
194+ gint log_level ;
195+ } old_values = {
196+ log_stderr ,
197+ msg_get_log_level ()
198+ };
199+ AttachCommandArgs cmd_args = {
200+ .start_debugger = FALSE,
201+ .restore_console_on_release = TRUE,
202+ .dont_release_console = FALSE,
203+ .n_seconds = -1 ,
204+ .log_stderr = old_values .log_stderr ,
205+ .log_level = old_values .log_level
206+ };
207+
208+ if (FALSE == _parse_attach_command_args (command , & cmd_args , result ))
209+ goto exit ;
174210
175211 gint fds [3 ];
176212 gsize num_fds = G_N_ELEMENTS (fds );
177- if (! control_connection_get_attached_fds (cc , fds , & num_fds ) || num_fds != 3 )
213+ if (FALSE == control_connection_get_attached_fds (cc , fds , & num_fds ) || num_fds != 3 )
178214 {
179215 g_string_assign (result ,
180216 "FAIL The underlying transport for syslog-ng-ctl does not support fd passing or incorrect number of fds received" );
181217 goto exit ;
182218 }
183219
184- if (! console_acquire_from_fds (fds , TRUE))
220+ if (FALSE == console_acquire_from_fds (fds , TRUE))
185221 {
186- g_string_assign (result ,
187- "FAIL Error acquiring console" );
222+ g_string_assign (result , "FAIL Error acquiring console" );
188223 goto exit ;
189224 }
190225
191- log_stderr = new_values .log_stderr ;
192- msg_set_log_level (new_values .log_level );
226+ log_stderr = cmd_args .log_stderr ;
227+ msg_set_log_level (cmd_args .log_level );
193228
194- if (start_debugger && ! debugger_is_running ())
229+ if (cmd_args . start_debugger && FALSE == debugger_is_running ())
195230 {
196231 //cfg_load_module(self->current_configuration, "mod-python");
197232 debugger_start (main_loop , main_loop_get_current_config (main_loop ));
198233 }
199234
200- _wait_until_peer_disappears (cc , n_seconds , cancelled );
235+ _wait_until_peer_disappears (cc , cmd_args . n_seconds , cmd_args . dont_release_console , cmd_args . restore_console_on_release , cancelled );
201236
202- if (start_debugger && debugger_is_running ())
203- {
237+ if (cmd_args .start_debugger && debugger_is_running ())
204238 debugger_stop ();
205- }
206239
207240 log_stderr = old_values .log_stderr ;
208241 msg_set_log_level (old_values .log_level );
209242
210243 g_string_assign (result , "OK [console output ends here]" );
211- exit :
212244
245+ exit :
213246 control_connection_send_batched_reply (cc , result );
214247 control_connection_send_close_batch (cc );
215- g_strfreev (cmds );
216248}
217249
218250static void
0 commit comments