<div dir="ltr"><div>Thanks for the detailed explanation!</div><div><br></div><div>
Calling g_dbus_method_invocation_get_sender()

and then 
GetConnectionUnixProcessID 

work and I can get the peer's PID now.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, May 23, 2022 at 2:15 PM Simon McVittie <<a href="mailto:smcv@collabora.com">smcv@collabora.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Sun, 22 May 2022 at 11:40:35 +0300, Amira S wrote:<br>
> Any idea if/how it is possible to get the peer's PID connecting to a SYSTEM<br>
> bus?<br>
<br>
g_dbus_method_invocation_get_sender() will tell you the peer's<br>
unique connection name, and then you can look that up with<br>
GetConnectionUnixProcessID or GetConnectionCredentials to get the process<br>
ID (for example you might use g_dbus_connection_call() to call one of<br>
those methods).<br>
<br>
polkit <<a href="https://gitlab.freedesktop.org/polkit/polkit/" rel="noreferrer" target="_blank">https://gitlab.freedesktop.org/polkit/polkit/</a>> is an example of a<br>
system service that does this.<br>
<br>
> According to the documentation, it is possible to obtain a GCredentials from<br>
> the connection by calling [1]g_dbus_connection_get_peer_credentials, (and from<br>
> there I can get a unix ucred that has the pid), but I always get a NULL<br>
> credentials.<br>
> The documentation for this function says: <br>
> "Gets the credentials of the authenticated peer. This will always return [2]<br>
> NULL unless connection acted as a server<br>
<br>
You are not the server, so the documentation correctly says that it will<br>
return NULL for you.<br>
<br>
Normal use of D-Bus on the system or session bus is in a "star" topology,<br>
where the message bus (dbus-daemon or dbus-broker) is the middle of the<br>
star, and all clients and services are at the points of the star:<br>
<br>
                app 2         }<br>
                  |           } (AF_UNIX socket clients)<br>
          app 1   |   app 3   }<br>
              \   |    /<br>
               \  |   /<br>
              message bus (AF_UNIX socket server)<br>
               /   |  \<br>
              /    |   \<br>
        service A  |  service C }<br>
                   |            } (also AF_UNIX socket clients)<br>
               service B        }<br>
<br>
We often talk about services as though they were something special,<br>
but there is not really any fundamental difference between services and<br>
other applications: they're all clients of the message bus. The role of<br>
the message bus is often called a "broker" in other IPC protocols.<br>
<br>
Depending who you ask, a service is either a D-Bus peer that owns a<br>
well-known name like "com.microsoft.mscrypt", or a D-Bus peer that was<br>
started automatically by the message bus to provide the implementation of<br>
a well-known name, or a D-Bus peer that provides methods to be called by<br>
other peers. In practice, most peers that are referred to as "services"<br>
do all of these things.<br>
<br>
> I also tried getting the PID by calling programmatically the following command:<br>
> <br>
> dbus-send --system --print-reply --dest=org.freedesktop.DBus  /org/freedesktop/<br>
> DBus org.freedesktop.DBus.GetConnectionUnixProcessID<br>
> ‘string:com.microsoft.mscrypt’<br>
> <br>
> But I always receive the server's PID, and not the client's.<br>
<br>
No, you receive the process ID of the service that owns the name<br>
"com.microsoft.mscrypt". Don't confuse the service (a high-level concept)<br>
with the AF_UNIX server (a lower-level concept).<br>
<br>
If you are using GDBus, you should call D-Bus methods with something like<br>
g_dbus_connection_call() or g_dbus_connection_call_sync(),<br>
g_dbus_proxy_call() or client code generated by gdbus-codegen, instead of<br>
running dbus-send as a subprocess (which does the same thing, but less<br>
efficiently).<br>
<br>
    smcv<br>
</blockquote></div>