/* * convert's a user's string to variable * * its decides in what format to store the value * its used mostly by 'input' functions */ void v_input2var(const char *str, var_t *var) { v_free(var); if (strlen(str) == 0) { // no data v_setstr(var, str); } else { char *np, *sb; char buf[64]; int type; var_int_t lv; var_num_t dv; sb = tmp_strdup(str); np = get_numexpr(sb, buf, &type, &lv, &dv); if (type == 1 && *np == '\0') { v_setint(var, lv); } else if (type == 2 && *np == '\0') { v_setreal(var, dv); } else { v_setstr(var, str); } tmp_free(sb); } }
/** * Using VMT's with keys (like environment-variables) * * gets a variable's value * if variable not found, returns NULL otherwise returns a newly created string with the value */ char *dbt_getvar(dbt_t fh, const char *varname) { char *buf, *retval = NULL; int i; dbt_var_t nd; // find if already exists for (i = 0; i < dbt_count(fh); i++) { char *nd_var, *nd_val; // load the record dbt_read(fh, i, &nd, sizeof(nd)); if (nd.sign == dbt_var_sign) { buf = tmp_alloc(nd.node_len); dbt_read(fh, i, buf, nd.node_len); nd_var = buf + sizeof(nd); nd_val = buf + sizeof(nd) + nd.var_len; // check varname if (strcmp(nd_var, varname) == 0) { retval = tmp_strdup(nd_val); tmp_free(buf); break; } tmp_free(buf); } } return retval; }
static char * dynedit_update_string(dynamic_text_file * d) { struct tm tmTime; time_t t; static char buffer[1024]; if (!strncmp(d->filename, "fate", 4) || !strncmp(d->filename, "arenalist", 9)) return tmp_strdup(""); printf("Updating File: %s\r\n", d->filename); t = time(NULL); tmTime = *(localtime(&t)); snprintf(buffer, sizeof(buffer), "\r\n-- %s UPDATE (%d/%d) -----------------------------------------\r\n\r\n", tmp_toupper(d->filename), tmTime.tm_mon + 1, tmTime.tm_mday); return buffer; }
int set_errno(int no, const char * msg) { errno = no; if (no != 0 && msg != NULL) { ErrorMessage * m = alloc_msg(SRC_MESSAGE); /* alloc_msg() assigns new value to 'errno', * need to be sure it does not change until this function exits. */ int err = errno; m->error = get_error_code(no); if (no == ERR_OTHER) { m->text = loc_strdup(msg); } else { size_t msg_len = strlen(msg); if (msg_len == 0) { m->text = loc_strdup(errno_to_str(no)); } else { const char * text0 = tmp_strdup(msg); const char * text1 = errno_to_str(no); if (text0[msg_len - 1] == '.' || text0[msg_len - 1] == '\n') { size_t len = msg_len + strlen(text1) + 2; char * text2 = (char *)loc_alloc(len); snprintf(text2, len, "%s %s", text0, text1); m->text = text2; } else { size_t len = msg_len + strlen(text1) + 3; char * text2 = (char *)loc_alloc(len); snprintf(text2, len, "%s. %s", text0, text1); m->text = text2; } } } errno = err; } return errno; }
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); }