along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- $Id: tincd.c,v 1.10.4.17 2000/10/29 00:02:20 guus Exp $
+ $Id: tincd.c,v 1.10.4.28 2000/11/15 01:06:13 zarq Exp $
*/
#include "config.h"
#include <syslog.h>
#include <unistd.h>
#include <signal.h>
-#include <openssl/rand.h>
-#include <openssl/rsa.h>
#include <string.h>
+#include <termios.h>
#ifdef HAVE_SYS_IOCTL_H
# include <sys/ioctl.h>
#endif
+#ifdef HAVE_OPENSSL_RAND_H
+# include <openssl/rand.h>
+#else
+# include <rand.h>
+#endif
+
+#ifdef HAVE_OPENSSL_RSA_H
+# include <openssl/rsa.h>
+#else
+# include <rsa.h>
+#endif
+
+#ifdef HAVE_OPENSSL_ERR_H
+# include <openssl/err.h>
+#else
+# include <err.h>
+#endif
+
+
+
#include <pidfile.h>
#include <utils.h>
#include <xalloc.h>
#include "conf.h"
-#include "encr.h"
#include "net.h"
#include "netutl.h"
#include "protocol.h"
char *pidfilename; /* pid file location */
static pid_t ppid; /* pid of non-detached part */
char **g_argv; /* a copy of the cmdline arguments */
+char **environment; /* A pointer to the environment on
+ startup */
void cleanup_and_exit(int);
int detach(void);
static struct option const long_options[] =
{
+ { "config", required_argument, NULL, 'c' },
{ "kill", no_argument, NULL, 'k' },
{ "net", required_argument, NULL, 'n' },
{ "help", no_argument, &show_help, 1 },
{ "version", no_argument, &show_version, 1 },
{ "no-detach", no_argument, &do_detach, 0 },
- { "keygen", optional_argument, NULL, 'K'},
+ { "generate-keys", optional_argument, NULL, 'K'},
{ NULL, 0, NULL, 0 }
};
else
{
printf(_("Usage: %s [option]...\n\n"), program_name);
- printf(_(" -c, --config=DIR Read configuration options from DIR.\n"
- " -D, --no-detach Don't fork and detach.\n"
- " -d Increase debug level.\n"
- " -k, --kill Attempt to kill a running tincd and exit.\n"
- " -n, --net=NETNAME Connect to net NETNAME.\n"));
- printf(_(" -K, --keygen[=BITS] Generate public/private RSA keypair.\n"
- " --help Display this help and exit.\n"
- " --version Output version information and exit.\n\n"));
+ printf(_(" -c, --config=DIR Read configuration options from DIR.\n"
+ " -D, --no-detach Don't fork and detach.\n"
+ " -d Increase debug level.\n"
+ " -k, --kill Attempt to kill a running tincd and exit.\n"
+ " -n, --net=NETNAME Connect to net NETNAME.\n"));
+ printf(_(" -K, --generate-keys[=BITS] Generate public/private RSA keypair.\n"
+ " --help Display this help and exit.\n"
+ " --version Output version information and exit.\n\n"));
printf(_("Report bugs to tinc@nl.linux.org.\n"));
}
exit(status);
{
RSA *rsa_key;
- fprintf(stderr, _("Seeding the PRNG: please press some keys or move\nthe mouse if this program seems to have halted...\n"));
- RAND_load_file("/dev/random", 1024); /* OpenSSL PRNG state apparently uses 1024 bytes, but it seems pretty sufficient anyway :) */
-
fprintf(stderr, _("Generating %d bits keys:\n"), bits);
rsa_key = RSA_generate_key(bits, 0xFFFF, indicator, NULL);
if(!rsa_key)
void memory_full(int size)
{
- syslog(LOG_ERR, _("Memory exhausted (last is %s:%d) (couldn't allocate %d bytes), exiting."), cp_file, cp_line, size);
+ syslog(LOG_ERR, _("Memory exhausted (couldn't allocate %d bytes), exiting."), size);
+ cp_trace();
exit(1);
}
if(pid) /* parent process */
{
signal(SIGTERM, parent_exit);
-// sleep(600); /* wait 10 minutes */
+ sleep(600); /* wait 10 minutes */
exit(1);
}
}
asprintf(&pidfilename, "/var/run/tinc.%s.pid", netname);
if(!confbase)
asprintf(&confbase, "%s/tinc/%s", CONFDIR, netname);
+ else
+ fprintf(stderr, _("Both netname and configuration directory given, using the latter...\n"));
if(!identname)
asprintf(&identname, "tinc.%s", netname);
}
unknown = _("unknown");
+ environment = envp;
parse_options(argc, argv, envp);
if(show_version)
make_names();
+ /* Slllluuuuuuurrrrp! */
+
+ RAND_load_file("/dev/urandom", 1024);
+
if(generate_keys)
exit(keygen(generate_keys));
if(detach())
exit(0);
-/* FIXME: wt* is this suppose to do?
- if(security_init())
- return 1;
-*/
+ if(debug_lvl >= DEBUG_ERROR)
+ ERR_load_crypto_strings();
+
for(;;)
{
if(!setup_network_connections())
{
main_loop();
cleanup_and_exit(1);
- }
+ }
syslog(LOG_ERR, _("Unrecoverable error"));
cp_trace();
}
else
{
- syslog(LOG_ERR, _("Aieee! Not restarting."));
+ syslog(LOG_ERR, _("Not restarting."));
exit(0);
}
}
{
if(debug_lvl > DEBUG_NOTHING)
syslog(LOG_NOTICE, _("Got TERM signal"));
+
cleanup_and_exit(0);
}
}
else
{
- syslog(LOG_NOTICE, _("Aieee! Not restarting."));
+ syslog(LOG_NOTICE, _("Not restarting."));
exit(0);
}
}
sighup_handler(int a)
{
if(debug_lvl > DEBUG_NOTHING)
- syslog(LOG_NOTICE, _("Got HUP signal, rereading configuration and restarting"));
+ syslog(LOG_NOTICE, _("Got HUP signal"));
sighup = 1;
}
sigusr2_handler(int a)
{
dump_subnet_list();
-// if(debug_lvl > DEBUG_NOTHING)
-// syslog(LOG_NOTICE, _("Got USR2 signal, forcing new key generation"));
-/* FIXME: reprogram this.
- regenerate_keys();
-*/
}
RETSIGTYPE