+static void do_dir_entry(struct vc_set_sched *sched, const char *name)
+{
+ int fd;
+ char buf[128];
+ signed long val;
+ struct sched_opt *opt;
+ ssize_t len;
+ char *newline;
+
+ for (opt = FILE_OPTIONS; opt->name != 0; opt++) {
+ if (strcmp(name, opt->name) == 0)
+ break;
+ }
+ if (opt->name == 0)
+ return;
+
+ fd = Eopen(name, O_RDONLY, 0);
+ len = Eread(fd, buf, sizeof(buf)-1);
+ Eclose(fd);
+ buf[len] = '\0';
+ if ((newline=strchr(buf, '\n')) != NULL)
+ *newline = '\0';
+
+ if (!isNumber(buf, &val, true)) {
+ WRITE_MSG(2, ENSC_WRAPPERS_PREFIX);
+ WRITE_STR(2, name);
+ WRITE_MSG(2, ": is not a number\n");
+ exit(1);
+ }
+
+ if (opt->offset != offsetof(struct vc_set_sched, set_mask))
+ *(int_least32_t *)(((char *)sched)+opt->offset) = (int_least32_t) val;
+
+ sched->set_mask |= opt->mask;
+}
+
+static void do_dir(xid_t xid, struct vc_set_sched *sched, const char *dir, int missing_ok, int per_cpu)
+{
+ DIR *dp;
+ struct dirent *de;
+ int cur_fd = Eopen(".", O_RDONLY, 0);
+ struct stat st;
+
+ if (chdir(dir)!=-1) {
+ dp = Eopendir(".");
+ while ((de = Ereaddir(dp)) != NULL) {
+ if (de->d_name[0] == '.' && (de->d_name[1] == '\0' || (de->d_name[1] == '.' && de->d_name[2] == '\0')))
+ continue;
+ Estat(de->d_name, &st);
+ if (S_ISDIR(st.st_mode))
+ continue;
+ do_dir_entry(sched, de->d_name);
+ }
+
+ /* set the values now */
+ if (vc_set_sched(xid, sched) == -1) {
+ perror(ENSC_WRAPPERS_PREFIX "vc_set_sched()");
+ exit(1);
+ }
+
+ if (!per_cpu) {
+ struct vc_set_sched per_cpu_sched;
+
+ rewinddir(dp);
+ while ((de = Ereaddir(dp)) != NULL) {
+ if (de->d_name[0] == '.' && (de->d_name[1] == '\0' || (de->d_name[1] == '.' && de->d_name[2] == '\0')))
+ continue;
+ Estat(de->d_name, &st);
+ if (S_ISDIR(st.st_mode)) {
+ per_cpu_sched.set_mask = sched->set_mask & (VC_VXSM_IDLE_TIME|VC_VXSM_FORCE);
+ do_dir(xid, &per_cpu_sched, de->d_name, 0, 1);
+ }
+ }
+ }
+
+ Eclosedir(dp);
+ }
+ else if (!missing_ok) {
+ perror(ENSC_WRAPPERS_PREFIX "chdir()");
+ exit(wrapper_exit_code);
+ }
+
+ Efchdir(cur_fd);
+}
+