static int add_dbus(const char *path, const char *fname, const char *type) { _cleanup_free_ char *name = NULL, *exec = NULL, *user = NULL, *service = NULL; const ConfigTableItem table[] = { { "D-BUS Service", "Name", config_parse_string, 0, &name }, { "D-BUS Service", "Exec", config_parse_string, 0, &exec }, { "D-BUS Service", "User", config_parse_string, 0, &user }, { "D-BUS Service", "SystemdService", config_parse_string, 0, &service }, { }, }; char *p; int r; assert(path); assert(fname); p = strjoina(path, "/", fname); r = config_parse(NULL, p, NULL, "D-BUS Service\0", config_item_table_lookup, table, true, false, true, NULL); if (r < 0) return r; if (!name) { log_warning("Activation file %s lacks name setting, ignoring.", p); return 0; } if (!service_name_is_valid(name)) { log_warning("Bus service name %s is not valid, ignoring.", name); return 0; } if (streq(name, "org.freedesktop.systemd1")) { log_debug("Skipping %s, identified as systemd.", p); return 0; } if (service) { if (!unit_name_is_valid(service, UNIT_NAME_PLAIN|UNIT_NAME_INSTANCE)) { log_warning("Unit name %s is not valid, ignoring.", service); return 0; } if (!endswith(service, ".service")) { log_warning("Bus names can only activate services, ignoring %s.", p); return 0; } } else { if (streq(exec, "/bin/false") || !exec) { log_warning("Neither service name nor binary path specified, ignoring %s.", p); return 0; } if (exec[0] != '/') { log_warning("Exec= in %s does not start with an absolute path, ignoring.", p); return 0; } } return create_dbus_files(p, name, service, exec, user, type); }
static int add_dbus(const char *path, const char *fname, const char *type) { _cleanup_free_ char *name = NULL, *exec = NULL, *user = NULL, *service = NULL; ConfigTableItem table[] = { { "D-BUS Service", "Name", config_parse_string, 0, &name }, { "D-BUS Service", "Exec", config_parse_string, 0, &exec }, { "D-BUS Service", "User", config_parse_string, 0, &user }, { "D-BUS Service", "SystemdService", config_parse_string, 0, &service }, }; _cleanup_fclose_ FILE *f = NULL; _cleanup_free_ char *p = NULL; int r; assert(path); assert(fname); p = strjoin(path, "/", fname, NULL); if (!p) return log_oom(); f = fopen(p, "re"); if (!f) { if (errno == -ENOENT) return 0; log_error("Failed to read %s: %m", p); return -errno; } r = config_parse(NULL, p, f, "D-BUS Service\0", config_item_table_lookup, table, true, false, NULL); if (r < 0) return r; if (!name) { log_warning("Activation file %s lacks name setting, ignoring.", p); return 0; } if (!service_name_is_valid(name)) { log_warning("Bus service name %s is not valid, ignoring.", name); return 0; } if (streq(name, "org.freedesktop.systemd1")) { log_debug("Skipping %s, identified as systemd.", p); return 0; } if (service) { if (!unit_name_is_valid(service, TEMPLATE_INVALID)) { log_warning("Unit name %s is not valid, ignoring.", service); return 0; } if (!endswith(service, ".service")) { log_warning("Bus names can only activate services, ignoring %s.", p); return 0; } } else { if (streq(exec, "/bin/false") || !exec) { log_warning("Neither service name nor binary path specified, ignoring %s.", p); return 0; } if (exec[0] != '/') { log_warning("Exec= in %s does not start with an absolute path, ignoring.", p); return 0; } } return create_dbus_files(p, name, service, exec, user, type); }