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 slocal
[mmh]
/
uip
/
slocal.c
diff --git
a/uip/slocal.c
b/uip/slocal.c
index
ff8df8c
..
cf9a9b0
100644
(file)
--- a/
uip/slocal.c
+++ b/
uip/slocal.c
@@
-90,7
+90,8
@@
static struct passwd *pw; /* passwd file entry */
static char ddate[BUFSIZ]; /* record the delivery date */
struct tws *now;
static char ddate[BUFSIZ]; /* record the delivery date */
struct tws *now;
-static jmp_buf myctx;
+volatile sig_atomic_t eflag = 0; /* flag to indecate interrupt */
+static pid_t child_id;
/* flags for pair->p_flags */
#define P_NIL 0x00
/* flags for pair->p_flags */
#define P_NIL 0x00
@@
-1034,16
+1035,6
@@
usr_pipe(int fd, char *cmd, char *pgm, char **vec, int suppress)
default:
/* parent process */
default:
/* parent process */
- if (setjmp(myctx)) {
- /*
- ** Ruthlessly kill the child and anything
- ** else in its process group.
- */
- kill(-child_id, SIGKILL);
- if (verbose)
- verbose_printf(", timed-out; terminated\n");
- return -1;
- }
SIGNAL(SIGALRM, alrmser);
bytes = fstat(fd, &st) != -1 ? (int) st.st_size : 100;
SIGNAL(SIGALRM, alrmser);
bytes = fstat(fd, &st) != -1 ? (int) st.st_size : 100;
@@
-1061,6
+1052,13
@@
usr_pipe(int fd, char *cmd, char *pgm, char **vec, int suppress)
status = pidwait(child_id, 0);
alarm(0);
status = pidwait(child_id, 0);
alarm(0);
+ if (eflag) {
+ if (verbose) {
+ verbose_printf(", timed-out; terminated\n");
+ }
+ return -1;
+ }
+
if (verbose) {
if (!status) {
verbose_printf(", success.\n");
if (verbose) {
if (!status) {
verbose_printf(", success.\n");
@@
-1078,7
+1076,8
@@
usr_pipe(int fd, char *cmd, char *pgm, char **vec, int suppress)
static void
alrmser(int i)
{
static void
alrmser(int i)
{
- longjmp(myctx, DONE);
+ eflag = 1;
+ kill(-child_id, SIGKILL);
}
}