return RESOURCED_ERROR_NONE;
}
+resourced_ret_c cgroup_write_pid(const char *cgroup_subsystem,
+ const char *cgroup_name, const int pid)
+{
+ char buf[MAX_PATH_LENGTH];
+ snprintf(buf, sizeof(buf), "%s/%s", cgroup_subsystem, cgroup_name);
+ return cgroup_write_pid_fullpath(buf, pid);
+}
+
int cgroup_write_node_uint32(const char *cgroup_name,
const char *file_name, uint32_t value)
{
resourced_ret_c cgroup_write_pid_fullpath(const char *cgroup_full_path,
const int pid);
+resourced_ret_c cgroup_write_pid(const char *cgroup_subsystem,
+ const char *cgroup_name, const int pid);
+
/**
* @desc this function sets release agent path into cgroup subsystem
* and enables this mechanism
return r;
}
+int config_parse_dir(const char *dir, ConfigParseFunc fp, void *data)
+{
+ _cleanup_closedir_ DIR *d = NULL;
+ struct dirent *de;
+
+ d = opendir(dir);
+ if (!d) {
+ _E("Failed to open dir: %s", dir);
+ return errno;
+ }
+
+ for (errno = 0, de = readdir(d);; errno = 0, de = readdir(d)) {
+ if (!de) {
+ if (errno > 0)
+ return -errno;
+ break;
+ } else if (streq(de->d_name, ".") || streq(de->d_name, "..")) {
+ continue;
+ }
+
+ _cleanup_free_ char *path = NULL;
+ int r;
+
+ if (de->d_type != DT_REG)
+ continue;
+
+ r = asprintf(&path, "%s/%s", dir, de->d_name);
+ if (r < 0)
+ return -ENOMEM;
+
+ r = fp(path, data);
+ /* Do not just break loop until parse all file of
+ * dir. Just only put log */
+ if (r < 0)
+ _D("Failed to parse config: %s", de->d_name);
+ }
+
+ return 0;
+}
+
int config_parse_bool(const char *filename,
unsigned line,
const char *section,
DEFINE_PARSER(int, int, atoi)
DEFINE_PARSER(float, float, atof)
+DEFINE_PARSER(long, long, atol)
int config_parse_string(const char *filename,
unsigned line,
return 0;
}
+
+int config_parse_strv(const char *filename,
+ unsigned line,
+ const char *section,
+ const char *lvalue,
+ int ltype,
+ const char *rvalue,
+ void *data)
+{
+ char ***strv = data;
+ char **o = NULL, **v = NULL, **vv = NULL;
+ int r;
+
+ assert(filename);
+ assert(lvalue);
+ assert(rvalue);
+ assert(data);
+
+ if (is_empty(rvalue))
+ return 0;
+
+ r = str_to_strv(rvalue, &v, WHITESPACE);
+ if (r < 0)
+ return r;
+
+ o = *strv;
+
+ r = strv_attach(o, v, &vv, true);
+ if (r < 0)
+ return r;
+
+ *strv = vv;
+
+ return 0;
+}
} ConfigTableItem;
int config_parse_new(const char *filename, void *table);
+int config_parse_dir(const char *dir, ConfigParseFunc fp, void *data);
int config_parse_bool(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data);
int config_parse_int(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data);
int config_parse_string(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data);
int config_parse_bytes(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data);
int config_parse_float(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data);
+int config_parse_long(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data);
+int config_parse_strv(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data);
#endif