(des_rand_data): if not using setitimer, block SIGCHLD around fork(),

also make sure we get the status of the child process
(fake_signal): emulate signal using sigaction


git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@5543 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Johan Danielsson
1999-03-15 16:36:40 +00:00
parent 298b64f1e8
commit 2020265280

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 1995, 1996, 1997 Kungliga Tekniska H<>gskolan
* Copyright (c) 1995, 1996, 1997, 1999 Kungliga Tekniska H<>gskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*
@@ -228,6 +228,21 @@ pacemaker(struct timeval *tv)
}
#endif
#ifdef HAVE_SIGACTION
/* XXX ugly hack, should perhaps use function from roken */
static RETSIGTYPE
(*fake_signal(int sig, RETSIGTYPE (*f)(int)))(int)
{
struct sigaction sa, osa;
sa.sa_handler = f;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
sigaction(sig, &sa, &osa);
return osa.sa_handler;
}
#define signal(S, F) fake_signal((S), (F))
#endif
/*
* Generate size bytes of "random" data using timed interrupts.
* It takes about 40ms/byte random data.
@@ -237,11 +252,8 @@ void
des_rand_data(unsigned char *data, int size)
{
struct itimerval tv, otv;
#ifdef HAVE_SIGACTION
struct sigaction sa, osa;
#else
RETSIGTYPE (*osa)(int);
#endif
RETSIGTYPE (*ochld)(int);
int i, j;
#ifndef HAVE_SETITIMER
pid_t pid;
@@ -270,15 +282,7 @@ des_rand_data(unsigned char *data, int size)
gsize = size;
igdata = 0;
#ifdef HAVE_SIGACTION
/* Setup signal handler */
sa.sa_handler = sigALRM;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
sigaction(SIGALRM, &sa, &osa);
#else
osa = signal(SIGALRM, sigALRM);
#endif
/* Start timer */
tv.it_value.tv_sec = 0;
@@ -287,8 +291,10 @@ des_rand_data(unsigned char *data, int size)
#ifdef HAVE_SETITIMER
setitimer(ITIMER_REAL, &tv, &otv);
#else
ochld = signal(SIGCHLD, SIG_IGN);
pid = fork();
if(pid == -1){
signal(SIGCHLD, ochld != SIG_ERR ? ochld : SIG_DFL);
des_not_rand_data(data, size);
return;
}
@@ -306,13 +312,10 @@ des_rand_data(unsigned char *data, int size)
setitimer(ITIMER_REAL, &otv, 0);
#else
kill(pid, SIGKILL);
waitpid(pid, NULL, 0);
while(waitpid(pid, NULL, 0) != pid);
signal(SIGCHLD, ochld != SIG_ERR ? ochld : SIG_DFL);
#endif
#ifdef HAVE_SIGACTION
sigaction(SIGALRM, &osa, 0);
#else
signal(SIGALRM, osa != SIG_ERR ? osa : SIG_DFL);
#endif
}
#else
void