summaryrefslogtreecommitdiffstats
path: root/src/kdc/main.c
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@mit.edu>2005-06-21 01:36:03 +0000
committerKen Raeburn <raeburn@mit.edu>2005-06-21 01:36:03 +0000
commitf72c3ffaca4600d4e75282857ce4dda11106d5e7 (patch)
tree89df6e717f00e1687994fc089fd6df9ff8a5c21c /src/kdc/main.c
parentf4aaa29ac68e3dd5a2ae326cd54918c7250558e9 (diff)
downloadkrb5-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.c111
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;
}