static int read_token_from_file(char *filename, struct securid_token *t) { char buf[BUFLEN]; int rc = ERR_BAD_LEN; FILE *f; f = fopen(filename, "r"); if (f == NULL) return ERR_GENERAL; while (fgets(buf, BUFLEN, f) != NULL) { rc = __stoken_parse_and_decode_token(buf, t); /* * keep reading more lines until we find something that * looks like a token */ if (rc == ERR_GENERAL) continue; else break; } fclose(f); return rc; }
static int read_token_from_file(char *filename, struct securid_token *t) { char buf[65536], *p; int rc = ERR_BAD_LEN; FILE *f; size_t len; f = fopen(filename, "r"); if (f == NULL) return ERR_FILE_READ; len = fread(buf, 1, sizeof(buf) - 1, f); if (ferror(f)) len = 0; fclose(f); if (len == 0) return ERR_FILE_READ; buf[len] = 0; for (p = buf; *p; ) { rc = __stoken_parse_and_decode_token(p, t, 1); /* * keep checking more lines until we find something that * looks like a token */ if (rc != ERR_GENERAL) break; p = strchr(p, '\n'); if (!p) break; p++; } return rc; }
int common_init(char *cmd) { int rc; struct securid_token *t; int is_import = !strcmp(cmd, "import"); /* * we don't actually scrub memory, but at least try to keep the seeds * from being swapped out to disk */ mlockall(MCL_CURRENT | MCL_FUTURE); cfg = xzalloc(sizeof(*cfg)); if (__stoken_read_rcfile(opt_rcfile, cfg, &warn) != ERR_NONE) __stoken_zap_rcfile_data(cfg); if (cfg->rc_ver && atoi(cfg->rc_ver) != RC_VER) { warn("rcfile: version mismatch, ignoring contents\n"); __stoken_zap_rcfile_data(cfg); } /* accept a token from the command line, or fall back to the rcfile */ do { t = xmalloc(sizeof(struct securid_token)); if (opt_token) { rc = __stoken_parse_and_decode_token(opt_token, t); if (rc != ERR_NONE) die("error: --token string is garbled: %s\n", stoken_errstr[rc]); current_token = t; break; } if (opt_file) { rc = read_token_from_file(opt_file, t); if (rc != ERR_NONE) die("error: no valid token in file '%s': %s\n", opt_file, stoken_errstr[rc]); current_token = t; break; } if (opt_random) { rc = securid_random_token(t); if (rc != ERR_NONE) die("error: can't generate random token\n"); current_token = t; break; } if (cfg->rc_token) { if (is_import) die("error: please specify --file, --token, or --random\n"); if (decode_rc_token(cfg, t) == ERR_NONE) { current_token = t; break; } } free(t); } while (0); if (is_import && cfg->rc_token && !opt_force) die("error: token already exists; use --force to overwrite it\n"); return ERR_NONE; }