@@ -1444,13 +1444,12 @@ static int listen_control_msg(struct ctx *ctx, uint32_t net)
14441444{
14451445 struct sockaddr_mctp addr = { 0 };
14461446 int rc , sd = -1 , val ;
1447- char * failed ;
1448- cap_t cap ;
14491447
14501448 sd = mctp_ops .mctp .socket ();
14511449 if (sd < 0 ) {
1452- failed = "socket()" ;
1453- goto warn_out ;
1450+ rc = - errno ;
1451+ warn ("%s: socket() failed" , __func__ );
1452+ goto out ;
14541453 }
14551454
14561455 addr .smctp_family = AF_MCTP ;
@@ -1461,26 +1460,9 @@ static int listen_control_msg(struct ctx *ctx, uint32_t net)
14611460
14621461 rc = mctp_ops .mctp .bind (sd , (struct sockaddr * )& addr , sizeof (addr ));
14631462 if (rc < 0 ) {
1464- failed = "bind()" ;
1465- goto warn_out ;
1466- }
1467-
1468- cap = cap_from_text ("CAP_NET_ADMIN=pe" );
1469- if (!cap ) {
1470- failed = "cap_from_text()" ;
1471- goto warn_out ;
1472- }
1473-
1474- rc = cap_set_proc (cap );
1475- if (rc < 0 ) {
1476- failed = "cap_set_proc()" ;
1477- goto cap_out ;
1478- }
1479-
1480- cap_free (cap );
1481- if (rc < 0 ) {
1482- failed = "cap_free()" ;
1483- goto warn_out ;
1463+ rc = - errno ;
1464+ warn ("%s: bind() failed" , __func__ );
1465+ goto out ;
14841466 }
14851467
14861468 val = 1 ;
@@ -1496,15 +1478,6 @@ static int listen_control_msg(struct ctx *ctx, uint32_t net)
14961478 cb_listen_control_msg , ctx );
14971479 return rc ;
14981480
1499- cap_out :
1500- rc = - errno ;
1501- warn ("%s: %s failed" , __func__ , failed );
1502- cap_free (cap );
1503- goto out ;
1504-
1505- warn_out :
1506- rc = - errno ;
1507- warn ("%s: %s failed" , __func__ , failed );
15081481out :
15091482 if (rc < 0 ) {
15101483 close (sd );
@@ -6371,10 +6344,38 @@ static int endpoint_allocate_eids(struct peer *peer)
63716344 return 0 ;
63726345}
63736346
6347+ int set_cap (char * str )
6348+ {
6349+ cap_t cap = cap_from_text (str );
6350+ int rc ;
6351+
6352+ if (!cap ) {
6353+ rc = - errno ;
6354+ warnx ("Failed allocating capability state: %s, %s %d" , str ,
6355+ strerror (- rc ), rc );
6356+ return rc ;
6357+ }
6358+
6359+ rc = cap_set_proc (cap );
6360+ if (rc < 0 ) {
6361+ rc = - errno ;
6362+ warnx ("Could not set capabilites: %s, %s %d" , str ,
6363+ strerror (- rc ), rc );
6364+ return rc ;
6365+ }
6366+
6367+ rc = cap_free (cap );
6368+ if (rc < 0 ) {
6369+ rc = - errno ;
6370+ warnx ("Failed freeing capability state" );
6371+ return errno ;
6372+ }
6373+ return 0 ;
6374+ }
6375+
63746376int main (int argc , char * * argv )
63756377{
63766378 struct ctx ctxi = { 0 }, * ctx = & ctxi ;
6377- cap_t cap ;
63786379 int rc ;
63796380
63806381 setlinebuf (stdout );
@@ -6394,25 +6395,9 @@ int main(int argc, char **argv)
63946395 err (EXIT_FAILURE , "Can't read configuration" );
63956396 }
63966397
6397- cap = cap_from_text ("CAP_NET_BIND_SERVICE=pe CAP_NET_ADMIN=p" );
6398- if (!cap ) {
6399- warnx ("Failed allocating capability state, %s %d" ,
6400- strerror (errno ), - errno );
6401- return 1 ;
6402- }
6403-
6404- rc = cap_set_proc (cap );
6405- if (rc < 0 ) {
6406- warnx ("Could not set capabilites %s %d" , strerror (errno ),
6407- - errno );
6408- return 1 ;
6409- }
6410-
6411- rc = cap_free (cap );
6412- if (rc < 0 ) {
6413- warnx ("Failed freeing capability state" );
6398+ rc = set_cap ("CAP_NET_BIND_SERVICE=p CAP_NET_ADMIN=p" );
6399+ if (rc < 0 )
64146400 return 1 ;
6415- }
64166401
64176402 ctx -> nl = mctp_nl_new (false);
64186403 if (!ctx -> nl ) {
@@ -6440,13 +6425,21 @@ int main(int argc, char **argv)
64406425 if (rc < 0 )
64416426 return 1 ;
64426427
6428+ rc = set_cap ("CAP_NET_BIND_SERVICE=pe CAP_NET_ADMIN=p" );
6429+ if (rc < 0 )
6430+ return 1 ;
6431+
64436432 // TODO add net argument?
64446433 rc = listen_control_msg (ctx , MCTP_NET_ANY );
64456434 if (rc < 0 ) {
64466435 warnx ("Error in listen, returned %s %d" , strerror (- rc ), rc );
64476436 return 1 ;
64486437 }
64496438
6439+ rc = set_cap ("CAP_NET_ADMIN=pe" );
6440+ if (rc < 0 )
6441+ return 1 ;
6442+
64506443 // All setup must be complete by here, we might immediately
64516444 // get requests from waiting clients.
64526445 rc = request_dbus (ctx );
0 commit comments