2022-10-26 09:02:14 +03:00
/* SPDX-License-Identifier: MIT-0 */
2021-10-01 13:44:33 +03:00
2018-07-26 21:00:36 +03:00
/* This is equivalent to:
* busctl call org . freedesktop . systemd1 / org / freedesktop / systemd1 \
* org . freedesktop . systemd1 . Manager GetUnitByPID $ $
*
2023-03-29 23:45:10 +03:00
* Compile with ' cc print - unit - path . c - lsystemd '
2018-07-26 21:00:36 +03:00
*/
2023-03-29 23:45:10 +03:00
# include <errno.h>
# include <stdio.h>
# include <sys/types.h>
# include <unistd.h>
# include <systemd/sd-bus.h>
# define _cleanup_(f) __attribute__((cleanup(f)))
2018-07-26 21:00:36 +03:00
# define DESTINATION "org.freedesktop.systemd1"
# define PATH " / org / freedesktop / systemd1"
# define INTERFACE "org.freedesktop.systemd1.Manager"
# define MEMBER "GetUnitByPID"
static int log_error ( int error , const char * message ) {
2022-10-07 17:19:21 +03:00
errno = - error ;
fprintf ( stderr , " %s: %m \n " , message ) ;
2018-07-26 21:00:36 +03:00
return error ;
}
2023-03-29 23:45:10 +03:00
int main ( int argc , char * * argv ) {
_cleanup_ ( sd_bus_flush_close_unrefp ) sd_bus * bus = NULL ;
2018-07-26 21:00:36 +03:00
_cleanup_ ( sd_bus_error_free ) sd_bus_error error = SD_BUS_ERROR_NULL ;
2023-03-29 23:45:10 +03:00
_cleanup_ ( sd_bus_message_unrefp ) sd_bus_message * reply = NULL , * m = NULL ;
2018-07-26 21:00:36 +03:00
int r ;
2023-03-29 23:45:10 +03:00
r = sd_bus_open_system ( & bus ) ;
if ( r < 0 )
return log_error ( r , " Failed to acquire bus " ) ;
2018-07-26 21:00:36 +03:00
r = sd_bus_message_new_method_call ( bus , & m ,
DESTINATION , PATH , INTERFACE , MEMBER ) ;
if ( r < 0 )
return log_error ( r , " Failed to create bus message " ) ;
r = sd_bus_message_append ( m , " u " , ( unsigned ) getpid ( ) ) ;
if ( r < 0 )
return log_error ( r , " Failed to append to bus message " ) ;
r = sd_bus_call ( bus , m , - 1 , & error , & reply ) ;
if ( r < 0 )
2023-03-29 23:45:10 +03:00
return log_error ( r , MEMBER " call failed " ) ;
2018-07-26 21:00:36 +03:00
const char * ans ;
r = sd_bus_message_read ( reply , " o " , & ans ) ;
if ( r < 0 )
return log_error ( r , " Failed to read reply " ) ;
printf ( " Unit path is \" %s \" . \n " , ans ) ;
return 0 ;
}