diff options
| author | Ken Raeburn <raeburn@mit.edu> | 2005-06-21 01:36:03 +0000 |
|---|---|---|
| committer | Ken Raeburn <raeburn@mit.edu> | 2005-06-21 01:36:03 +0000 |
| commit | f72c3ffaca4600d4e75282857ce4dda11106d5e7 (patch) | |
| tree | 89df6e717f00e1687994fc089fd6df9ff8a5c21c /src/kdc/main.c | |
| parent | f4aaa29ac68e3dd5a2ae326cd54918c7250558e9 (diff) | |
| download | krb5-f72c3ffaca4600d4e75282857ce4dda11106d5e7.tar.gz krb5-f72c3ffaca4600d4e75282857ce4dda11106d5e7.tar.xz krb5-f72c3ffaca4600d4e75282857ce4dda11106d5e7.zip | |
Novell Database Abstraction Layer merge.
Will probably break things.
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@17258 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/kdc/main.c')
| -rw-r--r-- | src/kdc/main.c | 111 |
1 files changed, 81 insertions, 30 deletions
diff --git a/src/kdc/main.c b/src/kdc/main.c index 961f3bbee..c5ecdec7a 100644 --- a/src/kdc/main.c +++ b/src/kdc/main.c @@ -147,9 +147,9 @@ finish_realm(kdc_realm_t *rdp) * realm data and we should be all set to begin operation for that realm. */ static krb5_error_code -init_realm(char *progname, kdc_realm_t *rdp, char *realm, char *def_dbname, +init_realm(char *progname, kdc_realm_t *rdp, char *realm, char *def_mpname, krb5_enctype def_enctype, char *def_udp_ports, - char *def_tcp_ports, krb5_boolean def_manual) + char *def_tcp_ports, krb5_boolean def_manual, char **db_args) { krb5_error_code kret; krb5_boolean manual; @@ -180,13 +180,6 @@ init_realm(char *progname, kdc_realm_t *rdp, char *realm, char *def_dbname, if (rparams && rparams->realm_profile) rdp->realm_profile = strdup(rparams->realm_profile); - /* Handle database name */ - if (rparams && rparams->realm_dbname) - rdp->realm_dbname = strdup(rparams->realm_dbname); - else - rdp->realm_dbname = (def_dbname) ? strdup(def_dbname) : - strdup(DEFAULT_KDB_FILE); - /* Handle master key name */ if (rparams && rparams->realm_mkey_name) rdp->realm_mpname = strdup(rparams->realm_mkey_name); @@ -245,6 +238,17 @@ init_realm(char *progname, kdc_realm_t *rdp, char *realm, char *def_dbname, goto whoops; } + /* first open the database before doing anything */ +#ifdef KRBCONF_KDC_MODIFIES_KDB + if ((kret = krb5_db_open(rdp->realm_context, db_args, KRB5_KDB_OPEN_RW))) { +#else + if ((kret = krb5_db_open(rdp->realm_context, db_args, KRB5_KDB_OPEN_RO))) { +#endif + com_err(progname, kret, + "while initializing database for realm %s", realm); + goto whoops; + } + /* Assemble and parse the master key name */ if ((kret = krb5_db_setup_mkey_name(rdp->realm_context, rdp->realm_mpname, rdp->realm_name, (char **) NULL, @@ -268,20 +272,6 @@ init_realm(char *progname, kdc_realm_t *rdp, char *realm, char *def_dbname, goto whoops; } - /* Set and open the database. */ - if (rdp->realm_dbname && - (kret = krb5_db_set_name(rdp->realm_context, rdp->realm_dbname))) { - com_err(progname, kret, - "while setting database name to %s for realm %s", - rdp->realm_dbname, realm); - goto whoops; - } - if ((kret = krb5_db_init(rdp->realm_context))) { - com_err(progname, kret, - "while initializing database for realm %s", realm); - goto whoops; - } - /* Verify the master key */ if ((kret = krb5_db_verify_master_key(rdp->realm_context, rdp->realm_mprinc, @@ -408,7 +398,10 @@ setup_sam(void) void usage(char *name) { - fprintf(stderr, "usage: %s [-d dbpathname] [-r dbrealmname] [-R replaycachename ]\n\t[-m] [-k masterenctype] [-M masterkeyname] [-p port] [-4 v4mode] [-X] [-n]\n", name); + fprintf(stderr, "usage: %s [-x db_args]* [-d dbpathname] [-r dbrealmname] [-R replaycachename ]\n\t[-m] [-k masterenctype] [-M masterkeyname] [-p port] [-4 v4mode] [-X] [-n]\n" + "\nwhere,\n\t[-x db_args]* - any number of database specific arguments.\n" + "\t\t\tLook at each database documentation for supported arguments\n", + name); return; } @@ -428,6 +421,9 @@ initialize_realms(krb5_context kcontext, int argc, char **argv) char *default_tcp_ports = 0; krb5_pointer aprof; const char *hierarchy[3]; + char **db_args = NULL; + int db_args_size = 0; + #ifdef KRB5_KRB4_COMPAT char *v4mode = 0; #endif @@ -459,26 +455,77 @@ initialize_realms(krb5_context kcontext, int argc, char **argv) * Loop through the option list. Each time we encounter a realm name, * use the previously scanned options to fill in for defaults. */ - while ((c = getopt(argc, argv, "r:d:mM:k:R:e:p:s:n4:X3")) != -1) { + while ((c = getopt(argc, argv, "x:r:d:mM:k:R:e:p:s:n4:X3")) != -1) { switch(c) { + case 'x': + db_args_size++; + { + char **temp = realloc( db_args, sizeof(char*) * (db_args_size+1)); /* one for NULL */ + if( temp == NULL ) + { + fprintf(stderr,"%s: KDC cannot initialize. Not enough memory\n", + argv[0]); + exit(1); + } + + db_args = temp; + } + db_args[db_args_size-1] = optarg; + db_args[db_args_size] = NULL; + break; + case 'r': /* realm name for db */ if (!find_realm_data(optarg, (krb5_ui_4) strlen(optarg))) { if ((rdatap = (kdc_realm_t *) malloc(sizeof(kdc_realm_t)))) { - if ((retval = init_realm(argv[0], rdatap, optarg, db_name, + if ((retval = init_realm(argv[0], rdatap, optarg, mkey_name, menctype, default_udp_ports, - default_tcp_ports, manual))) { + default_tcp_ports, manual, db_args))) { fprintf(stderr,"%s: cannot initialize realm %s - see log file for details\n", argv[0], optarg); exit(1); } kdc_realmlist[kdc_numrealms] = rdatap; kdc_numrealms++; + free(db_args), db_args=NULL, db_args_size = 0; + } + else + { + fprintf(stderr,"%s: cannot initialize realm %s. Not enough memory\n", + argv[0], optarg); + exit(1); } } break; case 'd': /* pathname for db */ - db_name = optarg; + /* now db_name is not a seperate argument. It has to be passed as part of the db_args */ + if( db_name == NULL ) + { + db_name = malloc(1025); + if( db_name == NULL ) + { + fprintf(stderr,"%s: KDC cannot initialize. Not enough memory\n", + argv[0] ); + exit(1); + } + + sprintf( db_name, "dbname=%s", optarg); + } + + db_args_size++; + { + char **temp = realloc( db_args, sizeof(char*) * (db_args_size+1)); /* one for NULL */ + if( temp == NULL ) + { + fprintf(stderr,"%s: KDC cannot initialize. Not enough memory\n", + argv[0]); + exit(1); + } + + db_args = temp; + } + db_args[db_args_size-1] = db_name; + db_args[db_args_size] = NULL; break; case 'm': /* manual type-in of master key */ manual = TRUE; @@ -547,9 +594,9 @@ initialize_realms(krb5_context kcontext, int argc, char **argv) exit(1); } if ((rdatap = (kdc_realm_t *) malloc(sizeof(kdc_realm_t)))) { - if ((retval = init_realm(argv[0], rdatap, lrealm, db_name, + if ((retval = init_realm(argv[0], rdatap, lrealm, mkey_name, menctype, default_udp_ports, - default_tcp_ports, manual))) { + default_tcp_ports, manual, db_args))) { fprintf(stderr,"%s: cannot initialize realm %s - see log file for details\n", argv[0], lrealm); exit(1); @@ -576,6 +623,10 @@ initialize_realms(krb5_context kcontext, int argc, char **argv) free(default_udp_ports); if (default_tcp_ports) free(default_tcp_ports); + if (db_args) + free(db_args); + if (db_name) + free(db_name); return; } |
