@@ -56,11 +56,6 @@ struct dump_as_is_arg_s {
56
56
guint count_errors ;
57
57
};
58
58
59
- struct command_s {
60
- const gchar * name ;
61
- int (* action ) (int argc , char * * args );
62
- };
63
-
64
59
struct child_info_s {
65
60
char * key ;
66
61
char * group ;
@@ -308,29 +303,12 @@ open_cnx(void)
308
303
}
309
304
310
305
static int
311
- send_commandf (void (* dumper )(FILE * , void * ), void * udata , const char * fmt , ...)
312
- {
313
- FILE * req_stream ;
314
- if (NULL != (req_stream = open_cnx ())) {
315
- va_list va ;
316
- va_start (va , fmt );
317
- vfprintf (req_stream , fmt , va );
318
- va_end (va );
319
-
320
- fflush (req_stream );
321
- dumper (req_stream , udata );
322
- fclose (req_stream );
323
- return 1 ;
324
- }
325
-
326
- return 0 ;
327
- }
328
-
329
- static int
330
- send_commandv (void (* dumper )(FILE * , void * ), void * udata , int argc , char * * args )
306
+ send_commandv (void (* dumper )(FILE * , void * ), void * udata , const char * cmd , int argc , char * * args )
331
307
{
332
308
FILE * req_stream ;
333
309
if (NULL != (req_stream = open_cnx ())) {
310
+ fputs (cmd , req_stream );
311
+ fputc (' ' , req_stream );
334
312
for (int i = 0 ; i < argc ;i ++ ) {
335
313
fputs (args [i ], req_stream );
336
314
fputc (' ' , req_stream );
@@ -355,7 +333,7 @@ _fetch_services(void)
355
333
jobs = read_services_list (in_stream );
356
334
}
357
335
358
- int rc = send_commandv (_on_reply , NULL , 1 , (char * []){"status" , NULL });
336
+ int rc = send_commandv (_on_reply , NULL , "status" , 0 , (char * []){NULL });
359
337
if (!rc ) {
360
338
g_list_free_full (jobs , (GDestroyNotify )child_info_free );
361
339
return NULL ;
@@ -370,15 +348,14 @@ _filter_services(GList *original, char **filters, int *counters)
370
348
gboolean matches (struct child_info_s * ci ) {
371
349
for (int i = 0 ; filters [i ] ;i ++ ) {
372
350
const char * pattern = filters [i ];
373
- int * pcounter = counters + i ;
374
351
if (pattern [0 ]== '@' ) {
375
352
if (gridinit_group_in_set (pattern + 1 , ci -> group )) {
376
- ( * pcounter ) ++ ;
353
+ if ( counters ) counters [ i ] ++ ;
377
354
return TRUE;
378
355
}
379
356
} else {
380
357
if (!g_ascii_strcasecmp (ci -> key , pattern )) {
381
- ( * pcounter ) ++ ;
358
+ if ( counters ) counters [ i ] ++ ;
382
359
return TRUE;
383
360
}
384
361
}
@@ -400,11 +377,11 @@ command_status(int lvl, int argc, char **args)
400
377
{
401
378
char fmt_title [256 ], fmt_line [256 ];
402
379
403
- int * counters = alloca (sizeof (int ) * (argc - 1 ));
404
- memset (counters , 0 , sizeof (int ) * (argc - 1 ));
380
+ int * counters = alloca (sizeof (int ) * (argc + 1 ));
381
+ memset (counters , 0 , sizeof (int ) * (argc + 1 ));
405
382
406
383
GList * all_jobs = _fetch_services ();
407
- GList * jobs = _filter_services (all_jobs , args + 1 , counters );
384
+ GList * jobs = _filter_services (all_jobs , args , counters );
408
385
409
386
/* compute the max length of several variable field, for well aligned
410
387
* columns on the output. */
@@ -491,7 +468,7 @@ command_status(int lvl, int argc, char **args)
491
468
492
469
/* If patterns have been specified, we must find items (the user
493
470
* expects something to show up */
494
- for (int i = 0 ; i < argc - 1 ;i ++ ) {
471
+ for (int i = 0 ; i < argc ;i ++ ) {
495
472
if (!counters [i ])
496
473
count_misses ++ ;
497
474
}
@@ -524,27 +501,54 @@ static int
524
501
command_start (int argc , char * * args )
525
502
{
526
503
struct dump_as_is_arg_s dump_args = {};
527
- int rc = send_commandv (dump_as_is , & dump_args , argc , args );
504
+ int rc = send_commandv (dump_as_is , & dump_args , "start" , argc , args );
528
505
return !rc
529
506
|| dump_args .count_errors != 0
530
507
|| dump_args .count_success == 0 ;
531
508
}
532
509
533
510
static int
534
- command_stop (int argc , char * * args )
511
+ command_kill (int argc , char * * args )
535
512
{
536
513
struct dump_as_is_arg_s dump_args = {};
537
- int rc = send_commandv (dump_as_is , & dump_args , argc , args );
514
+ int rc = send_commandv (dump_as_is , & dump_args , "stop" , argc , args );
538
515
return !rc
539
516
|| dump_args .count_errors != 0
540
517
|| dump_args .count_success == 0 ;
541
518
}
542
519
520
+ static int
521
+ command_stop (int argc , char * * args )
522
+ {
523
+ gboolean _all_down (void ) {
524
+ gboolean rc = TRUE;
525
+ GList * all_jobs = _fetch_services ();
526
+ GList * jobs = _filter_services (all_jobs , args , NULL );
527
+ for (GList * l = jobs ; l ;l = l -> next ) {
528
+ struct child_info_s * ci = l -> data ;
529
+ if (ci -> pid > 0 )
530
+ rc = FALSE;
531
+ }
532
+ g_list_free_full (all_jobs , (GDestroyNotify )child_info_free );
533
+ g_list_free (jobs );
534
+ return rc ;
535
+ }
536
+
537
+ while (!_all_down ()) {
538
+ g_print ("# Stopping...\n" );
539
+ int rc = command_kill (argc , args );
540
+ if (rc != 0 )
541
+ return rc ;
542
+ g_usleep (G_TIME_SPAN_SECOND );
543
+ }
544
+ return 0 ;
545
+ }
546
+
543
547
static int
544
548
command_restart (int argc , char * * args )
545
549
{
546
550
struct dump_as_is_arg_s dump_args = {};
547
- int rc = send_commandv (dump_as_is , & dump_args , argc , args );
551
+ int rc = send_commandv (dump_as_is , & dump_args , "restart" , argc , args );
548
552
return !rc
549
553
|| dump_args .count_errors != 0
550
554
|| dump_args .count_success == 0 ;
@@ -554,7 +558,7 @@ static int
554
558
command_repair (int argc , char * * args )
555
559
{
556
560
struct dump_as_is_arg_s dump_args = {};
557
- int rc = send_commandv (dump_as_is , & dump_args , argc , args );
561
+ int rc = send_commandv (dump_as_is , & dump_args , "repair" , argc , args );
558
562
return !rc
559
563
|| dump_args .count_errors != 0
560
564
|| dump_args .count_success == 0 ;
@@ -565,7 +569,7 @@ command_reload(int argc, char **args)
565
569
{
566
570
struct dump_as_is_arg_s dump_args = {};
567
571
(void ) argc , (void ) args ;
568
- int rc = send_commandf (dump_as_is , & dump_args , "reload\n" );
572
+ int rc = send_commandv (dump_as_is , & dump_args , "reload" , 0 , ( char * []){ NULL } );
569
573
return !rc
570
574
|| dump_args .count_errors != 0
571
575
|| dump_args .count_success == 0 ;
@@ -574,13 +578,17 @@ command_reload(int argc, char **args)
574
578
575
579
/* ------------------------------------------------------------------------- */
576
580
577
- static struct command_s COMMANDS [] = {
578
- { "status" , command_status0 },
579
- { "status2" , command_status1 },
580
- { "status3" , command_status2 },
581
- { "start" , command_start },
582
- { "stop" , command_stop },
583
- { "restart" , command_restart },
581
+ struct command_s {
582
+ const gchar * name ;
583
+ int (* action ) (int argc , char * * args );
584
+ } COMMANDS [] = {
585
+ { "status" , command_status0 },
586
+ { "status2" , command_status1 },
587
+ { "status3" , command_status2 },
588
+ { "start" , command_start },
589
+ { "stop" , command_stop },
590
+ { "kill" , command_kill },
591
+ { "restart" , command_restart },
584
592
{ "reload" , command_reload },
585
593
{ "repair" , command_repair },
586
594
{ NULL , NULL }
@@ -652,7 +660,7 @@ main(int argc, char ** args)
652
660
653
661
for (cmd = COMMANDS ; cmd -> name ;cmd ++ ) {
654
662
if (0 == g_ascii_strcasecmp (cmd -> name , args [opt_index ])) {
655
- int rc = cmd -> action (argc - opt_index , args + opt_index );
663
+ int rc = cmd -> action (argc - ( opt_index + 1 ) , args + ( opt_index + 1 ) );
656
664
close (1 );
657
665
close (2 );
658
666
return rc ;
0 commit comments