本文整理汇总了C++中sd_bus_message_enter_container函数的典型用法代码示例。如果您正苦于以下问题:C++ sd_bus_message_enter_container函数的具体用法?C++ sd_bus_message_enter_container怎么用?C++ sd_bus_message_enter_container使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了sd_bus_message_enter_container函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: count_addresses
static int count_addresses(sd_bus_message *m, int af, const char **canonical) {
int c = 0, r, ifindex;
assert(m);
assert(canonical);
r = sd_bus_message_read(m, "i", &ifindex);
if (r < 0)
return r;
r = sd_bus_message_enter_container(m, 'a', "(iay)");
if (r < 0)
return r;
while ((r = sd_bus_message_enter_container(m, 'r', "iay")) > 0) {
int family;
r = sd_bus_message_read(m, "i", &family);
if (r < 0)
return r;
r = sd_bus_message_skip(m, "ay");
if (r < 0)
return r;
r = sd_bus_message_exit_container(m);
if (r < 0)
return r;
if (af != AF_UNSPEC && family != af)
continue;
c ++;
}
if (r < 0)
return r;
r = sd_bus_message_exit_container(m);
if (r < 0)
return r;
r = sd_bus_message_read(m, "s", canonical);
if (r < 0)
return r;
r = sd_bus_message_rewind(m, true);
if (r < 0)
return r;
return c;
}
开发者ID:275288698,项目名称:systemd-ubuntu-with-dbus,代码行数:51,代码来源:nss-resolve.c
示例2: sd_bus_get_property_strv
_public_ int sd_bus_get_property_strv(
sd_bus *bus,
const char *destination,
const char *path,
const char *interface,
const char *member,
sd_bus_error *error,
char ***ret) {
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
int r;
assert_return(bus, -EINVAL);
assert_return(isempty(interface) || interface_name_is_valid(interface), -EINVAL);
assert_return(member_name_is_valid(member), -EINVAL);
assert_return(ret, -EINVAL);
assert_return(!bus_pid_changed(bus), -ECHILD);
if (!BUS_IS_OPEN(bus->state))
return -ENOTCONN;
r = sd_bus_call_method(bus, destination, path, "org.freedesktop.DBus.Properties", "Get", error, &reply, "ss", strempty(interface), member);
if (r < 0)
return r;
r = sd_bus_message_enter_container(reply, 'v', NULL);
if (r < 0)
return r;
r = sd_bus_message_read_strv(reply, ret);
if (r < 0)
return r;
return 0;
}
开发者ID:chenyf,项目名称:systemd,代码行数:35,代码来源:bus-convenience.c
示例3: kbdctx_set_locale
static int kbdctx_set_locale(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
kbdctx *kc = userdata;
const char *s, *ctype = NULL, *lang = NULL;
int r;
r = sd_bus_message_enter_container(m, 'a', "s");
if (r < 0)
goto error;
while ((r = sd_bus_message_read(m, "s", &s)) > 0) {
if (!ctype)
ctype = startswith(s, "LC_CTYPE=");
if (!lang)
lang = startswith(s, "LANG=");
}
if (r < 0)
goto error;
r = sd_bus_message_exit_container(m);
if (r < 0)
goto error;
kbdctx_refresh_compose_table(kc, ctype ? : lang);
r = 0;
error:
if (r < 0)
log_debug_errno(r, "idev-keyboard: cannot parse locale property from locale1: %m");
return r;
}
开发者ID:RaghavanSanthanam,项目名称:systemd,代码行数:32,代码来源:idev-keyboard.c
示例4: sd_bus_get_property_trivial
_public_ int sd_bus_get_property_trivial(
sd_bus *bus,
const char *destination,
const char *path,
const char *interface,
const char *member,
sd_bus_error *error,
char type, void *ptr) {
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
int r;
assert_return(bus, -EINVAL);
assert_return(isempty(interface) || interface_name_is_valid(interface), -EINVAL);
assert_return(member_name_is_valid(member), -EINVAL);
assert_return(bus_type_is_trivial(type), -EINVAL);
assert_return(ptr, -EINVAL);
assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
assert_return(!bus_pid_changed(bus), -ECHILD);
r = sd_bus_call_method(bus, destination, path, "org.freedesktop.DBus.Properties", "Get", error, &reply, "ss", strempty(interface), member);
if (r < 0)
return r;
r = sd_bus_message_enter_container(reply, 'v', CHAR_TO_STR(type));
if (r < 0)
return r;
r = sd_bus_message_read_basic(reply, type, ptr);
if (r < 0)
return r;
return 0;
}
开发者ID:ariscop,项目名称:systemd,代码行数:34,代码来源:bus-convenience.c
示例5: print_inhibitors
static void print_inhibitors(sd_bus *bus) {
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
const char *what, *who, *why, *mode;
uint32_t uid, pid;
unsigned n = 0;
int r;
r = sd_bus_call_method(bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
"ListInhibitors",
&error,
&reply,
"");
assert_se(r >= 0);
r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "(ssssuu)");
assert_se(r >= 0);
while ((r = sd_bus_message_read(reply, "(ssssuu)", &what, &who, &why, &mode, &uid, &pid)) > 0) {
printf("what=<%s> who=<%s> why=<%s> mode=<%s> uid=<%"PRIu32"> pid=<%"PRIu32">\n",
what, who, why, mode, uid, pid);
n++;
}
assert_se(r >= 0);
printf("%u inhibitors\n", n);
}
开发者ID:275288698,项目名称:systemd-ubuntu-with-dbus,代码行数:31,代码来源:test-inhibit.c
示例6: sd_bus_get_property
_public_ int sd_bus_get_property(
sd_bus *bus,
const char *destination,
const char *path,
const char *interface,
const char *member,
sd_bus_error *error,
sd_bus_message **reply,
const char *type) {
sd_bus_message *rep = NULL;
int r;
assert_return(bus, -EINVAL);
assert_return(isempty(interface) || interface_name_is_valid(interface), -EINVAL);
assert_return(member_name_is_valid(member), -EINVAL);
assert_return(reply, -EINVAL);
assert_return(signature_is_single(type, false), -EINVAL);
assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
assert_return(!bus_pid_changed(bus), -ECHILD);
r = sd_bus_call_method(bus, destination, path, "org.freedesktop.DBus.Properties", "Get", error, &rep, "ss", strempty(interface), member);
if (r < 0)
return r;
r = sd_bus_message_enter_container(rep, 'v', type);
if (r < 0) {
sd_bus_message_unref(rep);
return r;
}
*reply = rep;
return 0;
}
开发者ID:ariscop,项目名称:systemd,代码行数:34,代码来源:bus-convenience.c
示例7: callback
static int callback(sd_bus_message *m, void *user, sd_bus_error *error)
{
sd_event *loop = user;
int r;
char *property = NULL;
r = sd_bus_message_skip(m, "s");
if (r < 0) {
fprintf(stderr, "Error skipping message fields: %s\n",
strerror(-r));
quit(r, loop);
return r;
}
r = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, "{sv}");
if (r < 0) {
fprintf(stderr, "Error entering container: %s\n",
strerror(-r));
quit(r, loop);
return r;
}
while((r = sd_bus_message_enter_container(
m,
SD_BUS_TYPE_DICT_ENTRY,
"sv")) > 0) {
r = sd_bus_message_read(m, "s", &property);
if (r < 0) {
fprintf(stderr, "Error reading message: %s\n",
strerror(-r));
quit(r, loop);
return r;
}
if(strcmp(property, "pgood"))
continue;
quit(0, loop);
break;
}
return 0;
}
开发者ID:bradbishop,项目名称:skeleton,代码行数:43,代码来源:pgood_wait.c
示例8: print_inhibitors
static int print_inhibitors(sd_bus *bus, sd_bus_error *error) {
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
const char *what, *who, *why, *mode;
unsigned int uid, pid;
unsigned n = 0;
int r;
r = sd_bus_call_method(
bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
"ListInhibitors",
error,
&reply,
"");
if (r < 0)
return r;
r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "(ssssuu)");
if (r < 0)
return bus_log_parse_error(r);
while ((r = sd_bus_message_read(reply, "(ssssuu)", &what, &who, &why, &mode, &uid, &pid)) > 0) {
_cleanup_free_ char *comm = NULL, *u = NULL;
get_process_comm(pid, &comm);
u = uid_to_name(uid);
printf(" Who: %s (UID "UID_FMT"/%s, PID "PID_FMT"/%s)\n"
" What: %s\n"
" Why: %s\n"
" Mode: %s\n\n",
who, uid, strna(u), pid, strna(comm),
what,
why,
mode);
n++;
}
if (r < 0)
return bus_log_parse_error(r);
r = sd_bus_message_exit_container(reply);
if (r < 0)
return bus_log_parse_error(r);
printf("%u inhibitors listed.\n", n);
return 0;
}
开发者ID:chenyf,项目名称:systemd,代码行数:50,代码来源:inhibit.c
示例9: sd_bus_get_property_string
_public_ int sd_bus_get_property_string(
sd_bus *bus,
const char *destination,
const char *path,
const char *interface,
const char *member,
sd_bus_error *error,
char **ret) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
const char *s;
char *n;
int r;
bus_assert_return(bus, -EINVAL, error);
bus_assert_return(isempty(interface) || interface_name_is_valid(interface), -EINVAL, error);
bus_assert_return(member_name_is_valid(member), -EINVAL, error);
bus_assert_return(ret, -EINVAL, error);
bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
if (!BUS_IS_OPEN(bus->state)) {
r = -ENOTCONN;
goto fail;
}
r = sd_bus_call_method(bus, destination, path, "org.freedesktop.DBus.Properties", "Get", error, &reply, "ss", strempty(interface), member);
if (r < 0)
return r;
r = sd_bus_message_enter_container(reply, 'v', "s");
if (r < 0)
goto fail;
r = sd_bus_message_read_basic(reply, 's', &s);
if (r < 0)
goto fail;
n = strdup(s);
if (!n) {
r = -ENOMEM;
goto fail;
}
*ret = n;
return 0;
fail:
return sd_bus_error_set_errno(error, r);
}
开发者ID:dankor,项目名称:systemd,代码行数:49,代码来源:bus-convenience.c
示例10: manager_read_name
static void manager_read_name(struct manager *m)
{
_cleanup_sd_bus_error_ sd_bus_error err = SD_BUS_ERROR_NULL;
_cleanup_sd_bus_message_ sd_bus_message *rep = NULL;
const char *name;
char *str;
int r;
r = sd_bus_call_method(m->bus,
"org.freedesktop.hostname1",
"/org/freedesktop/hostname1",
"org.freedesktop.DBus.Properties",
"Get",
&err,
&rep,
"ss", "org.freedesktop.hostname1", "Hostname");
if (r < 0)
goto error;
r = sd_bus_message_enter_container(rep, 'v', "s");
if (r < 0)
goto error;
r = sd_bus_message_read(rep, "s", &name);
if (r < 0)
name = "undefined";
if (shl_isempty(name)) {
log_warning("no hostname set on systemd.hostname1, using: %s",
m->friendly_name);
return;
}
str = strdup(name);
if (!str)
return log_vENOMEM();
free(m->friendly_name);
m->friendly_name = str;
log_debug("friendly-name from local hostname: %s", str);
return;
error:
log_warning("cannot read hostname from systemd.hostname1: %s",
bus_error_message(&err, r));
}
开发者ID:Al3n,项目名称:miraclecast,代码行数:47,代码来源:wifid.c
示例11: list_sessions
static int list_sessions(int argc, char *argv[], void *userdata) {
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
const char *id, *user, *seat, *object;
sd_bus *bus = userdata;
unsigned k = 0;
uint32_t uid;
int r;
assert(bus);
assert(argv);
pager_open_if_enabled();
r = sd_bus_call_method(
bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
"ListSessions",
&error, &reply,
"");
if (r < 0) {
log_error("Failed to list sessions: %s", bus_error_message(&error, r));
return r;
}
r = sd_bus_message_enter_container(reply, 'a', "(susso)");
if (r < 0)
return bus_log_parse_error(r);
if (arg_legend)
printf("%10s %10s %-16s %-16s\n", "SESSION", "UID", "USER", "SEAT");
while ((r = sd_bus_message_read(reply, "(susso)", &id, &uid, &user, &seat, &object)) > 0) {
printf("%10s %10u %-16s %-16s\n", id, (unsigned) uid, user, seat);
k++;
}
if (r < 0)
return bus_log_parse_error(r);
if (arg_legend)
printf("\n%u sessions listed.\n", k);
return 0;
}
开发者ID:AlexBaranosky,项目名称:systemd,代码行数:46,代码来源:loginctl.c
示例12: map_server_address
static int map_server_address(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
char **p = (char **) userdata;
const void *d;
int family, r;
size_t sz;
assert(p);
r = sd_bus_message_enter_container(m, 'r', "iay");
if (r < 0)
return r;
r = sd_bus_message_read(m, "i", &family);
if (r < 0)
return r;
r = sd_bus_message_read_array(m, 'y', &d, &sz);
if (r < 0)
return r;
r = sd_bus_message_exit_container(m);
if (r < 0)
return r;
if (sz == 0 && family == AF_UNSPEC) {
*p = mfree(*p);
return 0;
}
if (!IN_SET(family, AF_INET, AF_INET6)) {
log_error("Unknown address family %i", family);
return -EINVAL;
}
if (sz != FAMILY_ADDRESS_SIZE(family)) {
log_error("Invalid address size");
return -EINVAL;
}
r = in_addr_to_string(family, d, p);
if (r < 0)
return r;
return 0;
}
开发者ID:iamyooon,项目名称:systemd,代码行数:45,代码来源:timedatectl.c
示例13: print_changes
static int print_changes(sd_bus_message *m) {
int r;
if (arg_quiet)
return 0;
r = sd_bus_message_enter_container(m, 'a', "(sss)");
if (r < 0)
return bus_log_parse_error(r);
for (;;) {
const char *type, *path, *source;
r = sd_bus_message_read(m, "(sss)", &type, &path, &source);
if (r < 0)
return bus_log_parse_error(r);
if (r == 0)
break;
if (streq(type, "symlink"))
log_info("Created symlink %s %s %s.", path, special_glyph(SPECIAL_GLYPH_ARROW), source);
else if (streq(type, "copy")) {
if (isempty(source))
log_info("Copied %s.", path);
else
log_info("Copied %s %s %s.", source, special_glyph(SPECIAL_GLYPH_ARROW), path);
} else if (streq(type, "unlink"))
log_info("Removed %s.", path);
else if (streq(type, "write"))
log_info("Written %s.", path);
else if (streq(type, "mkdir"))
log_info("Created directory %s.", path);
else
log_error("Unexpected change: %s/%s/%s", type, path, source);
}
r = sd_bus_message_exit_container(m);
if (r < 0)
return r;
return 0;
}
开发者ID:l10n-tw,项目名称:systemd,代码行数:42,代码来源:portablectl.c
示例14: map_ntp_message
static int map_ntp_message(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
NTPStatusInfo *p = userdata;
const void *d;
size_t sz;
int32_t b;
int r;
assert(p);
r = sd_bus_message_enter_container(m, 'r', "uuuuittayttttbtt");
if (r < 0)
return r;
r = sd_bus_message_read(m, "uuuuitt",
&p->leap, &p->version, &p->mode, &p->stratum, &p->precision,
&p->root_delay, &p->root_dispersion);
if (r < 0)
return r;
r = sd_bus_message_read_array(m, 'y', &d, &sz);
if (r < 0)
return r;
r = sd_bus_message_read(m, "ttttbtt",
&p->origin, &p->recv, &p->trans, &p->dest,
&b, &p->packet_count, &p->jitter);
if (r < 0)
return r;
r = sd_bus_message_exit_container(m);
if (r < 0)
return r;
if (sz != 4)
return -EINVAL;
memcpy(p->reference.str, d, sz);
p->spike = b;
return 0;
}
开发者ID:clemensg,项目名称:systemd,代码行数:42,代码来源:timedatectl.c
示例15: list_users
static int list_users(sd_bus *bus, char **args, unsigned n) {
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
const char *user, *object;
unsigned k = 0;
uint32_t uid;
int r;
pager_open_if_enabled();
r = sd_bus_call_method(
bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
"ListUsers",
&error, &reply,
"");
if (r < 0) {
log_error("Failed to list users: %s", bus_error_message(&error, r));
return r;
}
r = sd_bus_message_enter_container(reply, 'a', "(uso)");
if (r < 0)
return bus_log_parse_error(r);
if (arg_legend)
printf("%10s %-16s\n", "UID", "USER");
while ((r = sd_bus_message_read(reply, "(uso)", &uid, &user, &object)) > 0) {
printf("%10u %-16s\n", (unsigned) uid, user);
k++;
}
if (r < 0)
return bus_log_parse_error(r);
if (arg_legend)
printf("\n%u users listed.\n", k);
return 0;
}
开发者ID:gcampax,项目名称:systemd,代码行数:42,代码来源:loginctl.c
示例16: list_seats
static int list_seats(sd_bus *bus, char **args, unsigned n) {
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
const char *seat, *object;
unsigned k = 0;
int r;
pager_open_if_enabled();
r = sd_bus_call_method(
bus,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
"ListSeats",
&error, &reply,
"");
if (r < 0) {
log_error("Failed to list seats: %s", bus_error_message(&error, r));
return r;
}
r = sd_bus_message_enter_container(reply, 'a', "(so)");
if (r < 0)
return bus_log_parse_error(r);
if (arg_legend)
printf("%-16s\n", "SEAT");
while ((r = sd_bus_message_read(reply, "(so)", &seat, &object)) > 0) {
printf("%-16s\n", seat);
k++;
}
if (r < 0)
return bus_log_parse_error(r);
if (arg_legend)
printf("\n%u seats listed.\n", k);
return 0;
}
开发者ID:gcampax,项目名称:systemd,代码行数:41,代码来源:loginctl.c
示例17: prop_map_first_of_struct
static int prop_map_first_of_struct(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
const char *contents;
int r;
r = sd_bus_message_peek_type(m, NULL, &contents);
if (r < 0)
return r;
r = sd_bus_message_enter_container(m, SD_BUS_TYPE_STRUCT, contents);
if (r < 0)
return r;
if (contents[0] == 's' || contents[0] == 'o') {
const char *s;
char **p = (char **) userdata;
r = sd_bus_message_read_basic(m, contents[0], &s);
if (r < 0)
return r;
free(*p);
*p = strdup(s);
if (!*p)
return -ENOMEM;
} else {
r = sd_bus_message_read_basic(m, contents[0], userdata);
if (r < 0)
return r;
}
r = sd_bus_message_skip(m, contents+1);
if (r < 0)
return r;
r = sd_bus_message_exit_container(m);
if (r < 0)
return r;
return 0;
}
开发者ID:AlexBaranosky,项目名称:systemd,代码行数:41,代码来源:loginctl.c
示例18: prop_map_sessions_strv
static int prop_map_sessions_strv(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
const char *name;
int r;
assert(bus);
assert(m);
r = sd_bus_message_enter_container(m, 'a', "(so)");
if (r < 0)
return r;
while ((r = sd_bus_message_read(m, "(so)", &name, NULL)) > 0) {
r = strv_extend(userdata, name);
if (r < 0)
return r;
}
if (r < 0)
return r;
return sd_bus_message_exit_container(m);
}
开发者ID:AlexBaranosky,项目名称:systemd,代码行数:21,代码来源:loginctl.c
示例19: resolve_host
static int resolve_host(sd_bus *bus, const char *name) {
_cleanup_bus_message_unref_ sd_bus_message *req = NULL, *reply = NULL;
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
const char *canonical = NULL;
char ifname[IF_NAMESIZE] = "";
unsigned c = 0;
int r;
uint64_t flags;
usec_t ts;
assert(name);
if (arg_ifindex > 0 && !if_indextoname(arg_ifindex, ifname))
return log_error_errno(errno, "Failed to resolve interface name for index %i: %m", arg_ifindex);
log_debug("Resolving %s (family %s, interface %s).", name, af_to_name(arg_family) ?: "*", isempty(ifname) ? "*" : ifname);
r = sd_bus_message_new_method_call(
bus,
&req,
"org.freedesktop.resolve1",
"/org/freedesktop/resolve1",
"org.freedesktop.resolve1.Manager",
"ResolveHostname");
if (r < 0)
return bus_log_create_error(r);
r = sd_bus_message_append(req, "isit", arg_ifindex, name, arg_family, arg_flags);
if (r < 0)
return bus_log_create_error(r);
ts = now(CLOCK_MONOTONIC);
r = sd_bus_call(bus, req, DNS_CALL_TIMEOUT_USEC, &error, &reply);
if (r < 0) {
log_error("%s: resolve call failed: %s", name, bus_error_message(&error, r));
return r;
}
ts = now(CLOCK_MONOTONIC) - ts;
r = sd_bus_message_enter_container(reply, 'a', "(iiay)");
if (r < 0)
return bus_log_parse_error(r);
while ((r = sd_bus_message_enter_container(reply, 'r', "iiay")) > 0) {
const void *a;
size_t sz;
_cleanup_free_ char *pretty = NULL;
int ifindex, family;
assert_cc(sizeof(int) == sizeof(int32_t));
r = sd_bus_message_read(reply, "ii", &ifindex, &family);
if (r < 0)
return bus_log_parse_error(r);
r = sd_bus_message_read_array(reply, 'y', &a, &sz);
if (r < 0)
return bus_log_parse_error(r);
r = sd_bus_message_exit_container(reply);
if (r < 0)
return bus_log_parse_error(r);
if (!IN_SET(family, AF_INET, AF_INET6)) {
log_debug("%s: skipping entry with family %d (%s)", name, family, af_to_name(family) ?: "unknown");
continue;
}
if (sz != FAMILY_ADDRESS_SIZE(family)) {
log_error("%s: systemd-resolved returned address of invalid size %zu for family %s", name, sz, af_to_name(family) ?: "unknown");
continue;
}
开发者ID:rothwerx,项目名称:systemd,代码行数:75,代码来源:resolve-host.c
示例20: bus_test_polkit
int bus_test_polkit(
sd_bus_message *call,
int capability,
const char *action,
const char **details,
uid_t good_user,
bool *_challenge,
sd_bus_error *e) {
int r;
assert(call);
assert(action);
/* Tests non-interactively! */
r = check_good_user(call, good_user);
if (r != 0)
return r;
r = sd_bus_query_sender_privilege(call, capability);
if (r < 0)
return r;
else if (r > 0)
return 1;
#ifdef ENABLE_POLKIT
else {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *request = NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
int authorized = false, challenge = false;
const char *sender, **k, **v;
sender = sd_bus_message_get_sender(call);
if (!sender)
return -EBADMSG;
r = sd_bus_message_new_method_call(
call->bus,
&request,
"org.freedesktop.PolicyKit1",
"/org/freedesktop/PolicyKit1/Authority",
"org.freedesktop.PolicyKit1.Authority",
"CheckAuthorization");
if (r < 0)
return r;
r = sd_bus_message_append(
request,
"(sa{sv})s",
"system-bus-name", 1, "name", "s", sender,
action);
if (r < 0)
return r;
r = sd_bus_message_open_container(request, 'a', "{ss}");
if (r < 0)
return r;
STRV_FOREACH_PAIR(k, v, details) {
r = sd_bus_message_append(request, "{ss}", *k, *v);
if (r < 0)
return r;
}
r = sd_bus_message_close_container(request);
if (r < 0)
return r;
r = sd_bus_message_append(request, "us", 0, NULL);
if (r < 0)
return r;
r = sd_bus_call(call->bus, request, 0, e, &reply);
if (r < 0) {
/* Treat no PK available as access denied */
if (sd_bus_error_has_name(e, SD_BUS_ERROR_SERVICE_UNKNOWN)) {
sd_bus_error_free(e);
return -EACCES;
}
return r;
}
r = sd_bus_message_enter_container(reply, 'r', "bba{ss}");
if (r < 0)
return r;
r = sd_bus_message_read(reply, "bb", &authorized, &challenge);
if (r < 0)
return r;
if (authorized)
return 1;
if (_challenge) {
*_challenge = challenge;
return 0;
}
}
开发者ID:ChALkeR,项目名称:systemd,代码行数:99,代码来源:bus-util.c
注:本文中的sd_bus_message_enter_container函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论