--- cygnus/src/kdc/main.c	Tue Jul  1 14:09:31 1997
+++ kerbnet-1.2/kdc/main.c	Tue May 27 21:59:53 1997
@@ -30,6 +30,7 @@
 #include <netdb.h>
 
 #include "k5-int.h"
+#include "getopt.h"
 #include "com_err.h"
 #include "adm.h"
 #include "adm_proto.h"
@@ -56,6 +57,7 @@
 void finish_realms PROTOTYPE((char *));
 
 static int nofork = 0;
+
 static char *kdc_current_rcname = (char *) NULL;
 static int rkey_init_done = 0;
 
@@ -172,42 +174,6 @@
 }
 
 /*
- * initialize the replay cache.
- */
-krb5_error_code
-kdc_initialize_rcache(kcontext, rcache_name)
-    krb5_context	kcontext;
-    char 		*rcache_name;
-{
-    krb5_error_code	retval;
-    char		*rcname;
-    char		*sname;
-
-    rcname = (rcache_name) ? rcache_name : kdc_current_rcname;
-    if (!rcname)
-	rcname = KDCRCACHE;
-    if (!(retval = krb5_rc_resolve_full(kcontext, &kdc_rcache, rcname))) {
-	/* Recover or initialize the replay cache */
-	if (!(retval = krb5_rc_recover(kcontext, kdc_rcache)) ||
-	    !(retval = krb5_rc_initialize(kcontext,
-					  kdc_rcache,
-					  kcontext->clockskew))
-	    ) {
-	    /* Expunge the replay cache */
-	    if (!(retval = krb5_rc_expunge(kcontext, kdc_rcache))) {
-		sname = kdc_current_rcname;
-		kdc_current_rcname = strdup(rcname);
-		if (sname)
-		    free(sname);
-	    }
-	}
-	if (retval)
-	    krb5_rc_close(kcontext, kdc_rcache);
-    }
-    return(retval);
-}
-
-/*
  * Find the realm entry for a given realm.
  */
 kdc_realm_t *
@@ -271,7 +237,8 @@
 	    memset(rdp->realm_tgskey.contents, 0, rdp->realm_tgskey.length);
 	    free(rdp->realm_tgskey.contents);
 	}
-	krb5_finish_key(rdp->realm_context, &rdp->realm_encblock);
+	if (rdp->realm_encblock.crypto_entry)
+		krb5_finish_key(rdp->realm_context, &rdp->realm_encblock);
 	krb5_db_fini(rdp->realm_context);
 	if (rdp->realm_tgsprinc)
 	    krb5_free_principal(rdp->realm_context, rdp->realm_tgsprinc);
@@ -533,8 +500,13 @@
 	    }
 
 /* Set master encblock with db_context */
+#ifdef USE_OCI_KDB
+if ((kret = krb5_oci_db_set_mkey(rdp->realm_context, &db_context, 
+				 &rdp->realm_encblock))) {
+#else
 if ((kret = krb5_dbm_db_set_mkey(rdp->realm_context, &db_context, 
 				 &rdp->realm_encblock))) {
+#endif
 com_err(progname, kret, "while setting master key for realm %s", realm);
 goto whoops;
 }
@@ -691,21 +663,38 @@
 void
 setup_signal_handlers()
 {
+/* Currently Cygwin32 doesn't handle signals correctly. */
+#ifndef __CYGWIN32__
     signal(SIGINT, request_exit);
     signal(SIGHUP, request_exit);
     signal(SIGTERM, request_exit);
-
+#endif /* __CYGWIN32__ */
     return;
 }
 
+void param_usage(FILE *fp)
+{
+    fprintf(fp, "\t[-d dbpathname] [-r dbrealmname]\n\t[-m] [-k masterenctype] [-M masterkeyname] [-p port] [-n]\n");
+}
+
 void
 usage(name)
 char *name;
 {
-    fprintf(stderr, "usage: %s [-d dbpathname] [-r dbrealmname] [-R replaycachename ]\n\t[-m] [-k masterenctype] [-M masterkeyname] [-p port] [-n]\n", name);
+    fprintf(stderr, "usage: %s ", name);
+    param_usage(stderr);
     return;
 }
 
+/* Variables for getopt() */
+int off_option;
+struct option long_options[] = {
+    { "version", 0, NULL, 0x01 },
+    { "nofork", 0, NULL, 'n' },
+    { "port", 0, NULL, 'p' },
+    { NULL, 0, NULL, 0 }
+};
+
 void
 initialize_realms(kcontext, argc, argv)
     krb5_context 	kcontext;
@@ -758,7 +747,8 @@
      * 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:n")) != EOF) {
+    while ((c = getopt_long(argc, argv, "r:d:mM:k:e:p:s:n",
+      long_options, NULL)) != EOF) {
 	switch(c) {
 	case 'r':			/* realm name for db */
 	    if (!find_realm_data(optarg, (krb5_ui_4) strlen(optarg))) {
@@ -793,14 +783,19 @@
 	    if (krb5_string_to_enctype(optarg, &menctype))
 		com_err(argv[0], 0, "invalid enctype %s", optarg);
 	    break;
+#if 0
 	case 'R':
 	    rcname = optarg;
 	    break;
+#endif
 	case 'p':
 	    if (default_ports)
 		free(default_ports);
 	    default_ports = strdup(optarg);
 	    break;
+        case 1: /* Print the version */
+            printf("%s\n", krb5_version);
+            exit(0);
 	case '?':
 	default:
 	    usage(argv[0]);
@@ -834,7 +829,8 @@
     /*
      * Now handle the replay cache.
      */
-    if ((retval = kdc_initialize_rcache(kcontext, rcname))) {
+
+    if ((retval = krb5_rc_null_generate (kcontext, &kdc_rcache))) {
 	com_err(argv[0], retval, "while initializing KDC replay cache");
 	exit(1);
     }
@@ -884,7 +880,11 @@
  exit
  */
 
+#ifdef __CYGWIN32__
+int original_main(argc, argv)
+#else /* __CYGWIN32__ */
 int main(argc, argv)
+#endif /* __CYGWIN32__ */
 int argc;
 char *argv[];
 {
@@ -932,7 +932,8 @@
 	finish_realms(argv[0]);
 	return 1;
     }
-    krb5_klog_syslog(LOG_INFO, "commencing operation");
+    krb5_klog_generic(kdc_context, LOG_INFO, "main", "commencing operation",
+		      NULL, NULL);
     if ((retval = listen_and_process(argv[0]))) {
 	com_err(argv[0], retval, "while processing network requests");
 	errout++;
@@ -941,7 +942,8 @@
 	com_err(argv[0], retval, "while shutting down network");
 	errout++;
     }
-    krb5_klog_syslog(LOG_INFO, "shutting down");
+    krb5_klog_generic(kdc_context, LOG_INFO, "main", "shutting down",
+		      NULL, NULL);
     krb5_klog_close(kdc_context);
     finish_realms(argv[0]);
     krb5_free_context(kcontext);
