/* * Write a field of bytes from krb5_data as a hexadecimal string. Write empty * strings as "-1" unless requested. */ static int write_data(struct rec_args *args, krb5_data *data) { int ret; char *p; size_t i; struct k5buf buf; struct rechandle *h = args->rh; struct tdopts *opts = args->opts; if (data->length == 0 && !opts->emptyhex_empty) { if (writefield(h, "-1") < 0) return -1; return 0; } k5_buf_init_dynamic(&buf); p = data->data; for (i = 0; i < data->length; i++) k5_buf_add_fmt(&buf, "%02x", (unsigned char)p[i]); if (buf.data == NULL) { errno = ENOMEM; return -1; } ret = writefield(h, "%s", (char *)buf.data); k5_buf_free(&buf); return ret; }
/* Write a single record of a keydata/keyinfo key set. */ static krb5_error_code keyinfo_rec(struct rec_args *args, const char *name, int i, krb5_key_data *kd, int dumpkeys) { int ret; krb5_data data; struct rechandle *h = args->rh; if (startrec(h) < 0) return errno; if (writefield(h, "%s", name) < 0) return errno; if (writefield(h, "%d", i) < 0) return errno; if (writefield(h, "%d", kd->key_data_kvno) < 0) return errno; if (write_enctype(args, kd->key_data_type[0]) < 0) return errno; if (dumpkeys) { data.length = kd->key_data_length[0]; data.data = (void *)kd->key_data_contents[0]; if (write_data(args, &data) < 0) return errno; } ret = write_salttype(args, kd->key_data_type[1]); if (ret) return ret; data.length = kd->key_data_length[1]; data.data = (void *)kd->key_data_contents[1]; if (write_data(args, &data) < 0) return errno; if (endrec(h) < 0) return errno; return 0; }
/* Write a record corresponding to a single principal flag setting. */ static krb5_error_code princflag_rec(struct rechandle *h, const char *name, const char *flagname, int set) { if (startrec(h) < 0) return errno; if (writefield(h, "%s", name) < 0) return errno; if (writefield(h, "%s", flagname) < 0) return errno; if (writefield(h, "%d", set) < 0) return errno; if (endrec(h) < 0) return errno; return 0; }
void model_writefieldas(model* m, char fname[], char varname[], char varnameas[], int k, float* v) { int ni, nj, nk; int mvid = model_getvarid(m, varnameas, 1); model_getvardims(m, mvid, &ni, &nj, &nk); assert(k < nk); writefield(fname, varname, k, ni, nj, nk, v); }
/* Write a principal's lockout data. */ static krb5_error_code princ_lockout(struct rec_args *args, const char *name, krb5_db_entry *dbe) { struct rechandle *h = args->rh; if (startrec(h) < 0) return errno; if (writefield(h, "%s", name) < 0) return errno; if (write_date(args, dbe->last_success) < 0) return errno; if (write_date(args, dbe->last_failed) < 0) return errno; if (writefield(h, "%d", dbe->fail_auth_count) < 0) return errno; if (endrec(h) < 0) return errno; return 0; }
/* Write a date field, optionally as a decimal POSIX timestamp. */ static int write_date(struct rec_args *args, krb5_timestamp when) { struct tdopts *opts = args->opts; struct rechandle *h = args->rh; if (opts->numeric) return writefield(h, "%d", when); return write_date_iso(args, when); }
/* Write a principal's ticket policy. */ static krb5_error_code princ_tktpolicy(struct rec_args *args, const char *name, krb5_db_entry *dbe) { struct rechandle *h = args->rh; if (startrec(h) < 0) return errno; if (writefield(h, "%s", name) < 0) return errno; if (write_date(args, dbe->expiration) < 0) return errno; if (write_date(args, dbe->pw_expiration) < 0) return errno; if (writefield(h, "%d", dbe->max_life) < 0) return errno; if (writefield(h, "%d", dbe->max_renewable_life) < 0) return errno; if (endrec(h) < 0) return errno; return 0; }
/* Write a salttype field, optionally as decimal. */ static krb5_error_code write_salttype(struct rec_args *args, krb5_int16 salttype) { char buf[256]; krb5_error_code ret; struct rechandle *h = args->rh; struct tdopts *opts = args->opts; if (!opts->numeric) { ret = krb5_salttype_to_string(salttype, buf, sizeof(buf)); if (ret == 0) { if (writefield(h, "%s", buf) < 0) return errno; return ret; } } /* decimal if requested, or if conversion failed */ if (writefield(h, "%d", salttype) < 0) return errno; return 0; }
/* Write a principal's string attributes. */ static krb5_error_code princ_stringattrs(struct rec_args *args, const char *name, krb5_db_entry *dbe) { int i, nattrs; krb5_error_code ret; krb5_string_attr *attrs; struct rechandle *h = args->rh; ret = krb5_dbe_get_strings(util_context, dbe, &attrs, &nattrs); if (ret) return ret; for (i = 0; i < nattrs; i++) { if (startrec(h) < 0) { ret = errno; goto cleanup; } if (writefield(h, "%s", name) < 0) { ret = errno; goto cleanup; } if (writefield(h, "%s", attrs[i].key) < 0) { ret = errno; goto cleanup; } if (writefield(h, "%s", attrs[i].value) < 0) { ret = errno; goto cleanup; } if (endrec(h) < 0) { ret = errno; goto cleanup; } } cleanup: krb5_dbe_free_strings(util_context, attrs, nattrs); return ret; }
/* * Write a field of bytes from krb5_data as a hexadecimal string. Write empty * strings as "-1" unless requested. */ static int write_data(struct rec_args *args, krb5_data *data) { int ret; char *hex; struct rechandle *h = args->rh; struct tdopts *opts = args->opts; if (data->length == 0 && !opts->emptyhex_empty) { if (writefield(h, "-1") < 0) return -1; return 0; } ret = k5_hex_encode(data->data, data->length, FALSE, &hex); if (ret) { errno = ret; return -1; } ret = writefield(h, "%s", hex); free(hex); return ret; }
/* * Write a header line if h->rectype is null. (If rectype is set, it will be * prefixed to output lines, most likely in a mixed record type output file, so * it doesn't make sense to output a header line in that case.) */ int writeheader(struct rechandle *h, char * const *a) { int ret = 0; char * const *p; if (h->rectype != NULL) return 0; for (p = a; *p != NULL; p++) { ret = writefield(h, "%s", *p); if (ret < 0) return ret; } ret = endrec(h); return ret; }
/* Write a date field as an ISO 8601 UTC date/time representation. */ static int write_date_iso(struct rec_args *args, krb5_timestamp when) { char buf[64]; time_t t; struct tm *tm = NULL; struct rechandle *h = args->rh; t = ts2tt(when); tm = gmtime(&t); if (tm == NULL) { errno = EINVAL; return -1; } if (strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%SZ", tm) == 0) { errno = EINVAL; return -1; } if (writefield(h, "%s", buf) < 0) return -1; return 0; }
void model_writefield(model* m, char fname[], int time, char varname[], int k, float* v) { writefield(fname, varname, k, v); }
/* Write a principal's metadata. */ static krb5_error_code princ_meta(struct rec_args *args, const char *name, krb5_db_entry *dbe) { int got_adb = 0; char *modby; krb5_kvno mkvno; const char *policy; krb5_principal mod_princ = NULL; krb5_timestamp mod_time, last_pwd; krb5_error_code ret; osa_princ_ent_rec adb; struct rechandle *h = args->rh; memset(&adb, 0, sizeof(adb)); if (startrec(h) < 0) return errno; if (writefield(h, "%s", name) < 0) return errno; ret = krb5_dbe_lookup_last_pwd_change(util_context, dbe, &last_pwd); if (ret) return ret; ret = krb5_dbe_get_mkvno(util_context, dbe, &mkvno); if (ret) return ret; ret = krb5_dbe_lookup_mod_princ_data(util_context, dbe, &mod_time, &mod_princ); if (ret) return ret; ret = krb5_unparse_name(util_context, mod_princ, &modby); krb5_free_principal(util_context, mod_princ); if (ret) return ret; ret = writefield(h, "%s", modby); krb5_free_unparsed_name(util_context, modby); if (ret < 0) return errno; if (write_date(args, mod_time) < 0) return errno; if (write_date(args, last_pwd) < 0) return errno; got_adb = get_adb(dbe, &adb); if (got_adb && adb.policy != NULL) policy = adb.policy; else policy = ""; ret = writefield(h, "%s", policy); if (ret < 0) { ret = errno; goto cleanup; } if (writefield(h, "%d", mkvno) < 0) { ret = errno; goto cleanup; } if (writefield(h, "%d", adb.admin_history_kvno) < 0) { ret = errno; goto cleanup; } if (endrec(h) < 0) ret = errno; else ret = 0; cleanup: kdb_free_entry(NULL, NULL, &adb); return ret; }
int main(int argc, char **argv) { int ch, csv = 0, i, nf; char **a, *rectype = NULL; struct rechandle *h; argv0 = argv[0]; while ((ch = getopt(argc, argv, "T:c")) != -1) { switch (ch) { case 'T': rectype = optarg; break; case 'c': csv = 1; break; default: usage(); break; } } argc -= optind; argv += optind; if (csv) h = rechandle_csv(stdout, rectype); else h = rechandle_tabsep(stdout, rectype); if (h == NULL) exit(1); if (*argv == NULL) usage(); nf = atoi(*argv); argc--; argv++; a = calloc(nf + 1, sizeof(*a)); if (a == NULL) exit(1); for (i = 0; argv[i] != NULL && i < nf; i++) a[i] = argv[i]; if (i != nf) usage(); argv += nf; a[nf] = NULL; if (rectype == NULL && writeheader(h, a) < 0) exit(1); free(a); while (*argv != NULL) { if (startrec(h) < 0) exit(1); for (i = 0; argv[i] != NULL && i < nf; i++) { if (writefield(h, "%s", argv[i]) < 0) exit(1); } if (i != nf) usage(); argv += nf; if (endrec(h) < 0) exit(1); } exit(0); }