int main(int argc, char *argv[]) { char *tmp; int ver = 0; int subver = 0; /* Setup stdin/stdout for line buffering */ setlinebuf(stdin); setlinebuf(stdout); if (read_environment()) { fprintf(stderr, "Failed to read environment: %s\n", strerror(errno)); exit(1); } connect_sphinx(); tmp = getenv("agi_enhanced"); if (tmp) { if (sscanf(tmp, "%30d.%30d", &ver, &subver) != 2) ver = 0; } if (ver < 1) { fprintf(stderr, "No enhanced AGI services available. Use EAGI, not AGI\n"); exit(1); } if (run_script()) return -1; exit(0); }
runner::env_vars_list_t runner::set_environment_for_process() const { auto curr_vars = read_environment(GetEnvironmentStringsW()); if (options.environmentMode == "user-default") { LPVOID envBlock = NULL; CreateEnvironmentBlock(&envBlock, NULL, FALSE); auto default_vars = read_environment((WCHAR*)envBlock); DestroyEnvironmentBlock(envBlock); for (auto i = default_vars.cbegin(); i != default_vars.cend(); ++i) { SetEnvironmentVariableA(i->first.c_str(), i->second.c_str()); } for (auto i = curr_vars.cbegin(); i != curr_vars.cend(); ++i) { if (std::find(default_vars.cbegin(), default_vars.cend(), *i) == default_vars.cend()) { SetEnvironmentVariableA(i->first.c_str(), NULL); } } } else if (options.environmentMode == "clear") { for (auto i = curr_vars.cbegin(); i != curr_vars.cend(); ++i) { SetEnvironmentVariableA(i->first.c_str(), NULL); } } for (auto i = options.environmentVars.cbegin(); i != options.environmentVars.cend(); ++i) { SetEnvironmentVariableA(i->first.c_str(), i->second.c_str()); } return curr_vars; }
int main(int argc, char **argv) { char **env = NULL; int count = 0; char fn[MAXPATHLEN]; int error = 0; make_file(fn, sizeof(fn)); write_file(fn, s1); count = read_environment(fn, &env); if(count != 3) { warnx("test 1: variable count %d != 3", count); error++; } write_file(fn, s2); count = read_environment(fn, &env); if(count != 1) { warnx("test 2: variable count %d != 1", count); error++; } unlink(fn); count = read_environment(fn, &env); if(count != 0) { warnx("test 3: variable count %d != 0", count); error++; } for(count = 0; env && env[count]; count++); if(count != 3) { warnx("total variable count %d != 3", count); error++; } free_environment(env); return error; }
void runner::restore_original_environment(const runner::env_vars_list_t& original) const { auto curr_vars = read_environment(GetEnvironmentStringsW()); for (auto i = original.cbegin(); i != original.cend(); ++i) { SetEnvironmentVariableA(i->first.c_str(), i->second.c_str()); } for (auto i = curr_vars.cbegin(); i != curr_vars.cend(); ++i) { if (std::find(original.cbegin(), original.cend(), *i) == original.cend()) { SetEnvironmentVariableA(i->first.c_str(), NULL); } } }
static void setup_environment (char ***env, const struct passwd *pwd) { int i, j, path; char **e; i = 0; path = 0; *env = NULL; i = read_environment(_PATH_ETC_ENVIRONMENT, env); e = *env; for (j = 0; j < i; j++) { if (!strncmp(e[j], "PATH=", 5)) { path = 1; } } e = *env; e = realloc(e, (i + 7) * sizeof(char *)); if (asprintf (&e[i++], "USER=%s", pwd->pw_name) == -1) syslog_and_die ("asprintf: out of memory"); if (asprintf (&e[i++], "HOME=%s", pwd->pw_dir) == -1) syslog_and_die ("asprintf: out of memory"); if (asprintf (&e[i++], "SHELL=%s", pwd->pw_shell) == -1) syslog_and_die ("asprintf: out of memory"); if (! path) { if (asprintf (&e[i++], "PATH=%s", _PATH_DEFPATH) == -1) syslog_and_die ("asprintf: out of memory"); } asprintf (&e[i++], "SSH_CLIENT=only_to_make_bash_happy"); if (do_unique_tkfile) if (asprintf (&e[i++], "KRB5CCNAME=%s", tkfile) == -1) syslog_and_die ("asprintf: out of memory"); e[i++] = NULL; *env = e; }
int main(int argc, char **argv) { int i, optidx = 0; char *su_user; struct passwd *su_info; struct passwd *login_info; struct passwd *pwd; char *shell; int ok = 0; setprogname (argv[0]); if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) usage(1); for (i=0; i < optidx; i++) if (strcmp(argv[i], "-") == 0) { full_login = 1; break; } if(help_flag) usage(0); if(version_flag) { print_version(NULL); exit(0); } if(optidx >= argc) su_user = "******"; else su_user = argv[optidx++]; if (!issuid() && getuid() != 0) warnx("Not setuid and you are not root, expect this to fail"); pwd = k_getpwnam(su_user); if(pwd == NULL) errx (1, "unknown login %s", su_user); if (pwd->pw_uid == 0 && strcmp ("root", su_user) != 0) { syslog (LOG_ALERT, "NIS attack, user %s has uid 0", su_user); errx (1, "unknown login %s", su_user); } su_info = dup_info(pwd); if (su_info == NULL) errx (1, "malloc: out of memory"); pwd = getpwuid(getuid()); if(pwd == NULL) errx(1, "who are you?"); login_info = dup_info(pwd); if (login_info == NULL) errx (1, "malloc: out of memory"); if(env_flag) shell = login_info->pw_shell; else shell = su_info->pw_shell; if(shell == NULL || *shell == '\0') shell = _PATH_BSHELL; #ifdef KRB5 if(kerberos_flag && ok == 0 && krb5_verify(login_info, su_info, kerberos_instance) == 0) ok = 5; #endif if(ok == 0 && login_info->pw_uid && verify_unix(login_info, su_info) != 0) { printf("Sorry!\n"); exit(1); } #ifdef HAVE_GETSPNAM { struct spwd *sp; long today; sp = getspnam(su_info->pw_name); if (sp != NULL) { today = time(0)/(24L * 60 * 60); if (sp->sp_expire > 0) { if (today >= sp->sp_expire) { if (login_info->pw_uid) errx(1,"Your account has expired."); else printf("Your account has expired."); } else if (sp->sp_expire - today < 14) printf("Your account will expire in %d days.\n", (int)(sp->sp_expire - today)); } if (sp->sp_max > 0) { if (today >= sp->sp_lstchg + sp->sp_max) { if (login_info->pw_uid) errx(1,"Your password has expired. Choose a new one."); else printf("Your password has expired. Choose a new one."); } else if (today >= sp->sp_lstchg + sp->sp_max - sp->sp_warn) printf("Your account will expire in %d days.\n", (int)(sp->sp_lstchg + sp->sp_max -today)); } } } #endif { char *tty = ttyname (STDERR_FILENO); if (tty) syslog (LOG_NOTICE | LOG_AUTH, "%s to %s on %s", login_info->pw_name, su_info->pw_name, tty); else syslog (LOG_NOTICE | LOG_AUTH, "%s to %s", login_info->pw_name, su_info->pw_name); } if(!env_flag) { if(full_login) { char *t = getenv ("TERM"); char **newenv = NULL; int j; i = read_environment(_PATH_ETC_ENVIRONMENT, &newenv); environ = malloc ((10 + i) * sizeof (char *)); if (environ == NULL) err (1, "malloc"); environ[0] = NULL; for (j = 0; j < i; j++) { char *p = strchr(newenv[j], '='); if (p == NULL) errx(1, "environment '%s' missing '='", newenv[j]); *p++ = 0; esetenv (newenv[j], p, 1); } free(newenv); esetenv ("PATH", _PATH_DEFPATH, 1); if (t) esetenv ("TERM", t, 1); if (chdir (su_info->pw_dir) < 0) errx (1, "no directory"); } if (full_login || su_info->pw_uid) esetenv ("USER", su_info->pw_name, 1); esetenv("HOME", su_info->pw_dir, 1); esetenv("SHELL", shell, 1); } { char **new_argv; char *p; p = strrchr(shell, '/'); if(p) p++; else p = shell; if (strcmp(p, "csh") != 0) csh_f_flag = 0; new_argv = malloc(((cmd ? 2 : 0) + 1 + argc - optidx + 1 + csh_f_flag) * sizeof(*new_argv)); if (new_argv == NULL) err (1, "malloc"); i = 0; if(full_login) { if (asprintf(&new_argv[i++], "-%s", p) == -1) errx (1, "malloc"); } else new_argv[i++] = p; if (cmd) { new_argv[i++] = "-c"; new_argv[i++] = cmd; } if (csh_f_flag) new_argv[i++] = "-f"; for (argv += optidx; *argv; ++argv) new_argv[i++] = *argv; new_argv[i] = NULL; if(setgid(su_info->pw_gid) < 0) err(1, "setgid"); if (initgroups (su_info->pw_name, su_info->pw_gid) < 0) err (1, "initgroups"); if(setuid(su_info->pw_uid) < 0 || (su_info->pw_uid != 0 && setuid(0) == 0)) err(1, "setuid"); #ifdef KRB5 if (ok == 5) krb5_start_session(); #endif execve(shell, new_argv, environ); } exit(1); }
readstat_error_t rdata_parse(rdata_parser_t *parser, const char *filename, void *user_ctx) { int is_rdata = 0; readstat_error_t retval = READSTAT_OK; rdata_v2_header_t v2_header; rdata_ctx_t *ctx = init_rdata_ctx(filename); if (ctx == NULL) { retval = READSTAT_ERROR_OPEN; goto cleanup; } ctx->user_ctx = user_ctx; ctx->table_handler = parser->table_handler; ctx->column_handler = parser->column_handler; ctx->column_name_handler = parser->column_name_handler; ctx->text_value_handler = parser->text_value_handler; ctx->value_label_handler = parser->value_label_handler; ctx->error_handler = parser->error_handler; if ((retval = init_stream(ctx)) != READSTAT_OK) { goto cleanup; } char header_line[5]; if (read_st(ctx, &header_line, sizeof(header_line)) != sizeof(header_line)) { retval = READSTAT_ERROR_READ; goto cleanup; } if (strncmp("RDX2\n", header_line, sizeof(header_line)) == 0) { is_rdata = 1; } else { reset_stream(ctx); } if (read_st(ctx, &v2_header, sizeof(v2_header)) != sizeof(v2_header)) { retval = READSTAT_ERROR_READ; goto cleanup; } if (ctx->machine_needs_byteswap) { v2_header.format_version = byteswap4(v2_header.format_version); v2_header.writer_version = byteswap4(v2_header.writer_version); v2_header.reader_version = byteswap4(v2_header.reader_version); } if (is_rdata) { retval = read_environment(NULL, ctx); } else { retval = read_toplevel_object(NULL, NULL, ctx); } if (retval != READSTAT_OK) goto cleanup; char test; if (read_st(ctx, &test, 1) == 1) { retval = READSTAT_ERROR_PARSE; goto cleanup; } cleanup: if (ctx) { free_rdata_ctx(ctx); } return retval; }
PRIVATE void MPII_Read_options (int *argc, char ***argv) { read_environment (); read_arguments (argc, argv); }