static void get_file_args(char *filename, argv_buf *abp, argv_buf *xabp) { argv_stack stck; int i; char **argv; ARGV_STACK_INIT(&stck); i = 0; argv = read_args_file(filename); while (argv) { while (argv[i]) { if (strcmp(argv[i], "-args_file") == 0) { char **new_argv; char *fname; if (!argv[++i]) usage("-args_file"); fname = argv[i++]; new_argv = read_args_file(fname); if (new_argv) { if (argv[i]) push_argv(&stck, argv, i); else efree(argv); i = 0; argv = new_argv; } } else { if (strcmp(argv[i], "-extra") == 0) { i++; while (argv[i]) save_arg(xabp, argv[i++]); break; } save_arg(abp, argv[i++]); } } efree(argv); pop_argv(&stck, &argv, &i); } }
process_t *process_alloc(void *text, int argc, char **argv) { process_t *process = (process_t*)kalloc(sizeof(process_t)); memset(process, 0, sizeof(process_t)); process->text = kalloc_aligned(USER_TEXT_SIZE, 4096); memcpy(process->text, text, USER_TEXT_SIZE); process->stack_k = kalloc(K_STACK_SIZE); process->stack_u = kalloc_aligned(U_STACK_SIZE, 4096); process->pages = process_page_table_alloc((uintptr_t)process->stack_u, (uintptr_t)process->text); process->num_pages = 0; process->argc = argc; process->runstate = PROCESS_RUNNABLE; process->current = false; process->next_switch_is_kernel = false; process->num_waitable = 0; process->brk = USER_HEAP; process->files = kalloc(sizeof(file_t) * PROCESS_MAX_FILES); process->files[0] = g_termbuf->file; process->files[1] = g_term->file; process->files[2] = g_term->file; process->files[3] = g_devio->file; process->child_statuses = ll_alloc_a(kalloc); stackptr_t u = STACK(process->stack_u, U_STACK_SIZE); u = push_argv((void*)USER_STACK_VMA, process->stack_u, u, argc, argv); process->argv = (char**)u; process->pid = next_pid++; stackptr_t k = STACK(process->stack_k, K_STACK_SIZE); process->state = (system_state_t*)push_system_state(k, process->stack_u, process->argc, process->argv); process->kstate = NULL; return process; }