Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset bbdbf86 in mainline


Ignore:
Timestamp:
2009-06-03T18:46:29Z (13 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master
Children:
215abc1
Parents:
bf1fb9f
Message:

add support for passing preset files
rename loader_ prefix to ldr_ prefix (to avoid confusion with libc functions)

File:
1 edited

Legend:

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

    rbf1fb9f rbbdbf86  
    5454#include <ipc/loader.h>
    5555#include <loader/pcb.h>
    56 #include <console.h>
    5756#include <errno.h>
    5857#include <async.h>
     58#include <string.h>
    5959#include <as.h>
    6060
     
    7777static char *arg_buf = NULL;
    7878
     79/** Number of preset files */
     80static int filc = 0;
     81/** Preset files vector */
     82static char **filv = NULL;
     83/** Buffer holding all preset files */
     84static fs_node_t *fil_buf = NULL;
     85
    7986static elf_info_t prog_info;
    8087static elf_info_t interp_info;
     
    8592static bool connected;
    8693
    87 static void loader_get_taskid(ipc_callid_t rid, ipc_call_t *request)
     94static void ldr_get_taskid(ipc_callid_t rid, ipc_call_t *request)
    8895{
    8996        ipc_callid_t callid;
     
    112119 * @param request
    113120 */
    114 static void loader_set_pathname(ipc_callid_t rid, ipc_call_t *request)
     121static void ldr_set_pathname(ipc_callid_t rid, ipc_call_t *request)
    115122{
    116123        ipc_callid_t callid;
     
    148155 * @param request
    149156 */
    150 static void loader_set_args(ipc_callid_t rid, ipc_call_t *request)
     157static void ldr_set_args(ipc_callid_t rid, ipc_call_t *request)
    151158{
    152159        ipc_callid_t callid;
     
    221228}
    222229
     230/** Receive a call setting preset files of the program to execute.
     231 *
     232 * @param rid
     233 * @param request
     234 */
     235static void ldr_set_files(ipc_callid_t rid, ipc_call_t *request)
     236{
     237        ipc_callid_t callid;
     238        size_t buf_size;
     239        if (!ipc_data_write_receive(&callid, &buf_size)) {
     240                ipc_answer_0(callid, EINVAL);
     241                ipc_answer_0(rid, EINVAL);
     242                return;
     243        }
     244       
     245        if ((buf_size % sizeof(fs_node_t)) != 0) {
     246                ipc_answer_0(callid, EINVAL);
     247                ipc_answer_0(rid, EINVAL);
     248                return;
     249        }
     250       
     251        if (fil_buf != NULL) {
     252                free(fil_buf);
     253                fil_buf = NULL;
     254        }
     255       
     256        if (filv != NULL) {
     257                free(filv);
     258                filv = NULL;
     259        }
     260       
     261        fil_buf = malloc(buf_size);
     262        if (!fil_buf) {
     263                ipc_answer_0(callid, ENOMEM);
     264                ipc_answer_0(rid, ENOMEM);
     265                return;
     266        }
     267       
     268        ipc_data_write_finalize(callid, fil_buf, buf_size);
     269       
     270        int count = buf_size / sizeof(fs_node_t);
     271       
     272        /* Allocate filvv */
     273        filv = malloc((count + 1) * sizeof(fs_node_t *));
     274       
     275        if (filv == NULL) {
     276                free(fil_buf);
     277                ipc_answer_0(rid, ENOMEM);
     278                return;
     279        }
     280       
     281        /*
     282         * Fill filv with argument pointers
     283         */
     284        int i;
     285        for (i = 0; i < count; i++)
     286                filv[i] = &fil_buf[i];
     287       
     288        filc = count;
     289        filv[count] = NULL;
     290       
     291        ipc_answer_0(rid, EOK);
     292}
     293
    223294/** Load the previously selected program.
    224295 *
     
    227298 * @return 0 on success, !0 on error.
    228299 */
    229 static int loader_load(ipc_callid_t rid, ipc_call_t *request)
     300static int ldr_load(ipc_callid_t rid, ipc_call_t *request)
    230301{
    231302        int rc;
     
    242313        pcb.argc = argc;
    243314        pcb.argv = argv;
     315       
     316        pcb.filc = filc;
     317        pcb.filv = filv;
    244318       
    245319        if (prog_info.interp == NULL) {
     
    271345 * @return 0 on success, !0 on error.
    272346 */
    273 static void loader_run(ipc_callid_t rid, ipc_call_t *request)
     347static void ldr_run(ipc_callid_t rid, ipc_call_t *request)
    274348{
    275349        const char *cp;
     
    284358                DPRINTF("Run ELF interpreter.\n");
    285359                DPRINTF("Entry point: 0x%lx\n", interp_info.entry);
    286                 console_close();
    287360               
    288361                ipc_answer_0(rid, EOK);
     
    290363        } else {
    291364                /* Statically linked program */
    292                 console_close();
    293365                ipc_answer_0(rid, EOK);
    294366                elf_run(&prog_info, &pcb);
    295         } 
    296 
     367        }
     368       
    297369        /* Not reached */
    298370}
     
    303375 * to execute the loaded program).
    304376 */
    305 static void loader_connection(ipc_callid_t iid, ipc_call_t *icall)
     377static void ldr_connection(ipc_callid_t iid, ipc_call_t *icall)
    306378{
    307379        ipc_callid_t callid;
     
    331403                        exit(0);
    332404                case LOADER_GET_TASKID:
    333                         loader_get_taskid(callid, &call);
     405                        ldr_get_taskid(callid, &call);
    334406                        continue;
    335407                case LOADER_SET_PATHNAME:
    336                         loader_set_pathname(callid, &call);
     408                        ldr_set_pathname(callid, &call);
    337409                        continue;
    338410                case LOADER_SET_ARGS:
    339                         loader_set_args(callid, &call);
     411                        ldr_set_args(callid, &call);
     412                        continue;
     413                case LOADER_SET_FILES:
     414                        ldr_set_files(callid, &call);
    340415                        continue;
    341416                case LOADER_LOAD:
    342                         loader_load(callid, &call);
     417                        ldr_load(callid, &call);
    343418                        continue;
    344419                case LOADER_RUN:
    345                         loader_run(callid, &call);
     420                        ldr_run(callid, &call);
    346421                        /* Not reached */
    347422                default:
     
    367442       
    368443        /* Set a handler of incomming connections. */
    369         async_set_client_connection(loader_connection);
     444        async_set_client_connection(ldr_connection);
    370445       
    371446        /* Register at naming service. */
Note: See TracChangeset for help on using the changeset viewer.