Subversion Repositories HelenOS

Rev

Rev 4156 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4156 Rev 4296
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
    ipc_answer_0(rid, EOK);
-
 
182
   
181
   
183
    arg_buf[buf_len] = '\0';
182
    arg_buf[buf_size] = '\0';
184
   
183
   
185
    /*
184
    /*
186
     * Count number of arguments
185
     * Count number of arguments
187
     */
186
     */
188
    p = arg_buf;
187
    p = arg_buf;
189
    n = 0;
188
    n = 0;
190
    while (p < arg_buf + buf_len) {
189
    while (p < arg_buf + buf_size) {
191
        arg_len = strlen(p);
190
        arg_size = str_size(p);
192
        p = p + arg_len + 1;
191
        p = p + arg_size + 1;
193
        ++n;
192
        ++n;
194
    }
193
    }
195
   
194
   
196
    /* Allocate argv */
195
    /* Allocate argv */
197
    argv = malloc((n + 1) * sizeof(char *));
196
    argv = malloc((n + 1) * sizeof(char *));
198
   
197
   
199
    if (argv == NULL) {
198
    if (argv == NULL) {
200
        free(arg_buf);
199
        free(arg_buf);
201
        ipc_answer_0(callid, ENOMEM);
-
 
202
        ipc_answer_0(rid, ENOMEM);
200
        ipc_answer_0(rid, ENOMEM);
203
        return;
201
        return;
204
    }
202
    }
205
   
203
 
206
    /*
204
    /*
207
     * Fill argv with argument pointers
205
     * Fill argv with argument pointers
208
     */
206
     */
209
    p = arg_buf;
207
    p = arg_buf;
210
    n = 0;
208
    n = 0;
211
    while (p < arg_buf + buf_len) {
209
    while (p < arg_buf + buf_size) {
212
        argv[n] = p;
210
        argv[n] = p;
213
       
211
       
214
        arg_len = strlen(p);
212
        arg_size = str_size(p);
215
        p = p + arg_len + 1;
213
        p = p + arg_size + 1;
216
        ++n;
214
        ++n;
217
    }
215
    }
218
   
216
   
219
    argc = n;
217
    argc = n;
220
    argv[n] = NULL;
218
    argv[n] = NULL;
-
 
219
 
-
 
220
    ipc_answer_0(rid, EOK);
221
}
221
}
222
 
222
 
223
/** Load the previously selected program.
223
/** Load the previously selected program.
224
 *
224
 *
225
 * @param rid
225
 * @param rid
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 */