These additions cause the KDC to react to SIGHUP by closing and
authorGeoffrey King <gjking@mit.edu>
Wed, 8 Jul 1998 09:12:05 +0000 (09:12 +0000)
committerGeoffrey King <gjking@mit.edu>
Wed, 8 Jul 1998 09:12:05 +0000 (09:12 +0000)
reopening its log files, so that logfile management utilities
may now compress old logs and then kill -HUP the KDC process
to get them to use fresh log files.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@10627 dc483132-0cff-0310-8789-dd5450dbe970

src/include/krb5/ChangeLog
src/include/krb5/adm_proto.h
src/kdc/ChangeLog
src/kdc/extern.c
src/kdc/extern.h
src/kdc/main.c
src/kdc/network.c
src/lib/kadm5/ChangeLog
src/lib/kadm5/logger.c

index 66a0d0598d09656f80bad060fc9c0c5e7bdab8a9..202608002e27f64b92ddc45af3e6d86473fcefc7 100644 (file)
@@ -1,3 +1,7 @@
+Wed Jul  8 04:30:22 1998  Geoffrey King  <gjking@mit.edu>
+
+       * adm_proto.h: Added prototype for new function krb5_klog_reopen()
+
 Thu Apr 16 23:50:08 1998  Tom Yu  <tlyu@mit.edu>
 
        * configure.in: Search for /var/tmp first when determining rcache
index 1097b3cba08c08fd3b58f4a43636497522208516..d66e010c4e7e92a49c87bf56967ccf435f3d7c84 100644 (file)
@@ -137,6 +137,7 @@ krb5_error_code krb5_klog_init
                   krb5_boolean));
 void krb5_klog_close KRB5_PROTOTYPE((krb5_context));
 int krb5_klog_syslog KRB5_PROTOTYPE((int, const char *, ...));
+void krb5_klog_reopen KRB5_PROTOTYPE((krb5_context));
 
 /* alt_prof.c */
 krb5_error_code krb5_aprof_init
index 193202828dc88233aa765c58eca6596c7adc93a4..4e2264a51d11e6fdf7733ac23721b2c3214aaa45 100644 (file)
@@ -1,3 +1,16 @@
+Wed Jul  8 04:36:28 1998  Geoffrey King  <gjking@mit.edu>
+
+       * extern.h: Added declaration for new variable
+               signal_requests_hup, which is set when the KDC
+               is sent a SIGHUP
+       
+       * extern.c: Added definition for signal_requests_hup
+
+       * main.c: Added new signal handling code for SIGHUP, including
+               the new function request_hup()
+
+       * network.c: Check signal_requests_hup in the main KDC loop
+
 Fri May  8 18:46:59 1998  Theodore Y. Ts'o  <tytso@mit.edu>
 
        * kerberos_v4.c (krb4_stime): Print 4 digit years in Krb4 log
index 757df67b80ebe66200ccf5e978dfe90bdf9754c6..c3f92ac078ea46815e61f2a9c45e2e5b269d2a89 100644 (file)
@@ -35,3 +35,4 @@ krb5_timestamp kdc_infinity = KRB5_INT32_MAX; /* XXX */
 krb5_rcache    kdc_rcache = (krb5_rcache) NULL;
 
 volatile int signal_requests_exit = 0; /* gets set when signal hits */
+volatile int signal_requests_hup = 0;   /* ditto */
index 313f20e117a24a69b04118e7266b6d95274485b8..e8de8a7e32080459608deab3d5ed208aa1735c33 100644 (file)
@@ -95,4 +95,5 @@ extern krb5_timestamp         kdc_infinity;   /* greater than all other timestamps */
 extern krb5_rcache     kdc_rcache;     /* replay cache */
 
 extern volatile int signal_requests_exit;
+extern volatile int signal_requests_hup;
 #endif /* __KRB5_KDC_EXTERN__ */
index d58ebc80ec9fa34d385cab0dbc8e774d3f0de762..bf2f71243866e38bc9848ca5cfd8ca812fc46af8 100644 (file)
@@ -46,6 +46,7 @@ kdc_realm_t *find_realm_data PROTOTYPE((char *, krb5_ui_4));
 void usage PROTOTYPE((char *));
 
 krb5_sigtype request_exit PROTOTYPE((int));
+krb5_sigtype request_hup  PROTOTYPE((int));
 
 void setup_signal_handlers PROTOTYPE((void));
 
