projects
/
mmh
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
remove longjmp in signalhandler of prompter
[mmh]
/
uip
/
prompter.c
diff --git
a/uip/prompter.c
b/uip/prompter.c
index
4d0ce86
..
e42e8df
100644
(file)
--- a/
uip/prompter.c
+++ b/
uip/prompter.c
@@
-12,6
+12,7
@@
#include <errno.h>
#include <signal.h>
#include <setjmp.h>
#include <errno.h>
#include <signal.h>
#include <setjmp.h>
+#include <unistd.h>
static struct swit switches[] = {
#define PREPSW 0
static struct swit switches[] = {
#define PREPSW 0
@@
-34,8
+35,8
@@
static struct swit switches[] = {
};
};
-static int wtuser = 0;
-static int sigint = 0;
+volatile sig_atomic_t wtuser = 0;
+volatile sig_atomic_t sigint = 0;
static jmp_buf sigenv;
/*
static jmp_buf sigenv;
/*
@@
-263,6
+264,7
@@
int
getln(char *buffer, int n)
{
int c;
getln(char *buffer, int n)
{
int c;
+ sig_atomic_t psigint;
char *cp;
cp = buffer;
char *cp;
cp = buffer;
@@
-271,15
+273,17
@@
getln(char *buffer, int n)
switch (setjmp(sigenv)) {
case 0:
wtuser = 1;
switch (setjmp(sigenv)) {
case 0:
wtuser = 1;
+ psigint = sigint;
break;
break;
- case DONE:
- wtuser = 0;
- return 0;
-
default:
wtuser = 0;
default:
wtuser = 0;
- return NOTOK;
+ if (sigint == psigint) {
+ return 0;
+ } else {
+ sigint = psigint;
+ return NOTOK;
+ }
}
for (;;) {
}
for (;;) {
@@
-311,7
+315,8
@@
getln(char *buffer, int n)
static void
intrser(int i)
{
static void
intrser(int i)
{
- if (wtuser)
- longjmp(sigenv, NOTOK);
+ if (wtuser) {
+ close(STDIN_FILENO);
+ }
sigint++;
}
sigint++;
}