Rev 4347 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4347 | Rev 4348 | ||
---|---|---|---|
Line 150... | Line 150... | ||
150 | * @param request |
150 | * @param request |
151 | */ |
151 | */ |
152 | static void loader_set_args(ipc_callid_t rid, ipc_call_t *request) |
152 | static void loader_set_args(ipc_callid_t rid, ipc_call_t *request) |
153 | { |
153 | { |
154 | ipc_callid_t callid; |
154 | ipc_callid_t callid; |
155 | size_t buf_len, arg_len; |
155 | size_t buf_size, arg_size; |
156 | char *p; |
156 | char *p; |
157 | int n; |
157 | int n; |
158 | 158 | ||
159 | if (!ipc_data_write_receive(&callid, &buf_len)) { |
159 | if (!ipc_data_write_receive(&callid, &buf_size)) { |
160 | ipc_answer_0(callid, EINVAL); |
160 | ipc_answer_0(callid, EINVAL); |
161 | ipc_answer_0(rid, EINVAL); |
161 | ipc_answer_0(rid, EINVAL); |
162 | return; |
162 | return; |
163 | } |
163 | } |
164 | 164 | ||
Line 170... | Line 170... | ||
170 | if (argv != NULL) { |
170 | if (argv != NULL) { |
171 | free(argv); |
171 | free(argv); |
172 | argv = NULL; |
172 | argv = NULL; |
173 | } |
173 | } |
174 | 174 | ||
175 | arg_buf = malloc(buf_len + 1); |
175 | arg_buf = malloc(buf_size + 1); |
176 | if (!arg_buf) { |
176 | if (!arg_buf) { |
177 | ipc_answer_0(callid, ENOMEM); |
177 | ipc_answer_0(callid, ENOMEM); |
178 | ipc_answer_0(rid, ENOMEM); |
178 | ipc_answer_0(rid, ENOMEM); |
179 | return; |
179 | return; |
180 | } |
180 | } |
181 | 181 | ||
182 | ipc_data_write_finalize(callid, arg_buf, buf_len); |
182 | ipc_data_write_finalize(callid, arg_buf, buf_size); |
183 | ipc_answer_0(rid, EOK); |
- | |
184 | 183 | ||
185 | arg_buf[buf_len] = '\0'; |
184 | arg_buf[buf_size] = '\0'; |
186 | 185 | ||
187 | /* |
186 | /* |
188 | * Count number of arguments |
187 | * Count number of arguments |
189 | */ |
188 | */ |
190 | p = arg_buf; |
189 | p = arg_buf; |
191 | n = 0; |
190 | n = 0; |
192 | while (p < arg_buf + buf_len) { |
191 | while (p < arg_buf + buf_size) { |
193 | arg_len = strlen(p); |
192 | arg_size = str_size(p); |
194 | p = p + arg_len + 1; |
193 | p = p + arg_size + 1; |
195 | ++n; |
194 | ++n; |
196 | } |
195 | } |
197 | 196 | ||
198 | /* Allocate argv */ |
197 | /* Allocate argv */ |
199 | argv = malloc((n + 1) * sizeof(char *)); |
198 | argv = malloc((n + 1) * sizeof(char *)); |
200 | 199 | ||
201 | if (argv == NULL) { |
200 | if (argv == NULL) { |
202 | free(arg_buf); |
201 | free(arg_buf); |
203 | ipc_answer_0(callid, ENOMEM); |
- | |
204 | ipc_answer_0(rid, ENOMEM); |
202 | ipc_answer_0(rid, ENOMEM); |
205 | return; |
203 | return; |
206 | } |
204 | } |
207 | 205 | ||
208 | /* |
206 | /* |
209 | * Fill argv with argument pointers |
207 | * Fill argv with argument pointers |
210 | */ |
208 | */ |
211 | p = arg_buf; |
209 | p = arg_buf; |
212 | n = 0; |
210 | n = 0; |
213 | while (p < arg_buf + buf_len) { |
211 | while (p < arg_buf + buf_size) { |
214 | argv[n] = p; |
212 | argv[n] = p; |
215 | 213 | ||
216 | arg_len = strlen(p); |
214 | arg_size = str_size(p); |
217 | p = p + arg_len + 1; |
215 | p = p + arg_size + 1; |
218 | ++n; |
216 | ++n; |
219 | } |
217 | } |
220 | 218 | ||
221 | argc = n; |
219 | argc = n; |
222 | argv[n] = NULL; |
220 | argv[n] = NULL; |
- | 221 | ||
- | 222 | ipc_answer_0(rid, EOK); |
|
223 | } |
223 | } |
224 | 224 | ||
225 | /** Load the previously selected program. |
225 | /** Load the previously selected program. |
226 | * |
226 | * |
227 | * @param rid |
227 | * @param rid |
Line 231... | Line 231... | ||
231 | static int loader_load(ipc_callid_t rid, ipc_call_t *request) |
231 | static int loader_load(ipc_callid_t rid, ipc_call_t *request) |
232 | { |
232 | { |
233 | int rc; |
233 | int rc; |
234 | 234 | ||
235 | rc = elf_load_file(pathname, 0, 0, &prog_info); |
235 | rc = elf_load_file(pathname, 0, 0, &prog_info); |
236 | if (rc < 0) { |
236 | if (rc != EE_OK) { |
237 | DPRINTF("Failed to load executable '%s'.\n", pathname); |
237 | DPRINTF("Failed to load executable '%s'.\n", pathname); |
238 | ipc_answer_0(rid, EINVAL); |
238 | ipc_answer_0(rid, EINVAL); |
239 | return 1; |
239 | return 1; |
240 | } |
240 | } |
241 | 241 | ||
Line 251... | Line 251... | ||
251 | return 0; |
251 | return 0; |
252 | } |
252 | } |
253 | 253 | ||
254 | printf("Load ELF interpreter '%s'\n", prog_info.interp); |
254 | printf("Load ELF interpreter '%s'\n", prog_info.interp); |
255 | rc = elf_load_file(prog_info.interp, 0, 0, &interp_info); |
255 | rc = elf_load_file(prog_info.interp, 0, 0, &interp_info); |
256 | if (rc < 0) { |
256 | if (rc != EE_OK) { |
257 | DPRINTF("Failed to load interpreter '%s.'\n", |
257 | DPRINTF("Failed to load interpreter '%s.'\n", |
258 | prog_info.interp); |
258 | prog_info.interp); |
259 | ipc_answer_0(rid, EINVAL); |
259 | ipc_answer_0(rid, EINVAL); |
260 | return 1; |
260 | return 1; |
261 | } |
261 | } |
Line 281... | Line 281... | ||
281 | static void loader_run(ipc_callid_t rid, ipc_call_t *request) |
281 | static void loader_run(ipc_callid_t rid, ipc_call_t *request) |
282 | { |
282 | { |
283 | const char *cp; |
283 | const char *cp; |
284 | 284 | ||
285 | /* Set the task name. */ |
285 | /* Set the task name. */ |
286 | cp = strrchr(pathname, '/'); |
286 | cp = str_rchr(pathname, '/'); |
287 | cp = (cp == NULL) ? pathname : (cp + 1); |
287 | cp = (cp == NULL) ? pathname : (cp + 1); |
288 | task_set_name(cp); |
288 | task_set_name(cp); |
289 | 289 | ||
290 | if (is_dyn_linked == true) { |
290 | if (is_dyn_linked == true) { |
291 | /* Dynamically linked program */ |
291 | /* Dynamically linked program */ |