static int bus_get_audit_data( DBusConnection *connection, const char *name, struct auditstruct *audit, DBusError *error) { pid_t pid; int r; pid = bus_get_unix_process_id(connection, name, error); if (pid <= 0) return -EIO; r = audit_loginuid_from_pid(pid, &audit->loginuid); if (r < 0) return r; r = get_process_uid(pid, &audit->uid); if (r < 0) return r; r = get_process_gid(pid, &audit->gid); if (r < 0) return r; r = get_process_cmdline(pid, 0, true, &audit->cmdline); if (r < 0) return r; return 0; }
static int get_audit_data( DBusConnection *connection, DBusMessage *message, struct auditstruct *audit, DBusError *error) { const char *sender; int r, fd; struct ucred ucred; socklen_t len; sender = dbus_message_get_sender(message); if (sender) return bus_get_audit_data(connection, sender, audit, error); if (!dbus_connection_get_unix_fd(connection, &fd)) return -EINVAL; r = getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &ucred, &len); if (r < 0) { log_error("Failed to determine peer credentials: %m"); return -errno; } audit->uid = ucred.uid; audit->gid = ucred.gid; r = audit_loginuid_from_pid(ucred.pid, &audit->loginuid); if (r < 0) return r; r = get_process_cmdline(ucred.pid, LINE_MAX, true, &audit->cmdline); if (r < 0) return r; return 0; }