@@ -57,6 +58,10 @@ static int nofork = 0;
 static char *kdc_current_rcname = (char *) NULL;
 static int rkey_init_done = 0;
 
+#ifdef POSIX_SIGNALS
+static struct sigaction s_action;
+#endif /* POSIX_SIGNALS */
+
 #define        KRB5_KDC_MAX_REALMS     32
 
 #ifdef USE_RCACHE
@@ -565,12 +570,35 @@ request_exit(signo)
 #endif
 }
 
+krb5_sigtype
+request_hup(signo)
+    int signo;
+{
+    signal_requests_hup = 1;
+
+#ifdef POSIX_SIGTYPE
+    return;
+#else
+    return(0);
+#endif
+}
+
 void
 setup_signal_handlers()
 {
+#ifdef POSIX_SIGNALS
+    (void) sigemptyset(&s_action.sa_mask);
+    s_action.saflags = 0;
+    s_action.sa_handler = request_exit;
+    (void) sigaction(SIGINT, &s_action, (struct sigaction *) NULL);
+    (void) sigaction(SIGTERM, &s_action, (struct sigaction *) NULL);
+    s_action.sa_handler = request_hup;
+    (void) sigaction(SIGHUP, &s_action, (struct sigaction *) NULL);
+#else  /* POSIX_SIGNALS */
     signal(SIGINT, request_exit);
-    signal(SIGHUP, request_exit);
     signal(SIGTERM, request_exit);
+    signal(SIGHUP, request_hup);
+#endif /* POSIX_SIGNALS */
 
     return;
 }
@@ -836,3 +864,6 @@ char *argv[];
     return errout;
 }
 
+
+
+
index f2cc0b566a05bf719a278565dcd0b500e1998073..edc172dffb8c23cbb64a0eef4491dd97bf362ce6 100644 (file)
@@ -208,6 +208,10 @@ const char *prog;
        return KDC5_NONET;
     
     while (!signal_requests_exit) {
+       if (signal_requests_hup) {
+           krb5_klog_reopen();
+           signal_requests_hup = 0;
+       }
        readfds = select_fds;
        nfound = select(select_nfds, &readfds, 0, 0, 0);
        if (nfound == -1) {
index 26a14ad6c79f66f9728431d020f53fdc3d94d4f6..ae8bb7e1b1ad30d17387c56b0a26cd657f9c6a14 100644 (file)
@@ -1,3 +1,8 @@
+Wed Jul  8 04:48:50 1998  Geoffrey J. King  <gjking@mit.edu>
+
+       * logger.c: Add the function krb5_klog_reopen() which closes
+               and reopens the log files.
+
 Mon Apr  6 19:40:05 1998  Tom Yu  <tlyu@voltage-multiplier.mit.edu>
 
        * Makefile.in (includes): Don't call mkdir unless the directory
index 379b5ffda80773e8cf69b0a8cc921d19cab4dd7c..2677e448dfe2b499c162fbaa786d4e4d7bc7fb3d 100644 (file)
@@ -942,4 +942,43 @@ krb5_klog_syslog(priority, format, va_alist)
     va_end(pvar);
     return(retval);
 }
+
+/*
+ * krb5_klog_reopen() - Close and reopen any open (non-syslog) log files.
+ *                      This function is called when a SIGHUP is received
+ *                      so that external log-archival utilities may
+ *                      alert the Kerberos daemons that they should get
+ *                      a new file descriptor for the give filename.
+ */
+void
+krb5_klog_reopen(kcontext)
+krb5_context kcontext;
+{
+    int lindex;
+    FILE *f;
+
+    /*
+     * Only logs which are actually files need to be closed
+     * and reopened in response to a SIGHUP
+     */
+    for (lindex = 0; lindex < log_control.log_nentries; lindex++) {
+       if (log_control.log_entries[lindex].log_type == K_LOG_FILE) {
+           fclose(log_control.log_entries[lindex].lfu_filep);
+           /*
+            * In case the old logfile did not get moved out of the
+            * way, open for append to prevent squashing the old logs.
+            */
+           f = fopen(log_control.log_entries[lindex].lfu_fname, "a+");
+           if (f) {
+               log_control.log_entries[lindex].lfu_filep = f;
+           } else {
+               fprintf(stderr, "Couldn't open log file %s: %s\n",
+                       log_control.log_entries[lindex].lfu_fname,
+                       error_message(errno));
+           }
+       }
+    }
+}
+
 #endif /* !defined(_MSDOS) */
+