Commit | Line | Data |
---|---|---|
4f839c09 TB |
1 | /* Copyright (C) 2018 Thomas Balzer */ |
2 | ||
3 | /* This file is part of tomd. */ | |
4 | ||
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. */ | |
9 | ||
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. */ | |
14 | ||
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/>. */ | |
17 | ||
82ff7d81 TB |
18 | #include <libguile.h> |
19 | #include <pwd.h> | |
20 | ||
2599cbf7 | 21 | #include "../../include/job.h" |
82ff7d81 | 22 | #include "../../include/macros.h" |
3024ed65 | 23 | #include "../../include/scm_interface.h" |
81643445 | 24 | |
82ff7d81 TB |
25 | #define MANIFEST_LOC "/.config/tomd/init/manifest.scm" |
26 | ||
2599cbf7 TB |
27 | #define MAX_JOBS 10 |
28 | ||
29 | static struct job jobs[MAX_JOBS]; | |
30 | ||
31 | static struct job load_job(SCM job_list, int index) | |
32 | { | |
33 | struct job ret = { NULL }; | |
64694f43 | 34 | SCM scm_cur_job = SCM_ARR(job_list, index); |
3024ed65 | 35 | |
3024ed65 TB |
36 | if(scm_is_false(job_predicate(scm_cur_job))){ |
37 | tomd_p("job %d wasn't a real job type.", index); | |
2599cbf7 | 38 | return ret; |
3024ed65 TB |
39 | } |
40 | ||
64694f43 TB |
41 | SCM scm_cmd = get_cmd(scm_cur_job); |
42 | SCM scm_args = get_args(scm_cur_job); | |
3024ed65 | 43 | |
64694f43 TB |
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 */ | |
47 | /* boot up. */ | |
48 | SCM scm_start_trigger = get_start_trigger(scm_cur_job); | |
49 | SCM scm_end_trigger = get_end_trigger(scm_cur_job); | |
50 | ||
51 | char *job_cmd = scm_to_locale_string(scm_cmd); | |
3024ed65 TB |
52 | |
53 | char *real_args[10]; | |
54 | int jlen = scm_to_int(scm_length(scm_args)); | |
55 | for(int j = 0; | |
56 | j < jlen; | |
57 | j++){ | |
58 | real_args[j] = | |
59 | scm_to_locale_string(SCM_ARR(scm_args, j)); | |
60 | } | |
61 | ||
2599cbf7 TB |
62 | ret.cmd = job_cmd; |
63 | ||
3024ed65 TB |
64 | for(int j = 0; |
65 | j < jlen; | |
66 | j++){ | |
2599cbf7 | 67 | ret.args[j] = real_args[j]; |
3024ed65 | 68 | } |
2599cbf7 TB |
69 | ret.args[jlen] = NULL; |
70 | ||
71 | return ret; | |
81643445 TB |
72 | } |
73 | ||
82ff7d81 | 74 | static void *load_manifest(void *args) |
81643445 | 75 | { |
82ff7d81 | 76 | char *manifest_loc; |
81643445 | 77 | if(!args){ |
82ff7d81 TB |
78 | tomd_p("arg to load_manifest is NULL"); |
79 | exit(EXIT_FAILURE); | |
80 | } | |
81 | manifest_loc = (char *)args; | |
82 | ||
82ff7d81 TB |
83 | scm_c_primitive_load(args); |
84 | ||
82ff7d81 TB |
85 | SCM scm_job_list = |
86 | scm_c_public_ref("tomd manifest", "job-list"); | |
87 | ||
88 | if(scm_is_false(scm_job_list)){ | |
89 | tomd_p("no job-list found in manifest.scm"); | |
90 | return NULL; | |
91 | } | |
92 | ||
93 | if(scm_is_false(scm_list_p(scm_job_list))){ | |
94 | tomd_p("job-list found, but isn't a list."); | |
95 | return NULL; | |
96 | } | |
97 | ||
82ff7d81 | 98 | int i; |
3024ed65 | 99 | int len = SCM_LIST_LEN(scm_job_list); |
2599cbf7 | 100 | tomd_p("len=%d, max=%d", len, MAX_JOBS); |
82ff7d81 | 101 | for(i = 0; |
2599cbf7 | 102 | i < len && i < MAX_JOBS; |
82ff7d81 | 103 | i++){ |
2599cbf7 | 104 | jobs[i] = load_job(scm_job_list, i); |
82ff7d81 TB |
105 | } |
106 | tomd_p("looked at %d jobs.", i); | |
2599cbf7 | 107 | jobs[i].cmd = NULL; |
82ff7d81 TB |
108 | } |
109 | ||
110 | static char *lookup_user_folder(void) | |
111 | { | |
112 | uid_t user = getuid(); | |
113 | struct passwd *userpasswd = | |
114 | getpwuid(user); | |
82ff7d81 TB |
115 | |
116 | /* take the manifest location and sub ~ for pw_dir */ | |
117 | char *buffer = (char *)malloc(sizeof(char) * 300); | |
118 | strcpy(buffer, userpasswd->pw_dir); | |
119 | int len = strlen(userpasswd->pw_dir); | |
120 | strcpy(buffer + len, MANIFEST_LOC); | |
82ff7d81 | 121 | return buffer; |
81643445 TB |
122 | } |
123 | ||
124 | void load_jobs(void) | |
125 | { | |
82ff7d81 TB |
126 | char *manifest = lookup_user_folder(); |
127 | tomd_p("Loading jobs from '%s'", manifest); | |
128 | ||
81643445 TB |
129 | /* get into the manifest.scm file */ |
130 | void *res = | |
131 | scm_with_guile(load_manifest, | |
82ff7d81 | 132 | (void *) manifest); |
82ff7d81 TB |
133 | |
134 | tomd_p("Finished loading."); | |
2599cbf7 TB |
135 | |
136 | int i = 0; | |
137 | while(1){ | |
138 | if(i >= MAX_JOBS || | |
139 | jobs[i].cmd == NULL) { | |
140 | break; | |
141 | } | |
142 | tomd_p("JOB <%d>:", i); | |
143 | tomd_p(" cmd:'%s'", jobs[i].cmd); | |
144 | int j = 0; | |
145 | while(1){ | |
146 | if(i >= 10 || | |
147 | jobs[i].args[j] == NULL){ | |
148 | break; | |
149 | } | |
150 | tomd_p(" arg [%d]:'%s'", j, jobs[i].args[j]); | |
151 | j++; | |
152 | } | |
153 | i++; | |
154 | } | |
81643445 | 155 | } |