mksh:
* initialise the integers PPID, OPTIND, RANDOM, SECONDS, and TMOUT to base-10 * bring back PGRP as base-10 integer to the process group via getpgrp(2) * initialise USER_ID as base-10 integer to the effective user id as retrieved from geteuid(2) = $(id -u) * use $USER_ID in dot.mkshrc instead of spawning an id(1) process -> dot.mkshrc,v 1.34 now requires mksh R34 * convert more int to bool where appropriate * remove dead code - getpgrp(2) cannot fail * sync manual page to reality * bump to mksh R34(beta) - feature freeze XXX check if our_pgrp in jobs.c is still really needed, the setpgid call XXX probably just makes us our own pgrp leader, and we might have to use XXX and update kshpgrp accordingly - need feedback/help here but I think XXX this simplification should be possible if I grok the code correctly. etc/profile: * adjust to $USER_ID changes in mksh (speed-up here, too) mksh.hts: * sync changelog
This commit is contained in:
		
							
								
								
									
										4
									
								
								check.t
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								check.t
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| # $MirOS: src/bin/mksh/check.t,v 1.194 2008/05/10 03:16:07 tg Exp $ | ||||
| # $MirOS: src/bin/mksh/check.t,v 1.195 2008/05/15 15:24:09 tg Exp $ | ||||
| # $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $ | ||||
| # $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $ | ||||
| # $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $ | ||||
| @@ -7,7 +7,7 @@ | ||||
| # http://www.research.att.com/~gsf/public/ifs.sh | ||||
|  | ||||
| expected-stdout: | ||||
| 	@(#)MIRBSD KSH R33 2008/05/04 | ||||
| 	@(#)MIRBSD KSH R34 2008/05/15 | ||||
| description: | ||||
| 	Check version of shell. | ||||
| category: pdksh | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| # $MirOS: src/bin/mksh/dot.mkshrc,v 1.33 2008/04/22 13:48:15 tg Rel $ | ||||
| # $MirOS: src/bin/mksh/dot.mkshrc,v 1.34 2008/05/15 15:24:09 tg Exp $ | ||||
| #- | ||||
| # ~/.mkshrc: mksh initialisation file for interactive shells | ||||
|  | ||||
| : ${EDITOR:=/bin/ed} ${TERM:=vt100} ${HOSTNAME:=$(ulimit -c 0;hostname -s 2>&-)} | ||||
| [[ $HOSTNAME = @(localhost|*([	 ])) ]] && HOSTNAME=$(ulimit -c 0;hostname 2>&-) | ||||
| : ${HOSTNAME:=nil}; PS1='#'; [[ "$(ulimit -c 0; id -u 2>&-)" -eq 0 ]] || PS1='$' | ||||
| : ${HOSTNAME:=nil}; if (( USER_ID )); then PS1='$'; else PS1='#'; fi | ||||
| function precmd { | ||||
| 	typeset -i e=$? | ||||
|  | ||||
|   | ||||
							
								
								
									
										28
									
								
								jobs.c
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								jobs.c
									
									
									
									
									
								
							| @@ -2,7 +2,7 @@ | ||||
|  | ||||
| #include "sh.h" | ||||
|  | ||||
| __RCSID("$MirOS: src/bin/mksh/jobs.c,v 1.33 2008/04/01 21:50:58 tg Exp $"); | ||||
| __RCSID("$MirOS: src/bin/mksh/jobs.c,v 1.34 2008/05/15 15:24:09 tg Exp $"); | ||||
|  | ||||
| /* Order important! */ | ||||
| #define PRUNNING	0 | ||||
| @@ -99,7 +99,7 @@ static int32_t njobs;		/* # of jobs started */ | ||||
| static volatile sig_atomic_t held_sigchld; | ||||
|  | ||||
| static struct shf	*shl_j; | ||||
| static int		ttypgrp_ok;	/* set if can use tty pgrps */ | ||||
| static bool		ttypgrp_ok;	/* set if can use tty pgrps */ | ||||
| static pid_t		restore_ttypgrp = -1; | ||||
| static pid_t		our_pgrp; | ||||
| static int const	tt_sigs[] = { SIGTSTP, SIGTTIN, SIGTTOU }; | ||||
| @@ -221,14 +221,8 @@ j_change(void) | ||||
| 			tty_init(false); | ||||
|  | ||||
| 		/* no controlling tty, no SIGT* */ | ||||
| 		ttypgrp_ok = use_tty && tty_fd >= 0 && tty_devtty; | ||||
|  | ||||
| 		if (ttypgrp_ok && (our_pgrp = getpgrp()) < 0) { | ||||
| 			warningf(false, "j_init: getpgrp() failed: %s", | ||||
| 			    strerror(errno)); | ||||
| 			ttypgrp_ok = 0; | ||||
| 		} | ||||
| 		if (ttypgrp_ok) { | ||||
| 		if ((ttypgrp_ok = use_tty && tty_fd >= 0 && tty_devtty)) { | ||||
| 			our_pgrp = kshpgrp; | ||||
| 			setsig(&sigtraps[SIGTTIN], SIG_DFL, | ||||
| 			    SS_RESTORE_ORIG|SS_FORCE); | ||||
| 			/* wait to be given tty (POSIX.1, B.2, job control) */ | ||||
| @@ -239,7 +233,7 @@ j_change(void) | ||||
| 					warningf(false, | ||||
| 					    "j_init: tcgetpgrp() failed: %s", | ||||
| 					    strerror(errno)); | ||||
| 					ttypgrp_ok = 0; | ||||
| 					ttypgrp_ok = false; | ||||
| 					break; | ||||
| 				} | ||||
| 				if (ttypgrp == our_pgrp) | ||||
| @@ -255,13 +249,13 @@ j_change(void) | ||||
| 				warningf(false, | ||||
| 				    "j_init: setpgid() failed: %s", | ||||
| 				    strerror(errno)); | ||||
| 				ttypgrp_ok = 0; | ||||
| 				ttypgrp_ok = false; | ||||
| 			} else { | ||||
| 				if (tcsetpgrp(tty_fd, kshpid) < 0) { | ||||
| 					warningf(false, | ||||
| 					    "j_init: tcsetpgrp() failed: %s", | ||||
| 					    strerror(errno)); | ||||
| 					ttypgrp_ok = 0; | ||||
| 					ttypgrp_ok = false; | ||||
| 				} else | ||||
| 					restore_ttypgrp = our_pgrp; | ||||
| 				our_pgrp = kshpid; | ||||
| @@ -272,7 +266,7 @@ j_change(void) | ||||
| 		if (tty_fd >= 0) | ||||
| 			tcgetattr(tty_fd, &tty_state); | ||||
| 	} else { | ||||
| 		ttypgrp_ok = 0; | ||||
| 		ttypgrp_ok = false; | ||||
| 		if (Flag(FTALKING)) | ||||
| 			for (i = NELEM(tt_sigs); --i >= 0; ) | ||||
| 				setsig(&sigtraps[tt_sigs[i]], SIG_IGN, | ||||
| @@ -426,7 +420,7 @@ exchild(struct op *t, int flags, /* used if XPCLOSE or XCCLOSE */ int close_fd) | ||||
| 		} | ||||
| 		remove_job(j, "child");	/* in case of $(jobs) command */ | ||||
| 		nzombie = 0; | ||||
| 		ttypgrp_ok = 0; | ||||
| 		ttypgrp_ok = false; | ||||
| 		Flag(FMONITOR) = 0; | ||||
| 		Flag(FTALKING) = 0; | ||||
| 		tty_close(); | ||||
| @@ -685,7 +679,7 @@ j_resume(const char *cp, int bg) | ||||
| 			if (ttypgrp_ok && tcsetpgrp(tty_fd, our_pgrp) < 0) { | ||||
| 				warningf(true, | ||||
| 				    "fg: 2nd tcsetpgrp(%d, %d) failed: %s", | ||||
| 				    tty_fd, (int) our_pgrp, | ||||
| 				    tty_fd, (int)our_pgrp, | ||||
| 				    strerror(errno)); | ||||
| 			} | ||||
| 		} | ||||
| @@ -951,7 +945,7 @@ j_waitj(Job *j, | ||||
| 			if (tcsetpgrp(tty_fd, our_pgrp) < 0) { | ||||
| 				warningf(true, | ||||
| 				    "j_waitj: tcsetpgrp(%d, %d) failed: %s", | ||||
| 				    tty_fd, (int) our_pgrp, | ||||
| 				    tty_fd, (int)our_pgrp, | ||||
| 					strerror(errno)); | ||||
| 			} | ||||
| 			if (j->state == PSTOPPED) { | ||||
|   | ||||
							
								
								
									
										12
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								main.c
									
									
									
									
									
								
							| @@ -13,7 +13,7 @@ | ||||
| #include <locale.h> | ||||
| #endif | ||||
|  | ||||
| __RCSID("$MirOS: src/bin/mksh/main.c,v 1.96 2008/05/04 01:58:14 tg Exp $"); | ||||
| __RCSID("$MirOS: src/bin/mksh/main.c,v 1.97 2008/05/15 15:24:10 tg Exp $"); | ||||
|  | ||||
| extern char **environ; | ||||
|  | ||||
| @@ -32,8 +32,8 @@ static const char initsubs[] = "${PS2=> } ${PS3=#? } ${PS4=+ }"; | ||||
| static const char *initcoms[] = { | ||||
| 	"typeset", "-r", initvsn, NULL, | ||||
| 	"typeset", "-x", "SHELL", "PATH", "HOME", NULL, | ||||
| 	"typeset", "-i", "PPID", "OPTIND=1", NULL, | ||||
| 	"eval", "typeset -i RANDOM SECONDS=\"${SECONDS-0}\" TMOUT=\"${TMOUT-0}\"", NULL, | ||||
| 	"typeset", "-i10", "OPTIND=1", "PGRP", "PPID", "USER_ID", NULL, | ||||
| 	"eval", "typeset -i10 RANDOM SECONDS=\"${SECONDS-0}\" TMOUT=\"${TMOUT-0}\"", NULL, | ||||
| 	"alias", "integer=typeset -i", "local=typeset", NULL, | ||||
| 	"alias", | ||||
| 	"hash=alias -t",	/* not "alias -t --": hash -r needs to work */ | ||||
| @@ -213,7 +213,6 @@ main(int argc, const char *argv[]) | ||||
| #if HAVE_ARC4RANDOM | ||||
| 	Flag(FARC4RANDOM) = 2;	/* use arc4random(3) until $RANDOM is written */ | ||||
| #endif | ||||
| 	setint(global("PPID"), (long)ppid); | ||||
|  | ||||
| 	for (wp = initcoms; *wp != NULL; wp++) { | ||||
| 		shcomexec(wp); | ||||
| @@ -228,6 +227,9 @@ main(int argc, const char *argv[]) | ||||
| 	    (!ksheuid && !strchr(str_val(vp), '#'))) | ||||
| 		/* setstr can't fail here */ | ||||
| 		setstr(vp, safe_prompt, KSH_RETURN_ERROR); | ||||
| 	setint(global("PGRP"), (long)(kshpgrp = getpgrp())); | ||||
| 	setint(global("PPID"), (long)ppid); | ||||
| 	setint(global("USER_ID"), (long)ksheuid); | ||||
|  | ||||
| 	/* Set this before parsing arguments */ | ||||
| #if HAVE_SETRESUGID | ||||
| @@ -636,7 +638,7 @@ quitenv(struct shf *shf) | ||||
| 				 * dump a core.. | ||||
| 				 */ | ||||
| 				if ((sig == SIGINT || sig == SIGTERM) && | ||||
| 				    getpgrp() == kshpid) { | ||||
| 				    (kshpgrp == kshpid)) { | ||||
| 					setsig(&sigtraps[sig], SIG_DFL, | ||||
| 					    SS_RESTORE_CURR | SS_FORCE); | ||||
| 					kill(0, sig); | ||||
|   | ||||
							
								
								
									
										10
									
								
								mksh.1
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								mksh.1
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| .\" $MirOS: src/bin/mksh/mksh.1,v 1.126 2008/05/10 18:10:02 tg Exp $ | ||||
| .\" $MirOS: src/bin/mksh/mksh.1,v 1.127 2008/05/15 15:24:10 tg Exp $ | ||||
| .\" $OpenBSD: ksh.1,v 1.121 2008/03/21 12:51:19 millert Exp $ | ||||
| .\"- | ||||
| .\" Try to make GNU groff and AT&T nroff more compatible | ||||
| @@ -30,7 +30,7 @@ | ||||
| .el .xD \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 | ||||
| .. | ||||
| .\"- | ||||
| .Dd $Mdocdate: May 10 2008 $ | ||||
| .Dd $Mdocdate: May 15 2008 $ | ||||
| .Dt MKSH 1 | ||||
| .Os MirBSD | ||||
| .Sh NAME | ||||
| @@ -1551,8 +1551,10 @@ An empty string resulting from a leading or trailing | ||||
| colon, or two adjacent colons, is treated as a | ||||
| .Sq \&. | ||||
| (the current directory). | ||||
| .It Ev PGRP | ||||
| The process ID of the shell's process group leader. | ||||
| .It Ev PPID | ||||
| The process ID of the shell's parent (read-only). | ||||
| The process ID of the shell's parent. | ||||
| .It Ev PS1 | ||||
| The primary prompt for interactive shells. | ||||
| Parameter, command, and arithmetic | ||||
| @@ -1683,6 +1685,8 @@ If this parameter is not | ||||
| set, or does not contain the absolute path of a writable directory, temporary | ||||
| files are created in | ||||
| .Pa /tmp . | ||||
| .It Ev USER_ID | ||||
| The effective user id of the shell. | ||||
| .El | ||||
| .Ss Tilde expansion | ||||
| Tilde expansion which is done in parallel with parameter substitution, is done | ||||
|   | ||||
							
								
								
									
										5
									
								
								sh.h
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								sh.h
									
									
									
									
									
								
							| @@ -96,9 +96,9 @@ | ||||
| #define __SCCSID(x)	__IDSTRING(sccsid,x) | ||||
|  | ||||
| #ifdef EXTERN | ||||
| __RCSID("$MirOS: src/bin/mksh/sh.h,v 1.214 2008/05/04 01:51:31 tg Exp $"); | ||||
| __RCSID("$MirOS: src/bin/mksh/sh.h,v 1.215 2008/05/15 15:24:11 tg Exp $"); | ||||
| #endif | ||||
| #define MKSH_VERSION "R33 2008/05/04" | ||||
| #define MKSH_VERSION "R34 2008/05/15" | ||||
|  | ||||
| #ifndef MKSH_INCLUDES_ONLY | ||||
|  | ||||
| @@ -280,6 +280,7 @@ typedef int32_t Tflag; | ||||
| EXTERN const char *kshname;	/* $0 */ | ||||
| EXTERN pid_t kshpid;		/* $$, shell pid */ | ||||
| EXTERN pid_t procpid;		/* pid of executing process */ | ||||
| EXTERN pid_t kshpgrp;		/* process group of shell */ | ||||
| EXTERN uid_t ksheuid;		/* effective uid of shell */ | ||||
| EXTERN int exstat;		/* exit status */ | ||||
| EXTERN int subst_exstat;	/* exit status of last $(..)/`..` */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user