@@ -640,10 +640,12 @@ static int hyper_new_container(struct hyper_pod *pod, char *json, int length)
640
640
return ret ;
641
641
}
642
642
643
- static int hyper_kill_container (struct hyper_pod * pod , char * json , int length )
643
+ static int hyper_kill_container (struct hyper_pod * pod , char * json , int length , uint8_t * * rmsg )
644
644
{
645
645
struct hyper_container * c ;
646
646
int ret = -1 ;
647
+ size_t message_len = 0 ;
648
+ const char * emsg = NULL ;
647
649
648
650
JSON_Value * value = hyper_json_parse (json , length );
649
651
if (value == NULL ) {
@@ -654,13 +656,36 @@ static int hyper_kill_container(struct hyper_pod *pod, char *json, int length)
654
656
c = hyper_find_container (pod , id );
655
657
if (c == NULL ) {
656
658
fprintf (stderr , "can not find container whose id is %s\n" , id );
659
+ emsg = "no such container" ;
657
660
goto out ;
658
661
}
659
662
660
- kill (c -> exec .pid , (int )json_object_get_number (json_object (value ), "signal" ));
661
- ret = 0 ;
663
+ ret = kill (c -> exec .pid , (int )json_object_get_number (json_object (value ), "signal" ));
664
+ if (ret < 0 ) {
665
+ switch (errno ) {
666
+ case EINVAL :
667
+ emsg = "invalid signal" ;
668
+ break ;
669
+ case EPERM :
670
+ emsg = "no permission" ;
671
+ break ;
672
+ case ESRCH :
673
+ emsg = "no such process" ;
674
+ break ;
675
+ default :
676
+ emsg = "kill failed" ;
677
+ break ;
678
+ }
679
+ }
662
680
out :
663
681
json_value_free (value );
682
+ if (emsg != NULL ) {
683
+ message_len = strlen (emsg ) + 1 ;
684
+ * rmsg = (uint8_t * )malloc (message_len );
685
+ if (* rmsg != NULL ) {
686
+ strncpy ((char * )* rmsg , emsg , message_len );
687
+ }
688
+ }
664
689
return ret ;
665
690
}
666
691
@@ -1209,7 +1234,10 @@ static int hyper_ctlmsg_handle(struct hyper_event *he, uint32_t len)
1209
1234
ret = hyper_new_container (pod , (char * )buf -> data + 8 , len - 8 );
1210
1235
break ;
1211
1236
case KILLCONTAINER :
1212
- ret = hyper_kill_container (pod , (char * )buf -> data + 8 , len - 8 );
1237
+ ret = hyper_kill_container (pod , (char * )buf -> data + 8 , len - 8 , & data );
1238
+ if (data != NULL ) {
1239
+ datalen = strlen ((char * )data ) + 1 ;
1240
+ }
1213
1241
break ;
1214
1242
case REMOVECONTAINER :
1215
1243
ret = hyper_remove_container (pod , (char * )buf -> data + 8 , len - 8 );
0 commit comments