static int read_db(struct database *db) { char *line = NULL; size_t linesz = 0; struct group *group = NULL, **pgroup = &db->groups; int linenr = 0; while (getline(&line, &linesz, db->fh) > 0) { char *s; s = strchr(line, '#'); if (s) { struct group *cmt; DB_NEW(cmt); *pgroup = cmt; pgroup = &cmt->next; cmt->comment = xstrdup(s + 1); *s = 0; } s = cleanline(line); linenr++; if (!s) continue; if (*s == '[') { int n; char *name; ++s; n = strcspn(s, "]"); if (s[n] == 0) goto parse_error; name = xalloc(n + 1); memcpy(name, s, n); group = alloc_group(name); *pgroup = group; pgroup = &group->next; } else { char *p; if (!group) goto parse_error; p = s + strcspn(s, ":"); if (*p != ':') goto parse_error; *p++ = 0; if (*p == ' ') p++; else goto parse_error; change_entry(db, group, line, p); } } if (ferror(db->fh)) { DBerror("IO error while reading database %s: %s\n", db->fn, strerror(errno)); goto error; } free(line); return 0; parse_error: DBerror("Parse error in database %s at line %d\n", db->fn, linenr); error: free(line); return -1; }
int main(int ac, char **av) { struct database *db; struct group *group = NULL; char *line = NULL; size_t linesz = 0; if (!av[1]) { printf("%s database\n", av[0]); exit(1); } printf("dbtest\n"); db = open_db(av[1], 1); while (printf("> "), fflush(stdout), getline(&line, &linesz, stdin) > 0) { char *p = line + strlen(line) - 1; while (p >= line && isspace(*p)) *p-- = 0; switch (line[0]) { case 's': C(sync_db(db)); break; case 'q': C(close_db(db)); exit(0); case 'g': group = find_group(db, line + 1); if (group) printf("found\n"); break; case 'G': NEEDGROUP; C(delete_group(db, group)); group = NULL; break; case 'a': { int existed = 0; group = add_group(db, line + 1, &existed); if (existed) printf("existed\n"); break; } case 'v': NEEDGROUP; printf("%s\n", entry_val(group, line + 1)); break; case 'c': { p = line + 1; char *entry = strsep(&p, ","); NEEDGROUP; change_entry(db, group, entry, strsep(&p, "")); break; } case 'L': NEEDGROUP; clone_group(db, group, line + 1); break; case 'f': { struct group *g; p = line + 1; char *entry = strsep(&p, ","); char *val = strsep(&p, ""); g = NULL; int nr = 0; while ((g = find_entry(db, g, entry, val)) != NULL) { if (nr == 0) group = g; nr++; dump_group(group, stdout); } if (nr == 0) printf("not found\n"); break; } case 'C': NEEDGROUP; add_comment(db, group, line + 1); break; case 'd': NEEDGROUP; dump_group(group, stdout); break; case 'D': dump_database(db, stdout); break; default: usage(); break; } } return 0; }
int kt_change (struct change_options *opt, int argc, char **argv) { krb5_error_code ret; krb5_keytab keytab; krb5_kt_cursor cursor; krb5_keytab_entry entry; int i, j, max; struct change_set *changeset; int errors = 0; if((keytab = ktutil_open_keytab()) == NULL) return 1; j = 0; max = 0; changeset = NULL; ret = krb5_kt_start_seq_get(context, keytab, &cursor); if(ret){ krb5_warn(context, ret, "%s", keytab_string); goto out; } while((ret = krb5_kt_next_entry(context, keytab, &entry, &cursor)) == 0) { int add = 0; for (i = 0; i < j; ++i) { if (krb5_principal_compare (context, changeset[i].principal, entry.principal)) { if (changeset[i].kvno < entry.vno) changeset[i].kvno = entry.vno; break; } } if (i < j) { krb5_kt_free_entry (context, &entry); continue; } if (argc == 0) { add = 1; } else { for (i = 0; i < argc; ++i) { krb5_principal princ; ret = krb5_parse_name (context, argv[i], &princ); if (ret) { krb5_warn (context, ret, "%s", argv[i]); continue; } if (krb5_principal_compare (context, princ, entry.principal)) add = 1; krb5_free_principal (context, princ); } } if (add) { if (j >= max) { void *tmp; max = max(max * 2, 1); tmp = realloc (changeset, max * sizeof(*changeset)); if (tmp == NULL) { krb5_kt_free_entry (context, &entry); krb5_warnx (context, "realloc: out of memory"); ret = ENOMEM; break; } changeset = tmp; } ret = krb5_copy_principal (context, entry.principal, &changeset[j].principal); if (ret) { krb5_warn (context, ret, "krb5_copy_principal"); krb5_kt_free_entry (context, &entry); break; } changeset[j].kvno = entry.vno; ++j; } krb5_kt_free_entry (context, &entry); } krb5_kt_end_seq_get(context, keytab, &cursor); if (ret == KRB5_KT_END) { ret = 0; for (i = 0; i < j; i++) { if (verbose_flag) { char *client_name; ret = krb5_unparse_name (context, changeset[i].principal, &client_name); if (ret) { krb5_warn (context, ret, "krb5_unparse_name"); } else { printf("Changing %s kvno %d\n", client_name, changeset[i].kvno); free(client_name); } } ret = change_entry (keytab, changeset[i].principal, changeset[i].kvno, opt->realm_string, opt->admin_server_string, opt->server_port_integer); if (ret != 0) errors = 1; } } else errors = 1; for (i = 0; i < j; i++) krb5_free_principal (context, changeset[i].principal); free (changeset); out: krb5_kt_close(context, keytab); return errors; }