1b57dfa6ad3f90e4b64f7a0f87a839ffc1eaed14
1 /* Copyright (C) 2018 Thomas Balzer */
3 /* This file is part of tomd. */
5 /* tomd is free software: you can redistribute it and/or modify */
6 /* it under the terms of the GNU General Public License as published by */
7 /* the Free Software Foundation, either version 3 of the License, or */
8 /* (at your option) any later version. */
10 /* tomd is distributed in the hope that it will be useful, */
11 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
12 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
13 /* GNU General Public License for more details. */
15 /* You should have received a copy of the GNU General Public License */
16 /* along with tomd. If not, see <http://www.gnu.org/licenses/>. */
21 #include "../../include/job.h"
22 #include "../../include/macros.h"
23 #include "../../include/scm_interface.h"
25 #define MANIFEST_LOC "/.config/tomd/init/manifest.scm"
29 static struct job jobs
[MAX_JOBS
];
31 static struct job
load_job(SCM job_list
, int index
)
33 struct job ret
= { NULL
};
34 SCM scm_cur_job
= SCM_ARR(job_list
, index
);
36 if(scm_is_false(job_predicate(scm_cur_job
))){
37 tomd_p("job %d wasn't a real job type.", index
);
41 SCM scm_cmd
= get_cmd(scm_cur_job
);
42 SCM scm_args
= get_args(scm_cur_job
);
44 /* TODO > Handle these. */
45 /* planned is to be able to run at different points, and at */
46 /* the request of a user. for testing we do things all at */
48 SCM scm_start_trigger
= get_start_trigger(scm_cur_job
);
49 SCM scm_end_trigger
= get_end_trigger(scm_cur_job
);
51 char *job_cmd
= scm_to_locale_string(scm_cmd
);
54 int jlen
= scm_to_int(scm_length(scm_args
));
59 scm_to_locale_string(SCM_ARR(scm_args
, j
));
67 ret
.args
[j
] = real_args
[j
- 1];
69 ret
.args
[jlen
+ 1] = NULL
;
70 ret
.args
[0] = ret
.cmd
;
75 static void *load_manifest(void *args
)
79 tomd_p("arg to load_manifest is NULL");
82 manifest_loc
= (char *)args
;
84 scm_c_primitive_load(args
);
87 scm_c_public_ref("tomd manifest", "job-list");
89 if(scm_is_false(scm_job_list
)){
90 tomd_p("no job-list found in manifest.scm");
94 if(scm_is_false(scm_list_p(scm_job_list
))){
95 tomd_p("job-list found, but isn't a list.");
100 int len
= SCM_LIST_LEN(scm_job_list
);
101 tomd_p("len=%d, max=%d", len
, MAX_JOBS
);
103 i
< len
&& i
< MAX_JOBS
;
105 jobs
[i
] = load_job(scm_job_list
, i
);
107 tomd_p("looked at %d jobs.", i
);
111 static char *lookup_user_folder(void)
113 uid_t user
= getuid();
114 struct passwd
*userpasswd
=
117 /* take the manifest location and sub ~ for pw_dir */
118 char *buffer
= (char *)malloc(sizeof(char) * 300);
119 strcpy(buffer
, userpasswd
->pw_dir
);
120 int len
= strlen(userpasswd
->pw_dir
);
121 strcpy(buffer
+ len
, MANIFEST_LOC
);
127 char *manifest
= lookup_user_folder();
128 tomd_p("Loading jobs from '%s'", manifest
);
131 scm_with_guile(load_manifest
,
134 tomd_p("Finished loading.");
139 jobs
[i
].cmd
== NULL
) {
142 tomd_p("JOB <%d>:", i
);
143 tomd_p(" cmd:'%s'", jobs
[i
].cmd
);
147 jobs
[i
].args
[j
] == NULL
){
150 tomd_p(" arg [%d]:'%s'", j
, jobs
[i
].args
[j
]);
157 void run_job(int index
)
159 struct job
*job
= &jobs
[index
];
162 if(pid
== 0){ /* child */
166 if(job
->args
[i
] == NULL
){
167 tomd_p("arg [%d] is NULL", i
);
170 tomd_p("arg [%d] is '%s'", i
, job
->args
[i
]);
174 execvp(job
->cmd
, job
->args
);
175 tomd_p("execvp for '%s' failed", job
->cmd
);
179 tomd_p("forked [%d] to run '%s'", pid
, job
->cmd
);
189 if(jobs
[i
].cmd
== NULL
){
190 tomd_p("out of jobs");
193 tomd_p("running job [%d] '%s'", i
, jobs
[i
].cmd
);