/* -*-c-*-
*
- * $Id: daemon.c,v 1.1 1997/07/21 13:47:50 mdw Exp $
+ * $Id: daemon.c,v 1.6 1997/09/09 18:17:06 mdw Exp $
*
* Running a `become' daemon
*
* (c) 1997 EBI
*/
-/*----- Licencing notice --------------------------------------------------*
+/*----- Licensing notice --------------------------------------------------*
*
* This file is part of `become'
*
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with `become'; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * along with `become'; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*----- Revision history --------------------------------------------------*
*
* $Log: daemon.c,v $
- * Revision 1.1 1997/07/21 13:47:50 mdw
+ * 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.
+ *
+ * Revision 1.1 1997/07/21 13:47:50 mdw
* Initial revision
*
*/
#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 --------------------------------------------------*/
if (!daemon__readKey)
daemon_readKey(file_KEY);
daemon__rescan = 0;
+ T( trace(TRACE_DAEMON, "daemon: read config file"); )
return (0);
}
if (recvfrom(fd, (char *)buff, sizeof(buff), 0,
(struct sockaddr *)&sin, &slen) < 0) {
+ T( trace(TRACE_DAEMON, "daemon: error reading packet: %s",
+ strerror(errno)); )
syslog(LOG_INFO, "duff packet received: %e");
return;
}
he ? he->h_name : inet_ntoa(sin.sin_addr),
sizeof(sender));
syslog(LOG_DEBUG, "packet received from %s", sender);
+ T( trace(TRACE_DAEMON, "daemon: received request from %s", sender); )
}
/* --- Unpack the block --- */
if (crypt_unpackRequest(&rq, buff, daemon__key, sk, rpl) == 0) {
burn(buff);
+ T( trace(TRACE_DAEMON, "daemon: received corrupt or invalid request"); )
syslog(LOG_INFO, "packet from %s rejected", sender);
return;
}
/* --- Send the reply off --- */
sendto(fd, (char *)rpl, crp_size, 0, (struct sockaddr *)&sin, sizeof(sin));
+ T( trace(TRACE_DAEMON, "daemon: reply sent"); )
burn(rpl);
}
* user wants me to start on a funny port.
*/
- seteuid(getuid());
+ setuid(getuid());
/* --- Initialise bits of the program --- */
userdb_init();
userdb_local();
userdb_yp();
+ netg_init();
name_init();
rule_init();
openlog(quis(), 0, LOG_DAEMON);
struct servent *se = getservbyname(quis(), "udp");
if (!se)
die("no idea which port to use");
- daemon__port = ntohs(se->s_port);
+ daemon__port = se->s_port;
}
/* --- Now set up a socket --- */
fprintf(fp, "%lu\n", (unsigned long)getpid());
fclose(fp);
}
+ T( trace(TRACE_DAEMON, "daemon: forked to pid %li", (long)getpid()); )
}
#endif
/* --- Program in daemon death mode --- */
if (setjmp(daemon__dieBuf)) {
- syslog(LOG_NOTICE, "killed by signal type %i", daemon__signum);
- remove(file_PID);
- exit(0);
- }
+#ifdef TRACING
+ if (daemon__signum == SIGQUIT && tracing() & TRACE_RULE) {
+ T( rule_dump(); )
+ signal(SIGQUIT, daemon__die);
+ } else
+#endif
+ {
+ T( trace(TRACE_DAEMON, "daemon: killed by signal %i",
+ daemon__signum); )
+ syslog(LOG_NOTICE, "killed by signal type %i", daemon__signum);
+ remove(file_PID);
+ exit(0);
+ }
+ } else {
- /* --- Set signal handlers --- */
+ /* --- Set signal handlers --- */
- signal(SIGHUP, daemon__restart);
- signal(SIGQUIT, daemon__restart);
- signal(SIGINT, daemon__die);
- signal(SIGTERM, daemon__die);
- signal(SIGSEGV, daemon__die);
- signal(SIGFPE, daemon__die);
- signal(SIGBUS, daemon__die);
+ signal(SIGHUP, daemon__restart);
+ signal(SIGQUIT, daemon__die);
+ signal(SIGINT, daemon__die);
+ signal(SIGTERM, daemon__die);
+ signal(SIGSEGV, daemon__die);
+ signal(SIGFPE, daemon__die);
+ signal(SIGBUS, daemon__die);
+ }
/* --- Now wait for something exciting to happen --- *
*
/* --- Now wait for something interesting --- */
+ T( trace(TRACE_DAEMON, "daemon: waiting for requests"); )
i = select(FD_SETSIZE, &fds, 0, 0, 0);
/* --- Now, see if I need to rescan the config --- */
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;