main.c revision 102644
1/*
2 * Copyright (c) 1997-2002 Kungliga Tekniska H�gskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 *
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * 3. Neither the name of the Institute nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#include "kdc_locl.h"
35#ifdef HAVE_UTIL_H
36#include <util.h>
37#endif
38
39RCSID("$Id: main.c,v 1.27 2002/08/28 21:27:16 joda Exp $");
40
41sig_atomic_t exit_flag = 0;
42krb5_context context;
43
44#ifdef HAVE_DAEMON
45extern int detach_from_console;
46#endif
47
48static RETSIGTYPE
49sigterm(int sig)
50{
51    exit_flag = 1;
52}
53
54int
55main(int argc, char **argv)
56{
57    krb5_error_code ret;
58    setprogname(argv[0]);
59
60    ret = krb5_init_context(&context);
61    if (ret)
62	errx (1, "krb5_init_context failed: %d", ret);
63
64    configure(argc, argv);
65
66    if(databases == NULL) {
67	db = malloc(sizeof(*db));
68	num_db = 1;
69	ret = hdb_create(context, &db[0], NULL);
70	if(ret)
71	    krb5_err(context, 1, ret, "hdb_create %s", HDB_DEFAULT_DB);
72	ret = hdb_set_master_keyfile(context, db[0], NULL);
73	if (ret)
74	    krb5_err(context, 1, ret, "hdb_set_master_keyfile");
75    } else {
76	struct dbinfo *d;
77	int i;
78	/* count databases */
79	for(d = databases, i = 0; d; d = d->next, i++);
80	db = malloc(i * sizeof(*db));
81	for(d = databases, num_db = 0; d; d = d->next, num_db++) {
82	    ret = hdb_create(context, &db[num_db], d->dbname);
83	    if(ret)
84		krb5_err(context, 1, ret, "hdb_create %s", d->dbname);
85	    ret = hdb_set_master_keyfile(context, db[num_db], d->mkey_file);
86	    if (ret)
87		krb5_err(context, 1, ret, "hdb_set_master_keyfile");
88	}
89    }
90
91#ifdef HAVE_SIGACTION
92    {
93	struct sigaction sa;
94
95	sa.sa_flags = 0;
96	sa.sa_handler = sigterm;
97	sigemptyset(&sa.sa_mask);
98
99	sigaction(SIGINT, &sa, NULL);
100	sigaction(SIGTERM, &sa, NULL);
101    }
102#else
103    signal(SIGINT, sigterm);
104    signal(SIGTERM, sigterm);
105#endif
106#ifdef HAVE_DAEMON
107    if (detach_from_console)
108	daemon(0, 0);
109#endif
110    pidfile(NULL);
111    loop();
112    krb5_free_context(context);
113    return 0;
114}
115