static void command_set_win_size(char * token, Channel * c) { int err = 0; char id[256]; unsigned tid; Terminal * term = NULL; unsigned ws_col; unsigned ws_row; int changed = 0; json_read_string(&c->inp, id, sizeof(id)); json_test_char(&c->inp, MARKER_EOA); ws_col = json_read_ulong(&c->inp); json_test_char(&c->inp, MARKER_EOA); ws_row = json_read_ulong(&c->inp); json_test_char(&c->inp, MARKER_EOA); json_test_char(&c->inp, MARKER_EOM); tid = id2tid(id); if (tid == 0 || (term = find_terminal(tid)) == NULL) { err = ERR_INV_CONTEXT; } else if (set_process_tty_win_size(term->prs, ws_col, ws_row, &changed) < 0) { err = errno; } if (changed) send_event_terminal_win_size_changed(&term->bcg->out, term); write_stringz(&c->out, "R"); write_stringz(&c->out, token); write_errno(&c->out, err); write_stream(&c->out, MARKER_EOM); }
static void command_get_context(char * token, Channel * c) { int err = 0; char id[256]; int tid; Terminal * term = NULL; json_read_string(&c->inp, id, sizeof(id)); json_test_char(&c->inp, MARKER_EOA); json_test_char(&c->inp, MARKER_EOM); tid = id2tid(id); write_stringz(&c->out, "R"); write_stringz(&c->out, token); if (tid == 0 || (term = find_terminal(tid)) == NULL) { err = ERR_INV_CONTEXT; } write_errno(&c->out, err); if (term != NULL) { write_context(&c->out, tid); write_stream(&c->out, 0); } else { write_stringz(&c->out, "null"); } write_stream(&c->out, MARKER_EOM); }
void ApplyDynStep<Derived, ApplyGame, Solver>::init() { const TreeDecomposition* tdc = _solver->treedecomposition(); _node_bag = tdc->bag(_node); _child_bag = tdc->bag(_child); DPRINTLN("New Bag: " << *_node_bag << ", Old bag: " << *_child_bag); _terminal = find_terminal(); DPRINTLN("terminal " << _terminal << " is node " << vertex_of(_terminal)); _terminal_sym = _solver->terminal_symbol(_terminal); ((Derived*) this)->spec_init(); setup_assignment(); }
static void command_launch(char * token, Channel * c) { int err = 0; char encoding[TERM_PROP_DEF_SIZE]; char pty_type[TERM_PROP_DEF_SIZE]; const char * args[] = TERM_LAUNCH_ARGS; const char * exec = TERM_LAUNCH_EXEC; int selfattach = 0; ProcessStartParams prms; Terminal * term = (Terminal *)loc_alloc_zero(sizeof(Terminal)); memset(&prms, 0, sizeof(prms)); json_read_string(&c->inp, pty_type, sizeof(pty_type)); json_test_char(&c->inp, MARKER_EOA); json_read_string(&c->inp, encoding, sizeof(encoding)); json_test_char(&c->inp, MARKER_EOA); prms.envp = read_env(&c->inp); json_test_char(&c->inp, MARKER_EOM); #if !defined(_WIN32) && !defined(__CYGWIN__) { struct stat st; if (err == 0 && stat(exec, &st) != 0) { err = errno; if (err == ENOENT) { static char fnm[FILE_PATH_SIZE]; /* On some systems (e.g. Free DSB) bash is installed under /usr/local */ assert(exec[0] == '/'); snprintf(fnm, sizeof(fnm), "/usr/local%s", exec); if (stat(fnm, &st) == 0) { args[0] = exec = fnm; err = 0; } } if (err == ENOENT && strcmp(exec, "/bin/bash") == 0) { /* "bash" not found, try "sh" */ const char * fnm = "/bin/sh"; if (stat(fnm, &st) == 0) { args[0] = exec = fnm; err = 0; } } if (err) err = set_fmt_errno(err, "Cannot start %s", exec); } } set_terminal_env(&prms.envp, pty_type, encoding, exec); prms.dir = getenv("HOME"); if (prms.dir) prms.dir = tmp_strdup(prms.dir); #else { const char * home_drv = getenv("HOMEDRIVE"); const char * home_dir = getenv("HOMEPATH"); if (home_drv && home_dir) { prms.dir = tmp_strdup2(home_drv, home_dir); } } #endif prms.exe = exec; prms.args = (char **)args; prms.service = TERMINALS; prms.use_terminal = 1; prms.exit_cb = terminal_exited; prms.exit_args = term; if (err == 0 && start_process(c, &prms, &selfattach, &term->prs) < 0) err = errno; if (!err) { term->bcg = c->bcg; channel_lock_with_msg(term->channel = c, TERMINALS); strlcpy(term->pty_type, pty_type, sizeof(term->pty_type)); strlcpy(term->encoding, encoding, sizeof(term->encoding)); list_add_first(&term->link, &terms_list); assert(find_terminal(get_process_pid(term->prs)) == term); } else { assert(term->prs == NULL); loc_free(term); } /* write result back */ write_stringz(&c->out, "R"); write_stringz(&c->out, token); write_errno(&c->out, err); if (err) { write_stringz(&c->out, "null"); } else { write_context(&c->out, get_process_pid(term->prs)); write_stream(&c->out, 0); } write_stream(&c->out, MARKER_EOM); }
static void write_context(OutputStream * out, int tid) { Terminal * term = find_terminal(tid); const char * id = NULL; write_stream(out, '{'); if (term != NULL) { unsigned ws_col = 0; unsigned ws_row = 0; get_process_tty_win_size(term->prs, &ws_col, &ws_row); json_write_string(out, "ProcessID"); write_stream(out, ':'); json_write_string(out, pid2id(get_process_pid(term->prs), 0)); write_stream(out, ','); if (*term->pty_type) { json_write_string(out, "PtyType"); write_stream(out, ':'); json_write_string(out, term->pty_type); write_stream(out, ','); } if (*term->encoding) { json_write_string(out, "Encoding"); write_stream(out, ':'); json_write_string(out, term->encoding); write_stream(out, ','); } json_write_string(out, "Width"); write_stream(out, ':'); json_write_ulong(out, ws_col); write_stream(out, ','); json_write_string(out, "Height"); write_stream(out, ':'); json_write_ulong(out, ws_row); write_stream(out, ','); id = get_process_stream_id(term->prs, 0); if (id) { json_write_string(out, "StdInID"); write_stream(out, ':'); json_write_string(out, id); write_stream(out, ','); } id = get_process_stream_id(term->prs, 1); if (id) { json_write_string(out, "StdOutID"); write_stream(out, ':'); json_write_string(out, id); write_stream(out, ','); } id = get_process_stream_id(term->prs, 2); if (id) { json_write_string(out, "StdErrID"); write_stream(out, ':'); json_write_string(out, id); write_stream(out, ','); } } json_write_string(out, "ID"); write_stream(out, ':'); json_write_string(out, tid2id(tid)); write_stream(out, '}'); }