int main (int argc, char *argv[]) { char *fn; int f_ret, u_ret; prog_name = argv[0]; tvm_argc = argc; tvm_argv = argv; if (argc < 2) { usage (stderr); return 1; } else { fn = argv[1]; } init_vm (); if (install_user_ctx (fn) < 0) { error_out_no_errno ("failed to load user bytecode"); return 1; } if (install_firmware_ctx () < 0) { error_out_no_errno ("failed to install firmware"); return 1; } kyb_channel = NOT_PROCESS_P; scr_channel = NOT_PROCESS_P; err_channel = NOT_PROCESS_P; for (;;) { f_ret = run_firmware (); u_ret = run_user (); if ((f_ret == ECTX_EMPTY || f_ret == ECTX_SLEEP) && (u_ret == ECTX_EMPTY || u_ret == ECTX_SLEEP)) { if (firmware->fptr == NOT_PROCESS_P && user->fptr == NOT_PROCESS_P) { tvm_sleep (); } } else if (f_ret == ECTX_ERROR || u_ret == ECTX_ERROR) { break; } else if (u_ret == ECTX_SHUTDOWN) { /* Run firmware to clear buffers */ run_firmware (); break; } } if (u_ret == ECTX_ERROR) { tbc_t *tbc = user->priv.bytecode->tbc; if (tbc->debug) { tbc_dbg_t *dbg = tbc->debug; tbc_lnd_t *ln; tenc_str_t *file; int offset = user->iptr - tbc->bytecode; int i = 0; while (i < dbg->n_lnd) { if (dbg->lnd[i].offset > offset) { break; } i++; } ln = &(dbg->lnd[i - 1]); file = dbg->files; for (i = 0; i < ln->file; ++i) { file = file->next; } fprintf (stderr, "Error at %s:%d\n", file->str, ln->line ); } /* FIXME: more debugging */ fprintf (stderr, "Program failed, state = %c, eflags = %08x\n", user->state, user->eflags ); return 1; } free_ectx (firmware); free_ectx (user); free_bytecode (fw_bc); free_bytecode (us_bc); #ifdef TVM_PROFILING output_profiling (); #endif return 0; }
int server_start(server_t *s) { if (!getuid()) { uid_t uid = 0; gid_t gid = 0; run_user(s, &uid, &gid); run_group(s, &gid); // runtime data directory if (run_mkdir(JOURNAL_RUNDIR) < 0) { log_error("Failed to create '%s' directory: %m", JOURNAL_RUNDIR); return -1; } if (chown(JOURNAL_RUNDIR, uid, gid) < 0) { log_error("Unable to change owner “%s” directory to %s(%s): %m", JOURNAL_RUNDIR, s->runuser, s->rungroup); return -1; } syslog_run(s); // variable data directory if (run_mkdir(JOURNAL_LOGDIR) < 0) log_warning("Failed to create '%s' directory: %m", JOURNAL_LOGDIR); else { if (errno != EEXIST && chown(JOURNAL_LOGDIR, uid, gid) < 0) log_warning("Unable to change owner “%s” directory to %s(%s): %m", JOURNAL_LOGDIR, s->runuser, s->rungroup); } // change user and group of process if (gid > 0 && run_chgroup(gid) < 0) { log_error("Unable change group to “%s”: %m", s->rungroup); return -1; } if (uid > 0 && run_chuser(uid) < 0) { log_error("Unable change user to “%s”: %m", s->runuser); return -1; } } if (epollfd_create(&s->epoll) < 0) { log_error("Failed to create event loop: %m"); return -1; } s->msg = msg_new(LINE_MAX); if (!s->msg) return -1; seqnum_load(JOURNAL_RUNDIR "/kernel-seqnum", &s->kseqnum); if (hostname_open(s) < 0) return -1; boot_get_id(&s->boot_id); return 0; }