to avoid undefined behavior use close(2) in the signal handler
#include <errno.h>
#include <signal.h>
#include <setjmp.h>
#include <errno.h>
#include <signal.h>
#include <setjmp.h>
static struct swit switches[] = {
#define PREPSW 0
static struct swit switches[] = {
#define PREPSW 0
-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;
/*
getln(char *buffer, int n)
{
int c;
getln(char *buffer, int n)
{
int c;
switch (setjmp(sigenv)) {
case 0:
wtuser = 1;
switch (setjmp(sigenv)) {
case 0:
wtuser = 1;
- case DONE:
- wtuser = 0;
- return 0;
-
+ if (sigint == psigint) {
+ return 0;
+ } else {
+ sigint = psigint;
+ return NOTOK;
+ }
static void
intrser(int i)
{
static void
intrser(int i)
{
- if (wtuser)
- longjmp(sigenv, NOTOK);
+ if (wtuser) {
+ close(STDIN_FILENO);
+ }