Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 3003 → Rev 3004

/branches/dynload/uspace/app/iloader/main.c
35,9 → 35,12
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <ipc/ipc.h>
#include <errno.h>
#include <as.h>
 
#include <elf.h>
46,21 → 49,54
 
#define RTLD_BIAS 0x80000
 
int main(int argc, char *argv[])
static char *pathname = NULL;
 
void iloader_set_pathname(ipc_callid_t rid, ipc_call_t *request)
{
// ipc_callid_t callid;
size_t len;
char *name_buf;
 
/* printf("iloader_set_pathname\n");
if (!ipc_data_write_receive(&callid, &len)) {
ipc_answer_0(callid, EINVAL);
ipc_answer_0(rid, EINVAL);
return;
}
*/
len = IPC_GET_ARG2(*request);
printf("alloc %d bytes\n", len+1);
 
name_buf = malloc(len + 1);
if (!name_buf) {
// ipc_answer_0(callid, ENOMEM);
ipc_answer_0(rid, ENOMEM);
return;
}
 
printf("write_finalize\n");
ipc_data_write_finalize(rid, name_buf, len);
// ipc_answer_0(rid, EOK);
 
if (pathname != NULL) {
free(pathname);
pathname = NULL;
}
 
pathname = name_buf;
}
 
int iloader_run(ipc_callid_t rid, ipc_call_t *request)
{
int rc;
pcb_t *pcb;
 
elf_info_t prog_info;
elf_info_t interp_info;
char *file_name;
pcb_t *pcb;
int rc;
 
printf("This is loader\n");
getchar();
printf("Load program '%s'\n", pathname);
 
printf("Load program\n");
 
rc = elf_load_file("/dltest", 0, &prog_info);
// rc = elf_load_file("/tetris", 0, &prog_info);
rc = elf_load_file(pathname, 0, &prog_info);
if (rc < 0) {
printf("failed to load program\n");
return 1;
69,14 → 105,15
printf("Create PCB\n");
if (elf_create_pcb(&prog_info) < 0) return 1;
 
// elf_run(&prog_info);
if (prog_info.interp == NULL) {
/* Statically linked program */
printf("Run statically linked program\n");
elf_run(&prog_info);
return 0;
}
 
// getchar();
 
printf("Load dynamic linker\n");
file_name = "/rtld.so";
printf("open and read '%s'...\n", file_name);
rc = elf_load_file(file_name, RTLD_BIAS, &interp_info);
printf("Load dynamic linker '%s'\n", prog_info.interp);
rc = elf_load_file("/rtld.so", RTLD_BIAS, &interp_info);
if (rc < 0) {
printf("failed to load dynamic linker\n");
return 1;
83,7 → 120,7
}
 
/*
* Provide rtld with some useful data
* Provide dynamic linker with some useful data
*/
pcb = (pcb_t *)PCB_ADDRESS;
pcb->rtld_dynamic = interp_info.dynamic;
92,6 → 129,35
printf("run dynamic linker\n");
elf_run(&interp_info);
 
return 0;
}
 
int main(int argc, char *argv[])
{
ipc_callid_t callid;
ipc_call_t call;
int retval;
int len;
 
while (1) {
callid = ipc_wait_for_call(&call);
printf("received call, method=%d\n", IPC_GET_METHOD(call));
switch (IPC_GET_METHOD(call)) {
case IPC_M_DATA_WRITE:
iloader_set_pathname(callid, &call);
iloader_run(callid, &call);
exit(0);
continue;
default:
retval = ENOENT;
break;
}
if ((callid & IPC_CALLID_NOTIFICATION) == 0) {
printf("responding EINVAL to method %d\n", IPC_GET_METHOD(call));
ipc_answer_0(callid, EINVAL);
}
}
 
/* not reached */
return 0;
}