From 631229648a21c81e9d21ba520b5ec8c920a23ad2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Fri, 22 Sep 2006 15:42:39 +0000 Subject: [PATCH] try to not call signaction for signal 0 and use NSIG if it exists to determin how many signals there exists, also, only restore those signalhandlers that we got out. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@18156 ec53bebd-3082-4978-b11e-865c3cabbd6b --- appl/login/read_string.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/appl/login/read_string.c b/appl/login/read_string.c index 1a2640aaa..9e8136d2a 100644 --- a/appl/login/read_string.c +++ b/appl/login/read_string.c @@ -43,10 +43,15 @@ intr(int sig) intr_flag++; } +#ifndef NSIG +#define NSIG 47 +#endif + int read_string(const char *prompt, char *buf, size_t len, int echo) { - struct sigaction sigs[47]; + struct sigaction sigs[NSIG]; + int oksigs[NSIG]; struct sigaction sa; FILE *tty; int ret = 0; @@ -57,12 +62,16 @@ read_string(const char *prompt, char *buf, size_t len, int echo) struct termios t_new, t_old; + memset(&oksigs, 0, sizeof(oksigs)); + memset(&sa, 0, sizeof(sa)); sa.sa_handler = intr; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; - for(i = 0; i < sizeof(sigs) / sizeof(sigs[0]); i++) - if (i != SIGALRM) sigaction(i, &sa, &sigs[i]); + for(i = 1; i < sizeof(sigs) / sizeof(sigs[0]); i++) + if (i != SIGALRM) + if (sigaction(i, &sa, &sigs[i]) == 0) + oksigs[i] = 1; if((tty = fopen("/dev/tty", "r")) == NULL) tty = stdin; @@ -103,8 +112,9 @@ read_string(const char *prompt, char *buf, size_t len, int echo) if(tty != stdin) fclose(tty); - for(i = 0; i < sizeof(sigs) / sizeof(sigs[0]); i++) - if (i != SIGALRM) sigaction(i, &sigs[i], NULL); + for(i = 1; i < sizeof(sigs) / sizeof(sigs[0]); i++) + if (oksigs[i]) + sigaction(i, &sigs[i], NULL); if(ret) return -3;