simplify a bunch of things (no SIGWINCH handler, errno is saved for
an shtrap automatically) and gratitutous reformatting of comments
This commit is contained in:
		
							
								
								
									
										52
									
								
								histrap.c
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								histrap.c
									
									
									
									
									
								
							| @@ -26,7 +26,7 @@ | |||||||
| #include <sys/file.h> | #include <sys/file.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| __RCSID("$MirOS: src/bin/mksh/histrap.c,v 1.94 2010/05/22 12:49:14 tg Exp $"); | __RCSID("$MirOS: src/bin/mksh/histrap.c,v 1.95 2010/07/04 13:36:42 tg Exp $"); | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * MirOS: This is the default mapping type, and need not be specified. |  * MirOS: This is the default mapping type, and need not be specified. | ||||||
| @@ -310,7 +310,8 @@ hist_execute(char *cmd) | |||||||
| 			q[-1] = '\n'; | 			q[-1] = '\n'; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* Commands are executed here instead of pushing them onto the | 	/* | ||||||
|  | 	 * Commands are executed here instead of pushing them onto the | ||||||
| 	 * input 'cause POSIX says the redirection and variable assignments | 	 * input 'cause POSIX says the redirection and variable assignments | ||||||
| 	 * in | 	 * in | ||||||
| 	 *	X=y fc -e - 42 2> /dev/null | 	 *	X=y fc -e - 42 2> /dev/null | ||||||
| @@ -860,9 +861,10 @@ hist_skip_back(unsigned char *base, int *bytes, int no) | |||||||
| 	unsigned char *ep; | 	unsigned char *ep; | ||||||
|  |  | ||||||
| 	for (ep = base + *bytes; --ep > base; ) { | 	for (ep = base + *bytes; --ep > base; ) { | ||||||
| 		/* this doesn't really work: the 4 byte line number that is | 		/* | ||||||
| 		 * encoded after the COMMAND byte can itself contain the | 		 * this doesn't really work: the 4 byte line number that | ||||||
| 		 * COMMAND byte.... | 		 * is encoded after the COMMAND byte can itself contain | ||||||
|  | 		 * the COMMAND byte.... | ||||||
| 		 */ | 		 */ | ||||||
| 		for (; ep > base && *ep != COMMAND; ep--) | 		for (; ep > base && *ep != COMMAND; ep--) | ||||||
| 			; | 			; | ||||||
| @@ -1119,7 +1121,7 @@ alarm_init(void) | |||||||
| static void | static void | ||||||
| alarm_catcher(int sig MKSH_A_UNUSED) | alarm_catcher(int sig MKSH_A_UNUSED) | ||||||
| { | { | ||||||
| 	int errno_ = errno; | 	/* this runs inside interrupt context, with errno saved */ | ||||||
|  |  | ||||||
| 	if (ksh_tmout_state == TMOUT_READING) { | 	if (ksh_tmout_state == TMOUT_READING) { | ||||||
| 		int left = alarm(0); | 		int left = alarm(0); | ||||||
| @@ -1130,7 +1132,6 @@ alarm_catcher(int sig MKSH_A_UNUSED) | |||||||
| 		} else | 		} else | ||||||
| 			alarm(left); | 			alarm(left); | ||||||
| 	} | 	} | ||||||
| 	errno = errno_; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| Trap * | Trap * | ||||||
| @@ -1178,7 +1179,8 @@ trapsig(int i) | |||||||
| 	errno = errno_; | 	errno = errno_; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* called when we want to allow the user to ^C out of something - won't | /* | ||||||
|  |  * called when we want to allow the user to ^C out of something - won't | ||||||
|  * work if user has trapped SIGINT. |  * work if user has trapped SIGINT. | ||||||
|  */ |  */ | ||||||
| void | void | ||||||
| @@ -1188,7 +1190,8 @@ intrcheck(void) | |||||||
| 		runtraps(TF_DFL_INTR|TF_FATAL); | 		runtraps(TF_DFL_INTR|TF_FATAL); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* called after EINTR to check if a signal with normally causes process | /* | ||||||
|  |  * called after EINTR to check if a signal with normally causes process | ||||||
|  * termination has been received. |  * termination has been received. | ||||||
|  */ |  */ | ||||||
| int | int | ||||||
| @@ -1205,7 +1208,8 @@ fatal_trap_check(void) | |||||||
| 	return (0); | 	return (0); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Returns the signal number of any pending traps: ie, a signal which has | /* | ||||||
|  |  * Returns the signal number of any pending traps: ie, a signal which has | ||||||
|  * occurred for which a trap has been set or for which the TF_DFL_INTR flag |  * occurred for which a trap has been set or for which the TF_DFL_INTR flag | ||||||
|  * is set. |  * is set. | ||||||
|  */ |  */ | ||||||
| @@ -1237,7 +1241,8 @@ runtraps(int flag) | |||||||
| 		warningf(false, "timed out waiting for input"); | 		warningf(false, "timed out waiting for input"); | ||||||
| 		unwind(LEXIT); | 		unwind(LEXIT); | ||||||
| 	} else | 	} else | ||||||
| 		/* XXX: this means the alarm will have no effect if a trap | 		/* | ||||||
|  | 		 * XXX: this means the alarm will have no effect if a trap | ||||||
| 		 * is caught after the alarm() was started...not good. | 		 * is caught after the alarm() was started...not good. | ||||||
| 		 */ | 		 */ | ||||||
| 		ksh_tmout_state = TMOUT_EXECUTING; | 		ksh_tmout_state = TMOUT_EXECUTING; | ||||||
| @@ -1283,7 +1288,8 @@ runtrap(Trap *p) | |||||||
| 		p->trap = NULL; | 		p->trap = NULL; | ||||||
| 	} | 	} | ||||||
| 	oexstat = exstat; | 	oexstat = exstat; | ||||||
| 	/* Note: trapstr is fully parsed before anything is executed, thus | 	/* | ||||||
|  | 	 * Note: trapstr is fully parsed before anything is executed, thus | ||||||
| 	 * no problem with afree(p->trap) in settrap() while still in use. | 	 * no problem with afree(p->trap) in settrap() while still in use. | ||||||
| 	 */ | 	 */ | ||||||
| 	command(trapstr, current_lineno); | 	command(trapstr, current_lineno); | ||||||
| @@ -1352,7 +1358,8 @@ settrap(Trap *p, const char *s) | |||||||
| 				p->flags |= TF_EXEC_DFL; | 				p->flags |= TF_EXEC_DFL; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		/* assumes handler already set to what shell wants it | 		/* | ||||||
|  | 		 * assumes handler already set to what shell wants it | ||||||
| 		 * (normally trapsig, but could be j_sigchld() or SIG_IGN) | 		 * (normally trapsig, but could be j_sigchld() or SIG_IGN) | ||||||
| 		 */ | 		 */ | ||||||
| 		return; | 		return; | ||||||
| @@ -1362,7 +1369,8 @@ settrap(Trap *p, const char *s) | |||||||
| 	setsig(p, f, SS_RESTORE_CURR|SS_USER); | 	setsig(p, f, SS_RESTORE_CURR|SS_USER); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Called by c_print() when writing to a co-process to ensure SIGPIPE won't | /* | ||||||
|  |  * Called by c_print() when writing to a co-process to ensure SIGPIPE won't | ||||||
|  * kill shell (unless user catches it and exits) |  * kill shell (unless user catches it and exits) | ||||||
|  */ |  */ | ||||||
| int | int | ||||||
| @@ -1390,7 +1398,8 @@ restore_pipe(int restore_dfl) | |||||||
| 		setsig(&sigtraps[SIGPIPE], SIG_DFL, SS_RESTORE_CURR); | 		setsig(&sigtraps[SIGPIPE], SIG_DFL, SS_RESTORE_CURR); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Set action for a signal. Action may not be set if original | /* | ||||||
|  |  * Set action for a signal. Action may not be set if original | ||||||
|  * action was SIG_IGN, depending on the value of flags and FTALKING. |  * action was SIG_IGN, depending on the value of flags and FTALKING. | ||||||
|  */ |  */ | ||||||
| int | int | ||||||
| @@ -1401,7 +1410,8 @@ setsig(Trap *p, sig_t f, int flags) | |||||||
| 	if (p->signal == SIGEXIT_ || p->signal == SIGERR_) | 	if (p->signal == SIGEXIT_ || p->signal == SIGERR_) | ||||||
| 		return (1); | 		return (1); | ||||||
|  |  | ||||||
| 	/* First time setting this signal? If so, get and note the current | 	/* | ||||||
|  | 	 * First time setting this signal? If so, get and note the current | ||||||
| 	 * setting. | 	 * setting. | ||||||
| 	 */ | 	 */ | ||||||
| 	if (!(p->flags & (TF_ORIG_IGN|TF_ORIG_DFL))) { | 	if (!(p->flags & (TF_ORIG_IGN|TF_ORIG_DFL))) { | ||||||
| @@ -1411,7 +1421,8 @@ setsig(Trap *p, sig_t f, int flags) | |||||||
| 		p->cursig = SIG_IGN; | 		p->cursig = SIG_IGN; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* Generally, an ignored signal stays ignored, except if | 	/*- | ||||||
|  | 	 * Generally, an ignored signal stays ignored, except if | ||||||
| 	 *	- the user of an interactive shell wants to change it | 	 *	- the user of an interactive shell wants to change it | ||||||
| 	 *	- the shell wants for force a change | 	 *	- the shell wants for force a change | ||||||
| 	 */ | 	 */ | ||||||
| @@ -1421,9 +1432,10 @@ setsig(Trap *p, sig_t f, int flags) | |||||||
|  |  | ||||||
| 	setexecsig(p, flags & SS_RESTORE_MASK); | 	setexecsig(p, flags & SS_RESTORE_MASK); | ||||||
|  |  | ||||||
| 	/* This is here 'cause there should be a way of clearing shtraps, but | 	/* | ||||||
| 	 * don't know if this is a sane way of doing it. At the moment, | 	 * This is here 'cause there should be a way of clearing shtraps, | ||||||
| 	 * all users of shtrap are lifetime users (SIGCHLD, SIGALRM, SIGWINCH). | 	 * but don't know if this is a sane way of doing it. At the moment, | ||||||
|  | 	 * all users of shtrap are lifetime users (SIGCHLD, SIGALRM). | ||||||
| 	 */ | 	 */ | ||||||
| 	if (!(flags & SS_USER)) | 	if (!(flags & SS_USER)) | ||||||
| 		p->shtrap = (sig_t)NULL; | 		p->shtrap = (sig_t)NULL; | ||||||
|   | |||||||
							
								
								
									
										106
									
								
								jobs.c
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								jobs.c
									
									
									
									
									
								
							| @@ -22,7 +22,7 @@ | |||||||
|  |  | ||||||
| #include "sh.h" | #include "sh.h" | ||||||
|  |  | ||||||
| __RCSID("$MirOS: src/bin/mksh/jobs.c,v 1.67 2009/12/31 14:05:43 tg Exp $"); | __RCSID("$MirOS: src/bin/mksh/jobs.c,v 1.68 2010/07/04 13:36:42 tg Exp $"); | ||||||
|  |  | ||||||
| #if HAVE_KILLPG | #if HAVE_KILLPG | ||||||
| #define mksh_killpg		killpg | #define mksh_killpg		killpg | ||||||
| @@ -170,7 +170,8 @@ j_init(void) | |||||||
| 	if (!mflagset && Flag(FTALKING)) | 	if (!mflagset && Flag(FTALKING)) | ||||||
| 		Flag(FMONITOR) = 1; | 		Flag(FMONITOR) = 1; | ||||||
|  |  | ||||||
| 	/* shl_j is used to do asynchronous notification (used in | 	/* | ||||||
|  | 	 * shl_j is used to do asynchronous notification (used in | ||||||
| 	 * an interrupt handler, so need a distinct shf) | 	 * an interrupt handler, so need a distinct shf) | ||||||
| 	 */ | 	 */ | ||||||
| 	shl_j = shf_fdopen(2, SHF_WR, NULL); | 	shl_j = shf_fdopen(2, SHF_WR, NULL); | ||||||
| @@ -178,7 +179,8 @@ j_init(void) | |||||||
| 	if (Flag(FMONITOR) || Flag(FTALKING)) { | 	if (Flag(FMONITOR) || Flag(FTALKING)) { | ||||||
| 		int i; | 		int i; | ||||||
|  |  | ||||||
| 		/* the TF_SHELL_USES test is a kludge that lets us know if | 		/* | ||||||
|  | 		 * the TF_SHELL_USES test is a kludge that lets us know if | ||||||
| 		 * if the signals have been changed by the shell. | 		 * if the signals have been changed by the shell. | ||||||
| 		 */ | 		 */ | ||||||
| 		for (i = NELEM(tt_sigs); --i >= 0; ) { | 		for (i = NELEM(tt_sigs); --i >= 0; ) { | ||||||
| @@ -233,7 +235,8 @@ j_exit(void) | |||||||
|  |  | ||||||
| #ifndef MKSH_UNEMPLOYED | #ifndef MKSH_UNEMPLOYED | ||||||
| 	if (kshpid == procpid && restore_ttypgrp >= 0) { | 	if (kshpid == procpid && restore_ttypgrp >= 0) { | ||||||
| 		/* Need to restore the tty pgrp to what it was when the | 		/* | ||||||
|  | 		 * Need to restore the tty pgrp to what it was when the | ||||||
| 		 * shell started up, so that the process that started us | 		 * shell started up, so that the process that started us | ||||||
| 		 * will be able to access the tty when we are done. | 		 * will be able to access the tty when we are done. | ||||||
| 		 * Also need to restore our process group in case we are | 		 * Also need to restore our process group in case we are | ||||||
| @@ -349,7 +352,8 @@ exchild(struct op *t, int flags, | |||||||
| 	} pi; | 	} pi; | ||||||
|  |  | ||||||
| 	if (flags & XEXEC) | 	if (flags & XEXEC) | ||||||
| 		/* Clear XFORK|XPCLOSE|XCCLOSE|XCOPROC|XPIPEO|XPIPEI|XXCOM|XBGND | 		/* | ||||||
|  | 		 * Clear XFORK|XPCLOSE|XCCLOSE|XCOPROC|XPIPEO|XPIPEI|XXCOM|XBGND | ||||||
| 		 * (also done in another execute() below) | 		 * (also done in another execute() below) | ||||||
| 		 */ | 		 */ | ||||||
| 		return (execute(t, flags & (XEXEC | XERROK), xerrok)); | 		return (execute(t, flags & (XEXEC | XERROK), xerrok)); | ||||||
| @@ -375,7 +379,8 @@ exchild(struct op *t, int flags, | |||||||
| 		last_proc = p; | 		last_proc = p; | ||||||
| 	} else { | 	} else { | ||||||
| 		j = new_job(); /* fills in j->job */ | 		j = new_job(); /* fills in j->job */ | ||||||
| 		/* we don't consider XXCOMs foreground since they don't get | 		/* | ||||||
|  | 		 * we don't consider XXCOMs foreground since they don't get | ||||||
| 		 * tty process group and we don't save or restore tty modes. | 		 * tty process group and we don't save or restore tty modes. | ||||||
| 		 */ | 		 */ | ||||||
| 		j->flags = (flags & XXCOM) ? JF_XXCOM : | 		j->flags = (flags & XXCOM) ? JF_XXCOM : | ||||||
| @@ -591,7 +596,8 @@ waitfor(const char *cp, int *sigp) | |||||||
| 	*sigp = 0; | 	*sigp = 0; | ||||||
|  |  | ||||||
| 	if (cp == NULL) { | 	if (cp == NULL) { | ||||||
| 		/* wait for an unspecified job - always returns 0, so | 		/* | ||||||
|  | 		 * wait for an unspecified job - always returns 0, so | ||||||
| 		 * don't have to worry about exited/signaled jobs | 		 * don't have to worry about exited/signaled jobs | ||||||
| 		 */ | 		 */ | ||||||
| 		for (j = job_list; j; j = j->next) | 		for (j = job_list; j; j = j->next) | ||||||
| @@ -903,7 +909,8 @@ j_async(void) | |||||||
| 	return (async_pid); | 	return (async_pid); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Make j the last async process | /* | ||||||
|  |  * Make j the last async process | ||||||
|  * |  * | ||||||
|  * If jobs are compiled in then this routine expects sigchld to be blocked. |  * If jobs are compiled in then this routine expects sigchld to be blocked. | ||||||
|  */ |  */ | ||||||
| @@ -939,7 +946,8 @@ j_set_async(Job *j) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Start a job: set STARTED, check for held signals and set j->last_proc | /* | ||||||
|  |  * Start a job: set STARTED, check for held signals and set j->last_proc | ||||||
|  * |  * | ||||||
|  * If jobs are compiled in then this routine expects sigchld to be blocked. |  * If jobs are compiled in then this routine expects sigchld to be blocked. | ||||||
|  */ |  */ | ||||||
| @@ -1029,7 +1037,8 @@ j_waitj(Job *j, | |||||||
| 		} | 		} | ||||||
| #endif | #endif | ||||||
| 		if (tty_fd >= 0) { | 		if (tty_fd >= 0) { | ||||||
| 			/* Only restore tty settings if job was originally | 			/* | ||||||
|  | 			 * Only restore tty settings if job was originally | ||||||
| 			 * started in the foreground. Problems can be | 			 * started in the foreground. Problems can be | ||||||
| 			 * caused by things like 'more foobar &' which will | 			 * caused by things like 'more foobar &' which will | ||||||
| 			 * typically get and save the shell's vi/emacs tty | 			 * typically get and save the shell's vi/emacs tty | ||||||
| @@ -1042,7 +1051,8 @@ j_waitj(Job *j, | |||||||
| 				tcgetattr(tty_fd, &tty_state); | 				tcgetattr(tty_fd, &tty_state); | ||||||
| 			} else { | 			} else { | ||||||
| 				tcsetattr(tty_fd, TCSADRAIN, &tty_state); | 				tcsetattr(tty_fd, TCSADRAIN, &tty_state); | ||||||
| 				/* Don't use tty mode if job is stopped and | 				/*- | ||||||
|  | 				 * Don't use tty mode if job is stopped and | ||||||
| 				 * later restarted and exits. Consider | 				 * later restarted and exits. Consider | ||||||
| 				 * the sequence: | 				 * the sequence: | ||||||
| 				 *	vi foo (stopped) | 				 *	vi foo (stopped) | ||||||
| @@ -1058,7 +1068,8 @@ j_waitj(Job *j, | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| #ifndef MKSH_UNEMPLOYED | #ifndef MKSH_UNEMPLOYED | ||||||
| 		/* If it looks like user hit ^C to kill a job, pretend we got | 		/* | ||||||
|  | 		 * If it looks like user hit ^C to kill a job, pretend we got | ||||||
| 		 * one too to break out of for loops, etc. (AT&T ksh does this | 		 * one too to break out of for loops, etc. (AT&T ksh does this | ||||||
| 		 * even when not monitoring, but this doesn't make sense since | 		 * even when not monitoring, but this doesn't make sense since | ||||||
| 		 * a tty generated ^C goes to the whole process group) | 		 * a tty generated ^C goes to the whole process group) | ||||||
| @@ -1097,7 +1108,8 @@ j_waitj(Job *j, | |||||||
| 	return (rv); | 	return (rv); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* SIGCHLD handler to reap children and update job states | /* | ||||||
|  |  * SIGCHLD handler to reap children and update job states | ||||||
|  * |  * | ||||||
|  * If jobs are compiled in then this routine expects sigchld to be blocked. |  * If jobs are compiled in then this routine expects sigchld to be blocked. | ||||||
|  */ |  */ | ||||||
| @@ -1105,14 +1117,16 @@ j_waitj(Job *j, | |||||||
| static void | static void | ||||||
| j_sigchld(int sig MKSH_A_UNUSED) | j_sigchld(int sig MKSH_A_UNUSED) | ||||||
| { | { | ||||||
| 	int		errno_ = errno; | 	/* this runs inside interrupt context, with errno saved */ | ||||||
|  |  | ||||||
| 	Job *j; | 	Job *j; | ||||||
| 	Proc *p = NULL; | 	Proc *p = NULL; | ||||||
| 	int		pid; | 	pid_t pid; | ||||||
| 	int status; | 	int status; | ||||||
| 	struct rusage ru0, ru1; | 	struct rusage ru0, ru1; | ||||||
|  |  | ||||||
| 	/* Don't wait for any processes if a job is partially started. | 	/* | ||||||
|  | 	 * Don't wait for any processes if a job is partially started. | ||||||
| 	 * This is so we don't do away with the process group leader | 	 * This is so we don't do away with the process group leader | ||||||
| 	 * before all the processes in a pipe line are started (so the | 	 * before all the processes in a pipe line are started (so the | ||||||
| 	 * setpgid() won't fail) | 	 * setpgid() won't fail) | ||||||
| @@ -1120,15 +1134,19 @@ j_sigchld(int sig MKSH_A_UNUSED) | |||||||
| 	for (j = job_list; j; j = j->next) | 	for (j = job_list; j; j = j->next) | ||||||
| 		if (j->ppid == procpid && !(j->flags & JF_STARTED)) { | 		if (j->ppid == procpid && !(j->flags & JF_STARTED)) { | ||||||
| 			held_sigchld = 1; | 			held_sigchld = 1; | ||||||
| 			goto finished; | 			return; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 	getrusage(RUSAGE_CHILDREN, &ru0); | 	getrusage(RUSAGE_CHILDREN, &ru0); | ||||||
| 	do { | 	do { | ||||||
| 		pid = waitpid(-1, &status, (WNOHANG|WUNTRACED)); | 		pid = waitpid(-1, &status, (WNOHANG|WUNTRACED)); | ||||||
|  |  | ||||||
| 		if (pid <= 0)	/* return if would block (0) ... */ | 		/* | ||||||
| 			break;	/* ... or no children or interrupted (-1) */ | 		 * return if this would block (0) or no children | ||||||
|  | 		 * or interrupted (-1) | ||||||
|  | 		 */ | ||||||
|  | 		if (pid <= 0) | ||||||
|  | 			return; | ||||||
|  |  | ||||||
| 		getrusage(RUSAGE_CHILDREN, &ru1); | 		getrusage(RUSAGE_CHILDREN, &ru1); | ||||||
|  |  | ||||||
| @@ -1165,9 +1183,6 @@ j_sigchld(int sig MKSH_A_UNUSED) | |||||||
|  |  | ||||||
| 		check_job(j);	/* check to see if entire job is done */ | 		check_job(j);	/* check to see if entire job is done */ | ||||||
| 	} while (1); | 	} while (1); | ||||||
|  |  | ||||||
|  finished: |  | ||||||
| 	errno = errno_; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -1212,17 +1227,20 @@ check_job(Job *j) | |||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* Note when co-process dies: can't be done in j_wait() nor | 	/* | ||||||
|  | 	 * Note when co-process dies: can't be done in j_wait() nor | ||||||
| 	 * remove_job() since neither may be called for non-interactive | 	 * remove_job() since neither may be called for non-interactive | ||||||
| 	 * shells. | 	 * shells. | ||||||
| 	 */ | 	 */ | ||||||
| 	if (j->state == PEXITED || j->state == PSIGNALLED) { | 	if (j->state == PEXITED || j->state == PSIGNALLED) { | ||||||
| 		/* No need to keep co-process input any more | 		/* | ||||||
|  | 		 * No need to keep co-process input any more | ||||||
| 		 * (at least, this is what ksh93d thinks) | 		 * (at least, this is what ksh93d thinks) | ||||||
| 		 */ | 		 */ | ||||||
| 		if (coproc.job == j) { | 		if (coproc.job == j) { | ||||||
| 			coproc.job = NULL; | 			coproc.job = NULL; | ||||||
| 			/* XXX would be nice to get the closes out of here | 			/* | ||||||
|  | 			 * XXX would be nice to get the closes out of here | ||||||
| 			 * so they aren't done in the signal handler. | 			 * so they aren't done in the signal handler. | ||||||
| 			 * Would mean a check in coproc_getfd() to | 			 * Would mean a check in coproc_getfd() to | ||||||
| 			 * do "if job == 0 && write >= 0, close write". | 			 * do "if job == 0 && write >= 0, close write". | ||||||
| @@ -1238,7 +1256,8 @@ check_job(Job *j) | |||||||
| 	j->flags |= JF_CHANGED; | 	j->flags |= JF_CHANGED; | ||||||
| #ifndef MKSH_UNEMPLOYED | #ifndef MKSH_UNEMPLOYED | ||||||
| 	if (Flag(FMONITOR) && !(j->flags & JF_XXCOM)) { | 	if (Flag(FMONITOR) && !(j->flags & JF_XXCOM)) { | ||||||
| 		/* Only put stopped jobs at the front to avoid confusing | 		/* | ||||||
|  | 		 * Only put stopped jobs at the front to avoid confusing | ||||||
| 		 * the user (don't want finished jobs effecting %+ or %-) | 		 * the user (don't want finished jobs effecting %+ or %-) | ||||||
| 		 */ | 		 */ | ||||||
| 		if (j->state == PSTOPPED) | 		if (j->state == PSTOPPED) | ||||||
| @@ -1255,7 +1274,8 @@ check_job(Job *j) | |||||||
| 						fd = ep->savefd[2]; | 						fd = ep->savefd[2]; | ||||||
| 				shf_reopen(fd, SHF_WR, shl_j); | 				shf_reopen(fd, SHF_WR, shl_j); | ||||||
| 			} | 			} | ||||||
| 			/* Can't call j_notify() as it removes jobs. The job | 			/* | ||||||
|  | 			 * Can't call j_notify() as it removes jobs. The job | ||||||
| 			 * must stay in the job list as j_waitj() may be | 			 * must stay in the job list as j_waitj() may be | ||||||
| 			 * running with this job. | 			 * running with this job. | ||||||
| 			 */ | 			 */ | ||||||
| @@ -1299,7 +1319,8 @@ j_print(Job *j, int how, struct shf *shf) | |||||||
| 	int	output = 0; | 	int	output = 0; | ||||||
|  |  | ||||||
| 	if (how == JP_PGRP) { | 	if (how == JP_PGRP) { | ||||||
| 		/* POSIX doesn't say what to do it there is no process | 		/* | ||||||
|  | 		 * POSIX doesn't say what to do it there is no process | ||||||
| 		 * group leader (ie, !FMONITOR). We arbitrarily return | 		 * group leader (ie, !FMONITOR). We arbitrarily return | ||||||
| 		 * last pid (which is what $! returns). | 		 * last pid (which is what $! returns). | ||||||
| 		 */ | 		 */ | ||||||
| @@ -1338,8 +1359,9 @@ j_print(Job *j, int how, struct shf *shf) | |||||||
| 			if (WCOREDUMP(p->status)) | 			if (WCOREDUMP(p->status)) | ||||||
| 				coredumped = 1; | 				coredumped = 1; | ||||||
| #endif | #endif | ||||||
| 			/* kludge for not reporting 'normal termination signals' | 			/* | ||||||
| 			 * (ie, SIGINT, SIGPIPE) | 			 * kludge for not reporting 'normal termination | ||||||
|  | 			 * signals' (i.e. SIGINT, SIGPIPE) | ||||||
| 			 */ | 			 */ | ||||||
| 			if (how == JP_SHORT && !coredumped && | 			if (how == JP_SHORT && !coredumped && | ||||||
| 			    (WTERMSIG(p->status) == SIGINT || | 			    (WTERMSIG(p->status) == SIGINT || | ||||||
| @@ -1392,7 +1414,8 @@ j_print(Job *j, int how, struct shf *shf) | |||||||
| 		shf_putc('\n', shf); | 		shf_putc('\n', shf); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Convert % sequence to job | /* | ||||||
|  |  * Convert % sequence to job | ||||||
|  * |  * | ||||||
|  * If jobs are compiled in then this routine expects sigchld to be blocked. |  * If jobs are compiled in then this routine expects sigchld to be blocked. | ||||||
|  */ |  */ | ||||||
| @@ -1409,8 +1432,10 @@ j_lookup(const char *cp, int *ecodep) | |||||||
| 		for (j = job_list; j != NULL; j = j->next) | 		for (j = job_list; j != NULL; j = j->next) | ||||||
| 			if (j->last_proc && j->last_proc->pid == job) | 			if (j->last_proc && j->last_proc->pid == job) | ||||||
| 				return (j); | 				return (j); | ||||||
| 		/* ...then look for process group (this is non-POSIX, | 		/* | ||||||
| 		 * but should not break anything */ | 		 * ...then look for process group (this is non-POSIX, | ||||||
|  | 		 * but should not break anything | ||||||
|  | 		 */ | ||||||
| 		for (j = job_list; j != NULL; j = j->next) | 		for (j = job_list; j != NULL; j = j->next) | ||||||
| 			if (j->pgrp && j->pgrp == job) | 			if (j->pgrp && j->pgrp == job) | ||||||
| 				return (j); | 				return (j); | ||||||
| @@ -1484,7 +1509,8 @@ j_lookup(const char *cp, int *ecodep) | |||||||
| static Job	*free_jobs; | static Job	*free_jobs; | ||||||
| static Proc	*free_procs; | static Proc	*free_procs; | ||||||
|  |  | ||||||
| /* allocate a new job and fill in the job number. | /* | ||||||
|  |  * allocate a new job and fill in the job number. | ||||||
|  * |  * | ||||||
|  * If jobs are compiled in then this routine expects sigchld to be blocked. |  * If jobs are compiled in then this routine expects sigchld to be blocked. | ||||||
|  */ |  */ | ||||||
| @@ -1512,7 +1538,8 @@ new_job(void) | |||||||
| 	return (newj); | 	return (newj); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Allocate new process struct | /* | ||||||
|  |  * Allocate new process struct | ||||||
|  * |  * | ||||||
|  * If jobs are compiled in then this routine expects sigchld to be blocked. |  * If jobs are compiled in then this routine expects sigchld to be blocked. | ||||||
|  */ |  */ | ||||||
| @@ -1530,7 +1557,8 @@ new_proc(void) | |||||||
| 	return (p); | 	return (p); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Take job out of job_list and put old structures into free list. | /* | ||||||
|  |  * Take job out of job_list and put old structures into free list. | ||||||
|  * Keeps nzombies, last_job and async_job up to date. |  * Keeps nzombies, last_job and async_job up to date. | ||||||
|  * |  * | ||||||
|  * If jobs are compiled in then this routine expects sigchld to be blocked. |  * If jobs are compiled in then this routine expects sigchld to be blocked. | ||||||
| @@ -1570,7 +1598,8 @@ remove_job(Job *j, const char *where) | |||||||
| 		async_job = NULL; | 		async_job = NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* put j in a particular location (taking it out job_list if it is there | /* | ||||||
|  |  * put j in a particular location (taking it out job_list if it is there | ||||||
|  * already) |  * already) | ||||||
|  * |  * | ||||||
|  * If jobs are compiled in then this routine expects sigchld to be blocked. |  * If jobs are compiled in then this routine expects sigchld to be blocked. | ||||||
| @@ -1606,7 +1635,8 @@ put_job(Job *j, int where) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| /* nuke a job (called when unable to start full job). | /* | ||||||
|  |  * nuke a job (called when unable to start full job). | ||||||
|  * |  * | ||||||
|  * If jobs are compiled in then this routine expects sigchld to be blocked. |  * If jobs are compiled in then this routine expects sigchld to be blocked. | ||||||
|  */ |  */ | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								sh.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								sh.h
									
									
									
									
									
								
							| @@ -150,7 +150,7 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef EXTERN | #ifdef EXTERN | ||||||
| __RCSID("$MirOS: src/bin/mksh/sh.h,v 1.392 2010/05/22 12:49:16 tg Exp $"); | __RCSID("$MirOS: src/bin/mksh/sh.h,v 1.393 2010/07/04 13:36:43 tg Exp $"); | ||||||
| #endif | #endif | ||||||
| #define MKSH_VERSION "R39 2010/05/22" | #define MKSH_VERSION "R39 2010/05/22" | ||||||
|  |  | ||||||
| @@ -658,7 +658,7 @@ typedef struct trap { | |||||||
| #define SS_RESTORE_IGN	3	/* restore to SIG_IGN */ | #define SS_RESTORE_IGN	3	/* restore to SIG_IGN */ | ||||||
| #define SS_FORCE	BIT(3)	/* set signal even if original signal ignored */ | #define SS_FORCE	BIT(3)	/* set signal even if original signal ignored */ | ||||||
| #define SS_USER		BIT(4)	/* user is doing the set (ie, trap command) */ | #define SS_USER		BIT(4)	/* user is doing the set (ie, trap command) */ | ||||||
| #define SS_SHTRAP	BIT(5)	/* trap for internal use (CHLD,ALRM,WINCH) */ | #define SS_SHTRAP	BIT(5)	/* trap for internal use (SIGCHLD, SIGALRM) */ | ||||||
|  |  | ||||||
| #define SIGEXIT_	0	/* for trap EXIT */ | #define SIGEXIT_	0	/* for trap EXIT */ | ||||||
| #define SIGERR_		NSIG	/* for trap ERR */ | #define SIGERR_		NSIG	/* for trap ERR */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user