Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/loader/main.c

    r5d96851 r622cdbe  
    7272static pcb_t pcb;
    7373
     74/** Current working directory */
     75static char *cwd = NULL;
     76
    7477/** Number of arguments */
    7578static int argc = 0;
     
    102105        task_id = task_get_id();
    103106       
    104         if (!ipc_data_read_receive(&callid, &len)) {
     107        if (!async_data_read_receive(&callid, &len)) {
    105108                ipc_answer_0(callid, EINVAL);
    106109                ipc_answer_0(rid, EINVAL);
     
    111114                len = sizeof(task_id);
    112115       
    113         ipc_data_read_finalize(callid, &task_id, len);
     116        async_data_read_finalize(callid, &task_id, len);
    114117        ipc_answer_0(rid, EOK);
    115118}
    116119
     120/** Receive a call setting the current working directory.
     121 *
     122 * @param rid
     123 * @param request
     124 */
     125static void ldr_set_cwd(ipc_callid_t rid, ipc_call_t *request)
     126{
     127        ipc_callid_t callid;
     128        size_t len;
     129       
     130        if (!async_data_write_receive(&callid, &len)) {
     131                ipc_answer_0(callid, EINVAL);
     132                ipc_answer_0(rid, EINVAL);
     133                return;
     134        }
     135       
     136        cwd = malloc(len + 1);
     137        if (!cwd) {
     138                ipc_answer_0(callid, ENOMEM);
     139                ipc_answer_0(rid, ENOMEM);
     140                return;
     141        }
     142       
     143        async_data_write_finalize(callid, cwd, len);
     144        cwd[len] = '\0';
     145       
     146        ipc_answer_0(rid, EOK);
     147}
    117148
    118149/** Receive a call setting pathname of the program to execute.
     
    127158        char *name_buf;
    128159       
    129         if (!ipc_data_write_receive(&callid, &len)) {
     160        if (!async_data_write_receive(&callid, &len)) {
    130161                ipc_answer_0(callid, EINVAL);
    131162                ipc_answer_0(rid, EINVAL);
     
    140171        }
    141172       
    142         ipc_data_write_finalize(callid, name_buf, len);
     173        async_data_write_finalize(callid, name_buf, len);
    143174        ipc_answer_0(rid, EOK);
    144175       
     
    164195        int n;
    165196       
    166         if (!ipc_data_write_receive(&callid, &buf_size)) {
     197        if (!async_data_write_receive(&callid, &buf_size)) {
    167198                ipc_answer_0(callid, EINVAL);
    168199                ipc_answer_0(rid, EINVAL);
     
    187218        }
    188219       
    189         ipc_data_write_finalize(callid, arg_buf, buf_size);
     220        async_data_write_finalize(callid, arg_buf, buf_size);
    190221       
    191222        arg_buf[buf_size] = '\0';
     
    239270        ipc_callid_t callid;
    240271        size_t buf_size;
    241         if (!ipc_data_write_receive(&callid, &buf_size)) {
     272        if (!async_data_write_receive(&callid, &buf_size)) {
    242273                ipc_answer_0(callid, EINVAL);
    243274                ipc_answer_0(rid, EINVAL);
     
    268299        }
    269300       
    270         ipc_data_write_finalize(callid, fil_buf, buf_size);
     301        async_data_write_finalize(callid, fil_buf, buf_size);
    271302       
    272303        int count = buf_size / sizeof(fdi_node_t);
     
    312343       
    313344        elf_create_pcb(&prog_info, &pcb);
     345       
     346        pcb.cwd = cwd;
    314347       
    315348        pcb.argc = argc;
     
    406439                case LOADER_GET_TASKID:
    407440                        ldr_get_taskid(callid, &call);
     441                        continue;
     442                case LOADER_SET_CWD:
     443                        ldr_set_cwd(callid, &call);
    408444                        continue;
    409445                case LOADER_SET_PATHNAME:
Note: See TracChangeset for help on using the changeset viewer.