Deleted Added
full compact
36c36
< RCSID("$Id: copy.c,v 1.1 2000/01/02 04:41:01 assar Exp $");
---
> RCSID("$Id: copy.c,v 1.5 2000/12/16 00:45:29 joda Exp $");
37a38,129
>
> static krb5_boolean
> compare_keyblock(const krb5_keyblock *a, const krb5_keyblock *b)
> {
> if(a->keytype != b->keytype ||
> a->keyvalue.length != b->keyvalue.length ||
> memcmp(a->keyvalue.data, b->keyvalue.data, a->keyvalue.length) != 0)
> return FALSE;
> return TRUE;
> }
>
> static int
> kt_copy_int (const char *from, const char *to)
> {
> krb5_error_code ret;
> krb5_keytab src_keytab, dst_keytab;
> krb5_kt_cursor cursor;
> krb5_keytab_entry entry, dummy;
>
> ret = krb5_kt_resolve (context, from, &src_keytab);
> if (ret) {
> krb5_warn (context, ret, "resolving src keytab `%s'", from);
> return 0;
> }
>
> ret = krb5_kt_resolve (context, to, &dst_keytab);
> if (ret) {
> krb5_kt_close (context, src_keytab);
> krb5_warn (context, ret, "resolving dst keytab `%s'", to);
> return 0;
> }
>
> ret = krb5_kt_start_seq_get (context, src_keytab, &cursor);
> if (ret) {
> krb5_warn (context, ret, "krb5_kt_start_seq_get %s", keytab_string);
> goto fail;
> }
>
> while((ret = krb5_kt_next_entry(context, src_keytab,
> &entry, &cursor)) == 0) {
> char *name_str;
> char *etype_str;
> krb5_unparse_name (context, entry.principal, &name_str);
> krb5_enctype_to_string(context, entry.keyblock.keytype, &etype_str);
> ret = krb5_kt_get_entry(context, dst_keytab,
> entry.principal,
> entry.vno,
> entry.keyblock.keytype,
> &dummy);
> if(ret == 0) {
> /* this entry is already in the new keytab, so no need to
> copy it; if the keyblocks are not the same, something
> is weird, so complain about that */
> if(!compare_keyblock(&entry.keyblock, &dummy.keyblock)) {
> krb5_warnx(context, "entry with different keyvalue "
> "already exists for %s, keytype %s, kvno %d",
> name_str, etype_str, entry.vno);
> }
> krb5_kt_free_entry(context, &dummy);
> krb5_kt_free_entry (context, &entry);
> free(name_str);
> free(etype_str);
> continue;
> } else if(ret != KRB5_KT_NOTFOUND) {
> krb5_warn(context, ret, "krb5_kt_get_entry(%s)", name_str);
> krb5_kt_free_entry (context, &entry);
> free(name_str);
> free(etype_str);
> break;
> }
> if (verbose_flag)
> fprintf (stderr, "copying %s, keytype %s, kvno %d\n", name_str,
> etype_str, entry.vno);
> ret = krb5_kt_add_entry (context, dst_keytab, &entry);
> krb5_kt_free_entry (context, &entry);
> if (ret) {
> krb5_warn (context, ret, "krb5_kt_add_entry(%s)", name_str);
> free(name_str);
> free(etype_str);
> break;
> }
> free(name_str);
> free(etype_str);
> }
> krb5_kt_end_seq_get (context, src_keytab, &cursor);
>
> fail:
> krb5_kt_close (context, src_keytab);
> krb5_kt_close (context, dst_keytab);
> return 0;
> }
>
41d132
< krb5_error_code ret;
44,46d134
< krb5_keytab src_keytab, dst_keytab;
< krb5_kt_cursor cursor;
< krb5_keytab_entry entry;
55a144
> args[i++].value = &verbose_flag;
77,81c166,167
< ret = krb5_kt_resolve (context, argv[0], &src_keytab);
< if (ret) {
< krb5_warn (context, ret, "resolving src keytab `%s'", argv[0]);
< return 0;
< }
---
> return kt_copy_int(argv[0], argv[1]);
> }
83,86c169,205
< ret = krb5_kt_resolve (context, argv[1], &dst_keytab);
< if (ret) {
< krb5_kt_close (context, src_keytab);
< krb5_warn (context, ret, "resolving dst keytab `%s'", argv[1]);
---
> #ifndef KEYFILE
> #define KEYFILE "/etc/srvtab"
> #endif
>
> /* copy to from v4 srvtab, just short for copy */
> static int
> conv(int srvconv, int argc, char **argv)
> {
> int help_flag = 0;
> char *srvtab = KEYFILE;
> int optind = 0;
> char kt4[1024], kt5[1024];
>
> char *name;
>
> struct getargs args[] = {
> { "srvtab", 's', arg_string, NULL},
> { "help", 'h', arg_flag, NULL}
> };
>
> int num_args = sizeof(args) / sizeof(args[0]);
> int i = 0;
>
> args[i++].value = &srvtab;
> args[i++].value = &help_flag;
>
> if(srvconv)
> name = "ktutil srvconvert";
> else
> name = "ktutil srvcreate";
>
> if(getarg(args, num_args, argc, argv, &optind)){
> arg_printusage(args, num_args, name, "");
> return 1;
> }
> if(help_flag){
> arg_printusage(args, num_args, name, "");
90,93c209,214
< ret = krb5_kt_start_seq_get (context, src_keytab, &cursor);
< if (ret) {
< krb5_warn (context, ret, "krb5_kt_start_seq_get");
< goto fail;
---
> argc -= optind;
> argv += optind;
>
> if (argc != 0) {
> arg_printusage(args, num_args, name, "");
> return 1;
96,100c217
< while((ret = krb5_kt_next_entry(context, src_keytab,
< &entry, &cursor)) == 0) {
< ret = krb5_kt_add_entry (context, dst_keytab, &entry);
< if (verbose_flag) {
< char *name_str;
---
> snprintf(kt4, sizeof(kt4), "krb4:%s", srvtab);
102,104c219,224
< krb5_unparse_name (context, entry.principal, &name_str);
< printf ("copying %s\n", name_str);
< free (name_str);
---
> if(srvconv) {
> if(keytab_string != NULL)
> return kt_copy_int(kt4, keytab_string);
> else {
> krb5_kt_default_name(context, kt5, sizeof(kt5));
> return kt_copy_int(kt4, kt5);
105a226,228
> } else {
> if(keytab_string != NULL)
> return kt_copy_int(keytab_string, kt4);
107,111c230,231
< krb5_kt_free_entry (context, &entry);
< if (ret) {
< krb5_warn (context, ret, "krb5_kt_add_entry");
< break;
< }
---
> krb5_kt_default_name(context, kt5, sizeof(kt5));
> return kt_copy_int(kt5, kt4);
113c233
< krb5_kt_end_seq_get (context, src_keytab, &cursor);
---
> }
115,118c235,238
< fail:
< krb5_kt_close (context, src_keytab);
< krb5_kt_close (context, dst_keytab);
< return 0;
---
> int
> srvconv(int argc, char **argv)
> {
> return conv(1, argc, argv);
119a240,245
>
> int
> srvcreate(int argc, char **argv)
> {
> return conv(0, argc, argv);
> }