Rev 4263 | Rev 4581 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4263 | Rev 4327 | ||
|---|---|---|---|
| Line 148... | Line 148... | ||
| 148 | * @param request |
148 | * @param request |
| 149 | */ |
149 | */ |
| 150 | static void loader_set_args(ipc_callid_t rid, ipc_call_t *request) |
150 | static void loader_set_args(ipc_callid_t rid, ipc_call_t *request) |
| 151 | { |
151 | { |
| 152 | ipc_callid_t callid; |
152 | ipc_callid_t callid; |
| 153 | size_t buf_len, arg_len; |
153 | size_t buf_size, arg_size; |
| 154 | char *p; |
154 | char *p; |
| 155 | int n; |
155 | int n; |
| 156 | 156 | ||
| 157 | if (!ipc_data_write_receive(&callid, &buf_len)) { |
157 | if (!ipc_data_write_receive(&callid, &buf_size)) { |
| 158 | ipc_answer_0(callid, EINVAL); |
158 | ipc_answer_0(callid, EINVAL); |
| 159 | ipc_answer_0(rid, EINVAL); |
159 | ipc_answer_0(rid, EINVAL); |
| 160 | return; |
160 | return; |
| 161 | } |
161 | } |
| 162 | 162 | ||
| Line 168... | Line 168... | ||
| 168 | if (argv != NULL) { |
168 | if (argv != NULL) { |
| 169 | free(argv); |
169 | free(argv); |
| 170 | argv = NULL; |
170 | argv = NULL; |
| 171 | } |
171 | } |
| 172 | 172 | ||
| 173 | arg_buf = malloc(buf_len + 1); |
173 | arg_buf = malloc(buf_size + 1); |
| 174 | if (!arg_buf) { |
174 | if (!arg_buf) { |
| 175 | ipc_answer_0(callid, ENOMEM); |
175 | ipc_answer_0(callid, ENOMEM); |
| 176 | ipc_answer_0(rid, ENOMEM); |
176 | ipc_answer_0(rid, ENOMEM); |
| 177 | return; |
177 | return; |
| 178 | } |
178 | } |
| 179 | 179 | ||
| 180 | ipc_data_write_finalize(callid, arg_buf, buf_len); |
180 | ipc_data_write_finalize(callid, arg_buf, buf_size); |
| 181 | 181 | ||
| 182 | arg_buf[buf_len] = '\0'; |
182 | arg_buf[buf_size] = '\0'; |
| 183 | 183 | ||
| 184 | /* |
184 | /* |
| 185 | * Count number of arguments |
185 | * Count number of arguments |
| 186 | */ |
186 | */ |
| 187 | p = arg_buf; |
187 | p = arg_buf; |
| 188 | n = 0; |
188 | n = 0; |
| 189 | while (p < arg_buf + buf_len) { |
189 | while (p < arg_buf + buf_size) { |
| 190 | arg_len = strlen(p); |
190 | arg_size = str_size(p); |
| 191 | p = p + arg_len + 1; |
191 | p = p + arg_size + 1; |
| 192 | ++n; |
192 | ++n; |
| 193 | } |
193 | } |
| 194 | 194 | ||
| 195 | /* Allocate argv */ |
195 | /* Allocate argv */ |
| 196 | argv = malloc((n + 1) * sizeof(char *)); |
196 | argv = malloc((n + 1) * sizeof(char *)); |
| Line 204... | Line 204... | ||
| 204 | /* |
204 | /* |
| 205 | * Fill argv with argument pointers |
205 | * Fill argv with argument pointers |
| 206 | */ |
206 | */ |
| 207 | p = arg_buf; |
207 | p = arg_buf; |
| 208 | n = 0; |
208 | n = 0; |
| 209 | while (p < arg_buf + buf_len) { |
209 | while (p < arg_buf + buf_size) { |
| 210 | argv[n] = p; |
210 | argv[n] = p; |
| 211 | 211 | ||
| 212 | arg_len = strlen(p); |
212 | arg_size = str_size(p); |
| 213 | p = p + arg_len + 1; |
213 | p = p + arg_size + 1; |
| 214 | ++n; |
214 | ++n; |
| 215 | } |
215 | } |
| 216 | 216 | ||
| 217 | argc = n; |
217 | argc = n; |
| 218 | argv[n] = NULL; |
218 | argv[n] = NULL; |
| Line 273... | Line 273... | ||
| 273 | static void loader_run(ipc_callid_t rid, ipc_call_t *request) |
273 | static void loader_run(ipc_callid_t rid, ipc_call_t *request) |
| 274 | { |
274 | { |
| 275 | const char *cp; |
275 | const char *cp; |
| 276 | 276 | ||
| 277 | /* Set the task name. */ |
277 | /* Set the task name. */ |
| 278 | cp = strrchr(pathname, '/'); |
278 | cp = str_rchr(pathname, '/'); |
| 279 | cp = (cp == NULL) ? pathname : (cp + 1); |
279 | cp = (cp == NULL) ? pathname : (cp + 1); |
| 280 | task_set_name(cp); |
280 | task_set_name(cp); |
| 281 | 281 | ||
| 282 | if (is_dyn_linked == true) { |
282 | if (is_dyn_linked == true) { |
| 283 | /* Dynamically linked program */ |
283 | /* Dynamically linked program */ |