Merged blowfish branch into trunk.
[become] / src / daemon.c
index 3f1fa93..61638df 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: daemon.c,v 1.2 1997/08/04 10:24:21 mdw Exp $
+ * $Id: daemon.c,v 1.8 1997/09/26 09:14:58 mdw Exp $
  *
  * Running a `become' daemon
  *
 /*----- Revision history --------------------------------------------------*
  *
  * $Log: daemon.c,v $
+ * Revision 1.8  1997/09/26 09:14:58  mdw
+ * Merged blowfish branch into trunk.
+ *
+ * Revision 1.7.2.1  1997/09/26 09:08:05  mdw
+ * Use the Blowfish encryption algorithm instead of IDEA.  This is partly
+ * because I prefer Blowfish (without any particularly strong evidence) but
+ * mainly because IDEA is patented and Blowfish isn't.
+ *
+ * Revision 1.7  1997/09/17 10:23:23  mdw
+ * Fix a typo.  Port numbers are in network order now, so don't change them.
+ *
+ * Revision 1.6  1997/09/09 18:17:06  mdw
+ * Allow default port to be given as a service name or port number.
+ *
+ * Revision 1.5  1997/08/20  16:17:10  mdw
+ * More sensible restart routine: `_reinit' functions replaced by `_end' and
+ * `_init' functions.
+ *
+ * Revision 1.4  1997/08/07 10:00:37  mdw
+ * (Log entry for previous version is bogus.)  Read netgroups database.
+ * Give up privileges permanently on startup.
+ *
  * Revision 1.2  1997/08/04 10:24:21  mdw
  * Sources placed under CVS control.
  *
 /* --- Local headers --- */
 
 #include "become.h"
+#include "blowfish.h"
 #include "config.h"
 #include "crypt.h"
 #include "daemon.h"
-#include "idea.h"
 #include "lexer.h"
 #include "name.h"
+#include "netg.h"
 #include "parser.h"
 #include "rule.h"
 #include "tx.h"
 
 /*----- Arbitrary constants -----------------------------------------------*/
 
-#define daemon__awakeEvery (5 * 60)    /* Awaken this often to rescan */
+#define daemon__awakeEvery (30 * 60)   /* Awaken this often to rescan */
 
 /*----- Static variables --------------------------------------------------*/
 
@@ -88,7 +111,7 @@ static int daemon__port = -1;                /* No particular port yet */
 static volatile sig_atomic_t daemon__rescan = 0; /* Rescan as soon as poss */
 #define daemon__signum daemon__rescan  /* Alias for readbility */
 static int daemon__readKey = 0;                /* Have I read a key? */
-static unsigned char daemon__key[IDEA_KEYSIZE];        /* encryption key */
+static unsigned char daemon__key[BLOWFISH_KEYSIZE]; /* Encryption key */
 static jmp_buf daemon__dieBuf;         /* Jump here to kill the daemon */
 
 /*----- Main code ---------------------------------------------------------*/
@@ -204,7 +227,7 @@ void daemon__read(int fd)
   unsigned char rpl[crp_size];         /* Buffer for outgoing replies */
   struct sockaddr_in sin;              /* Address of packet sender */
   char sender[64];                     /* Sender's hostname (resolved) */
-  unsigned char sk[IDEA_KEYSIZE];      /* Session key for reply */
+  unsigned char sk[BLOWFISH_KEYSIZE];  /* Session key for reply */
   request rq;                          /* Request buffer for verification */
 
   /* --- Read the message --- */
@@ -286,7 +309,7 @@ void daemon_init(const char *cf, int port)
    * user wants me to start on a funny port.
    */
 
-  seteuid(getuid());
+  setuid(getuid());
 
   /* --- Initialise bits of the program --- */
 
@@ -295,6 +318,7 @@ void daemon_init(const char *cf, int port)
   userdb_init();
   userdb_local();
   userdb_yp();
+  netg_init();
   name_init();
   rule_init();
   openlog(quis(), 0, LOG_DAEMON);
@@ -309,11 +333,11 @@ void daemon_init(const char *cf, int port)
    * look it up in /etc/services under whatever name I was started as.
    */
 
-  if (daemon__port <= 0) {
+  if (daemon__port == 0) {
     struct servent *se = getservbyname(quis(), "udp");
     if (!se)
-      die("no idea which port to use");
-    daemon__port = ntohs(se->s_port);
+      die("no idea which port to listen to");
+    daemon__port = se->s_port;
   }
 
   /* --- Now set up a socket --- */
@@ -324,10 +348,12 @@ void daemon_init(const char *cf, int port)
     if ((s = socket(PF_INET, SOCK_DGRAM, 0)) == -1)
       die("couldn't create socket: %s", strerror(errno));
     sin.sin_family = AF_INET;
-    sin.sin_port = htons(daemon__port);
+    sin.sin_port = daemon__port;
     sin.sin_addr.s_addr = htonl(INADDR_ANY);
-    if (bind(s, (struct sockaddr *)&sin, sizeof(sin)))
-      die("couldn't bind socket to port: %s", strerror(errno));
+    if (bind(s, (struct sockaddr *)&sin, sizeof(sin))) {
+      die("couldn't bind socket to port %i: %s",
+         ntohs(daemon__port), strerror(errno));
+    }
   }
 
   /* --- Fork off into the sunset --- */
@@ -420,11 +446,16 @@ void daemon_init(const char *cf, int port)
       if (daemon__rescan || time(0) - when > 0) {
        daemon__rescan = 0;
        syslog(LOG_INFO, "rescanning configuration file");
-       userdb_reinit();
+       name_end();
+       rule_end();
+       netg_end();
+       userdb_end();
+       userdb_init();
        userdb_local();
        userdb_yp();
-       rule_reinit();
-       name_reinit();
+       netg_init();
+       rule_init();
+       name_init();
        if (daemon__readConfig(cf))
          syslog(LOG_ERR, "error reading configuration file");
        when = time(0) + daemon__awakeEvery;