1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-02-13 11:42:21 +00:00

Another round of accumulated minor fixes and cleanups

Only notable changes listed below.

**/Mamfile:
- Do not bother redirecting standard error for 'cmp -s' to
  /dev/null. Normally, 'cmp -s' on Linux, macOS, *BSD, or Solaris
  do not not print any message. If it does, something unusual is
  going on and I would want to see the message.
- Since we now require a POSIX shell, we can use '!'.

src/cmd/ksh93/include/defs.h,
src/cmd/ksh93/sh/init.c:
- Remove SH_TYPE_PROFILE symbol, unused after the removal of the
  SHOPT_PFSH code. (re: eabd6453)

src/cmd/ksh93/sh/io.c:
- piperead(), slowread(): Replace redundant sffileno() calls by
  the variables already containing their results. (re: 50d342e4)

src/cmd/ksh93/bltins/mkservice.c,
rc/lib/libcmd/vmstate.c:
- If these aren't compiled, define a stub function to silence the
  ranlib(1) warning that the .o file does not contain symbols.
This commit is contained in:
Martijn Dekker 2022-03-01 21:10:38 +01:00
parent 8fc8c2f51c
commit b398f33c49
42 changed files with 352 additions and 523 deletions

View file

@ -1501,23 +1501,20 @@ make install
make ${PACKAGE_ast_INCLUDE}/nval.h make ${PACKAGE_ast_INCLUDE}/nval.h
prev ${PACKAGE_ast_INCLUDE} prev ${PACKAGE_ast_INCLUDE}
prev include/nval.h prev include/nval.h
exec - if cmp 2>/dev/null -s include/nval.h ${PACKAGE_ast_INCLUDE}/nval.h exec - if ! cmp -s include/nval.h ${PACKAGE_ast_INCLUDE}/nval.h
exec - then : exec - then ${STDCP} include/nval.h ${PACKAGE_ast_INCLUDE}/nval.h
exec - else ${STDCP} include/nval.h ${PACKAGE_ast_INCLUDE}/nval.h
exec - fi exec - fi
done ${PACKAGE_ast_INCLUDE}/nval.h generated done ${PACKAGE_ast_INCLUDE}/nval.h generated
make ${PACKAGE_ast_INCLUDE}/shell.h make ${PACKAGE_ast_INCLUDE}/shell.h
prev include/shell.h prev include/shell.h
exec - if cmp 2>/dev/null -s include/shell.h ${PACKAGE_ast_INCLUDE}/shell.h exec - if ! cmp -s include/shell.h ${PACKAGE_ast_INCLUDE}/shell.h
exec - then : exec - then ${STDCP} include/shell.h ${PACKAGE_ast_INCLUDE}/shell.h
exec - else ${STDCP} include/shell.h ${PACKAGE_ast_INCLUDE}/shell.h
exec - fi exec - fi
done ${PACKAGE_ast_INCLUDE}/shell.h generated done ${PACKAGE_ast_INCLUDE}/shell.h generated
make ${PACKAGE_ast_INCLUDE}/history.h make ${PACKAGE_ast_INCLUDE}/history.h
prev include/history.h prev include/history.h
exec - if cmp 2>/dev/null -s include/history.h ${PACKAGE_ast_INCLUDE}/history.h exec - if ! cmp -s include/history.h ${PACKAGE_ast_INCLUDE}/history.h
exec - then : exec - then ${STDCP} include/history.h ${PACKAGE_ast_INCLUDE}/history.h
exec - else ${STDCP} include/history.h ${PACKAGE_ast_INCLUDE}/history.h
exec - fi exec - fi
done ${PACKAGE_ast_INCLUDE}/history.h generated done ${PACKAGE_ast_INCLUDE}/history.h generated
make ${INSTALLROOT}/bin/suid_exec make ${INSTALLROOT}/bin/suid_exec

View file

@ -297,7 +297,6 @@ int b_hist(int argc,char *argv[], Shbltin_t *context)
* given a file containing a command and a string of the form old=new, * given a file containing a command and a string of the form old=new,
* execute the command with the string old replaced by new * execute the command with the string old replaced by new
*/ */
static void hist_subst(const char *command,int fd,char *replace) static void hist_subst(const char *command,int fd,char *replace)
{ {
register char *newp=replace; register char *newp=replace;

View file

@ -25,7 +25,9 @@
* AT&T Labs * AT&T Labs
*/ */
#if SHOPT_MKSERVICE #if !SHOPT_MKSERVICE
void _STUB_b_mkservice(){}
#else
static const char mkservice_usage[] = static const char mkservice_usage[] =
"[-?\n@(#)$Id: mkservice (AT&T Research) 2001-06-13 $\n]" "[-?\n@(#)$Id: mkservice (AT&T Research) 2001-06-13 $\n]"

View file

@ -163,7 +163,6 @@ static int infof(Opt_t* op, Sfio_t* sp, const char* s, Optdisc_t* dp)
* argc==0 when called from echo * argc==0 when called from echo
* argc==-1 when called from printf * argc==-1 when called from printf
*/ */
int b_print(int argc, char *argv[], Shbltin_t *context) int b_print(int argc, char *argv[], Shbltin_t *context)
{ {
register Sfio_t *outfile; register Sfio_t *outfile;
@ -397,7 +396,6 @@ printf_v:
* if <raw> is non-zero then \ is not a special character. * if <raw> is non-zero then \ is not a special character.
* returns 0 for \c otherwise 1. * returns 0 for \c otherwise 1.
*/ */
static int echolist(Sfio_t *outfile, int raw, char *argv[]) static int echolist(Sfio_t *outfile, int raw, char *argv[])
{ {
register char *cp; register char *cp;
@ -1054,7 +1052,6 @@ static int extend(Sfio_t* sp, void* v, Sffmt_t* fe)
* Otherwise, puts null-terminated result on stack, but doesn't freeze it * Otherwise, puts null-terminated result on stack, but doesn't freeze it
* returns length of output. * returns length of output.
*/ */
static int fmtvecho(const char *string, struct printf *pp) static int fmtvecho(const char *string, struct printf *pp)
{ {
register const char *cp = string, *cpmax; register const char *cp = string, *cpmax;

View file

@ -212,7 +212,6 @@ static void timedout(void *handle)
* <flags> is union of -A, -r, -s, and contains delimiter if not '\n' * <flags> is union of -A, -r, -s, and contains delimiter if not '\n'
* <timeout> is the number of milliseconds until timeout * <timeout> is the number of milliseconds until timeout
*/ */
int sh_readline(char **names, volatile int fd, int flags, ssize_t size, long timeout) int sh_readline(char **names, volatile int fd, int flags, ssize_t size, long timeout)
{ {
register ssize_t c; register ssize_t c;

View file

@ -132,7 +132,6 @@ void sh_regress_init(void)
/* /*
* regress info trace output * regress info trace output
*/ */
void sh_regress(unsigned int index, const char* intercept, const char* info, unsigned int line, const char* file) void sh_regress(unsigned int index, const char* intercept, const char* info, unsigned int line, const char* file)
{ {
char* name; char* name;
@ -148,7 +147,6 @@ void sh_regress(unsigned int index, const char* intercept, const char* info, uns
/* /*
* EGID intercepts * EGID intercepts
*/ */
static gid_t intercept_sgid = 0; static gid_t intercept_sgid = 0;
static gid_t intercept_egid = -1; static gid_t intercept_egid = -1;
static gid_t intercept_rgid = -1; static gid_t intercept_rgid = -1;
@ -191,7 +189,6 @@ int setgid(gid_t gid)
/* /*
* EUID intercepts * EUID intercepts
*/ */
static uid_t intercept_suid = 0; static uid_t intercept_suid = 0;
static uid_t intercept_euid = -1; static uid_t intercept_euid = -1;
static uid_t intercept_ruid = -1; static uid_t intercept_ruid = -1;
@ -234,7 +231,6 @@ int setuid(uid_t uid)
/* /*
* p_suid intercept * p_suid intercept
*/ */
static uid_t intercept_p_suid = 0x7fffffff; static uid_t intercept_p_suid = 0x7fffffff;
uid_t sh_regress_p_suid(unsigned int line, const char* file) uid_t sh_regress_p_suid(unsigned int line, const char* file)
@ -246,7 +242,6 @@ uid_t sh_regress_p_suid(unsigned int line, const char* file)
/* /*
* p_suid intercept * p_suid intercept
*/ */
static char* intercept_etc = 0; static char* intercept_etc = 0;
char* sh_regress_etc(const char* path, unsigned int line, const char* file) char* sh_regress_etc(const char* path, unsigned int line, const char* file)
@ -258,7 +253,6 @@ char* sh_regress_etc(const char* path, unsigned int line, const char* file)
/* /*
* __regress__ builtin * __regress__ builtin
*/ */
int b___regress__(int argc, char** argv, Shbltin_t *context) int b___regress__(int argc, char** argv, Shbltin_t *context)
{ {
int n; int n;

View file

@ -27,7 +27,6 @@
* *
*/ */
#include "defs.h" #include "defs.h"
#include <error.h> #include <error.h>
#include <ls.h> #include <ls.h>
@ -560,7 +559,6 @@ int test_binop(register int op,const char *left,const char *right)
/* /*
* returns the modification time of f1 - modification time of f2 * returns the modification time of f1 - modification time of f2
*/ */
static time_t test_time(const char *file1,const char *file2) static time_t test_time(const char *file1,const char *file2)
{ {
Time_t t1, t2; Time_t t1, t2;
@ -582,7 +580,6 @@ static time_t test_time(const char *file1,const char *file2)
/* /*
* return true if inode of two files are the same * return true if inode of two files are the same
*/ */
int test_inode(const char *file1,const char *file2) int test_inode(const char *file1,const char *file2)
{ {
struct stat stat1,stat2; struct stat stat1,stat2;
@ -597,7 +594,6 @@ int test_inode(const char *file1,const char *file2)
* This version of access checks against the effective UID/GID * This version of access checks against the effective UID/GID
* The static buffer statb is shared with test_mode. * The static buffer statb is shared with test_mode.
*/ */
int sh_access(register const char *name, register int mode) int sh_access(register const char *name, register int mode)
{ {
struct stat statb; struct stat statb;
@ -685,7 +681,6 @@ skip:
* If <file> is null, then the previous stat buffer is used. * If <file> is null, then the previous stat buffer is used.
* The mode bits are zero if the file doesn't exist. * The mode bits are zero if the file doesn't exist.
*/ */
static int test_mode(register const char *file) static int test_mode(register const char *file)
{ {
struct stat statb; struct stat statb;

View file

@ -316,7 +316,6 @@ int b_suspend(int argc,char *argv[],Shbltin_t *context)
/* /*
* Given the name or number of a signal return the signal number * Given the name or number of a signal return the signal number
*/ */
static int sig_number(const char *string) static int sig_number(const char *string)
{ {
const Shtable_t *tp; const Shtable_t *tp;

View file

@ -1024,7 +1024,6 @@ static int maxlib;
* always move to head of search list * always move to head of search list
* return: 0: already loaded 1: first load * return: 0: already loaded 1: first load
*/ */
int sh_addlib(void* dll, char* name, Pathcomp_t* pp) int sh_addlib(void* dll, char* name, Pathcomp_t* pp)
{ {
register int n; register int n;
@ -1391,7 +1390,6 @@ static int unall(int argc, char **argv, register Dt_t *troot)
sh_subfork(); /* avoid affecting the parent shell's alias table */ sh_subfork(); /* avoid affecting the parent shell's alias table */
nv_delete(np,troot,nofree_attr); nv_delete(np,troot,nofree_attr);
} }
} }
else if(troot==sh.alias_tree) else if(troot==sh.alias_tree)
r = 1; r = 1;
@ -1404,7 +1402,6 @@ static int unall(int argc, char **argv, register Dt_t *troot)
/* /*
* print out the name and value of a name-value pair <np> * print out the name and value of a name-value pair <np>
*/ */
static int print_namval(Sfio_t *file,register Namval_t *np,register int flag, struct tdata *tp) static int print_namval(Sfio_t *file,register Namval_t *np,register int flag, struct tdata *tp)
{ {
register char *cp; register char *cp;
@ -1549,7 +1546,6 @@ static void print_attribute(register Namval_t *np,void *data)
* print the nodes in tree <root> which have attributes <flag> set * print the nodes in tree <root> which have attributes <flag> set
* if <option> is non-zero, no subscript or value is printed * if <option> is non-zero, no subscript or value is printed
*/ */
static void print_scan(Sfio_t *file, int flag, Dt_t *root, int option,struct tdata *tp) static void print_scan(Sfio_t *file, int flag, Dt_t *root, int option,struct tdata *tp)
{ {
register char **argv; register char **argv;
@ -1616,7 +1612,6 @@ static void print_scan(Sfio_t *file, int flag, Dt_t *root, int option,struct tda
/* /*
* add the name of the node to the argument list argnam * add the name of the node to the argument list argnam
*/ */
static void pushname(Namval_t *np,void *data) static void pushname(Namval_t *np,void *data)
{ {
struct tdata *tp = (struct tdata*)data; struct tdata *tp = (struct tdata*)data;

View file

@ -1448,7 +1448,7 @@ const char sh_optread[] =
"\n[var?prompt] [var ...]\n" "\n[var?prompt] [var ...]\n"
"\n" "\n"
"[+EXIT STATUS?]{" "[+EXIT STATUS?]{"
"[+0? Successful completion.]" "[+0?Successful completion.]"
"[+>0?End of file was detected or an error occurred.]" "[+>0?End of file was detected or an error occurred.]"
"}" "}"
"[+SEE ALSO?\bprint\b(1), \bprintf\b(1), \bcat\b(1)]" "[+SEE ALSO?\bprint\b(1), \bprintf\b(1), \bcat\b(1)]"

View file

@ -357,7 +357,6 @@ retry:
/* /*
* close the history file and free the space * close the history file and free the space
*/ */
void hist_close(register History_t *hp) void hist_close(register History_t *hp)
{ {
sfclose(hp->histfp); sfclose(hp->histfp);
@ -405,7 +404,6 @@ static int hist_clean(int fd)
/* /*
* Copy the last <n> commands to a new file and make this the history file * Copy the last <n> commands to a new file and make this the history file
*/ */
static History_t* hist_trim(History_t *hp, int n) static History_t* hist_trim(History_t *hp, int n)
{ {
register char *cp; register char *cp;
@ -571,7 +569,6 @@ begin:
* unless it is followed by 0. If followed by 0 then it cancels * unless it is followed by 0. If followed by 0 then it cancels
* the previous command. * the previous command.
*/ */
void hist_eof(register History_t *hp) void hist_eof(register History_t *hp)
{ {
register char *cp,*first,*endbuff; register char *cp,*first,*endbuff;
@ -685,7 +682,6 @@ again:
/* /*
* This routine will cause the previous command to be cancelled * This routine will cause the previous command to be cancelled
*/ */
void hist_cancel(register History_t *hp) void hist_cancel(register History_t *hp)
{ {
register int c; register int c;
@ -702,7 +698,6 @@ void hist_cancel(register History_t *hp)
/* /*
* flush the current history command * flush the current history command
*/ */
void hist_flush(register History_t *hp) void hist_flush(register History_t *hp)
{ {
register char *buff; register char *buff;
@ -730,7 +725,6 @@ void hist_flush(register History_t *hp)
* When called from hist_flush(), trailing newlines are deleted and * When called from hist_flush(), trailing newlines are deleted and
* a zero byte. Line sequencing is added as required * a zero byte. Line sequencing is added as required
*/ */
static ssize_t hist_write(Sfio_t *iop,const void *buff,register size_t insize,Sfdisc_t* handle) static ssize_t hist_write(Sfio_t *iop,const void *buff,register size_t insize,Sfdisc_t* handle)
{ {
register History_t *hp = (History_t*)handle; register History_t *hp = (History_t*)handle;
@ -821,7 +815,6 @@ static ssize_t hist_write(Sfio_t *iop,const void *buff,register size_t insize,Sf
* Put history sequence number <n> into buffer <buff> * Put history sequence number <n> into buffer <buff>
* The buffer must be large enough to hold HIST_MARKSZ chars * The buffer must be large enough to hold HIST_MARKSZ chars
*/ */
static void hist_marker(register char *buff,register long cmdno) static void hist_marker(register char *buff,register long cmdno)
{ {
*buff++ = HIST_CMDNO; *buff++ = HIST_CMDNO;
@ -855,7 +848,6 @@ off_t hist_seek(register History_t *hp, int n)
* if character <last> appears before newline it is deleted * if character <last> appears before newline it is deleted
* each new-line character is replaced with string <nl>. * each new-line character is replaced with string <nl>.
*/ */
void hist_list(register History_t *hp,Sfio_t *outfile, off_t offset,int last, char *nl) void hist_list(register History_t *hp,Sfio_t *outfile, off_t offset,int last, char *nl)
{ {
register int oldc=0; register int oldc=0;
@ -880,13 +872,12 @@ void hist_list(register History_t *hp,Sfio_t *outfile, off_t offset,int last, ch
} }
return; return;
} }
/* /*
* find index for last line with given string * find index for last line with given string
* If flag==0 then line must begin with string * If flag==0 then line must begin with string
* direction < 1 for backwards search * direction < 1 for backwards search
*/ */
Histloc_t hist_find(register History_t*hp,char *string,register int index1,int flag,int direction) Histloc_t hist_find(register History_t*hp,char *string,register int index1,int flag,int direction)
{ {
register int index2; register int index2;
@ -944,7 +935,6 @@ Histloc_t hist_find(register History_t*hp,char *string,register int index1,int f
* If coffset==0 then line must begin with string * If coffset==0 then line must begin with string
* returns the line number of the match if successful, otherwise -1 * returns the line number of the match if successful, otherwise -1
*/ */
int hist_match(register History_t *hp,off_t offset,char *string,int *coffset) int hist_match(register History_t *hp,off_t offset,char *string,int *coffset)
{ {
register unsigned char *first, *cp; register unsigned char *first, *cp;
@ -985,7 +975,6 @@ int hist_match(register History_t *hp,off_t offset,char *string,int *coffset)
* line < 0 for full command copy * line < 0 for full command copy
* -1 returned if there is no history file * -1 returned if there is no history file
*/ */
int hist_copy(char *s1,int size,int command,int line) int hist_copy(char *s1,int size,int command,int line)
{ {
register int c; register int c;
@ -1026,7 +1015,6 @@ int hist_copy(char *s1,int size,int command,int line)
/* /*
* return word number <word> from command number <command> * return word number <word> from command number <command>
*/ */
char *hist_word(char *string,int size,int word) char *hist_word(char *string,int size,int word)
{ {
register int c; register int c;
@ -1081,7 +1069,6 @@ char *hist_word(char *string,int size,int word)
* and number of lines back or forward, * and number of lines back or forward,
* compute the new command and line number. * compute the new command and line number.
*/ */
Histloc_t hist_locate(History_t *hp,register int command,register int line,int lines) Histloc_t hist_locate(History_t *hp,register int command,register int line,int lines)
{ {
Histloc_t next; Histloc_t next;

View file

@ -98,7 +98,6 @@ extern char* sh_setenviron(const char*);
#define SH_TYPE_KSH 002 #define SH_TYPE_KSH 002
#define SH_TYPE_POSIX 004 #define SH_TYPE_POSIX 004
#define SH_TYPE_LOGIN 010 #define SH_TYPE_LOGIN 010
#define SH_TYPE_PROFILE 020
#define SH_TYPE_RESTRICTED 040 #define SH_TYPE_RESTRICTED 040
#ifndef PIPE_BUF #ifndef PIPE_BUF

View file

@ -1734,7 +1734,7 @@ element stores the
.IR i\^ -th .IR i\^ -th
submatch. submatch.
For For
.B // .BR // ,
the array is two-dimensional, with the first subscript indicating the the array is two-dimensional, with the first subscript indicating the
most recent match and subpattern match, and the second subscript indicating most recent match and subpattern match, and the second subscript indicating
which match with which match with

View file

@ -511,7 +511,6 @@ static Sfdouble_t arith(const char **ptr, struct lval *lvalue, int type, Sfdoubl
} }
return(r); return(r);
} }
case MESSAGE: case MESSAGE:
sfsync(NIL(Sfio_t*)); sfsync(NIL(Sfio_t*));
if(lvalue->emode&ARITH_COMP) if(lvalue->emode&ARITH_COMP)
@ -527,7 +526,6 @@ static Sfdouble_t arith(const char **ptr, struct lval *lvalue, int type, Sfdoubl
* ptr is set to the last character processed * ptr is set to the last character processed
* if mode>0, an error will be fatal with value <mode> * if mode>0, an error will be fatal with value <mode>
*/ */
Sfdouble_t sh_strnum(register const char *str, char** ptr, int mode) Sfdouble_t sh_strnum(register const char *str, char** ptr, int mode)
{ {
register Sfdouble_t d; register Sfdouble_t d;

View file

@ -144,7 +144,6 @@ static int scantree(Dt_t *tree, const char *pattern, struct argnod **arghead)
* generate the list of files found by adding an suffix to end of name * generate the list of files found by adding an suffix to end of name
* The number of matches is returned * The number of matches is returned
*/ */
int path_complete(const char *name,register const char *suffix, struct argnod **arghead) int path_complete(const char *name,register const char *suffix, struct argnod **arghead)
{ {
sufstr = suffix; sufstr = suffix;

View file

@ -380,7 +380,6 @@ void sh_sigclear(register int sig)
/* /*
* check for traps * check for traps
*/ */
void sh_chktrap(void) void sh_chktrap(void)
{ {
register int sig=sh.st.trapmax; register int sig=sh.st.trapmax;
@ -606,7 +605,6 @@ static void array_notify(Namval_t *np, void *data)
/* /*
* This is the exit routine for the shell * This is the exit routine for the shell
*/ */
noreturn void sh_done(register int sig) noreturn void sh_done(register int sig)
{ {
register char *t; register char *t;

View file

@ -1192,7 +1192,7 @@ int sh_type(register const char *path)
continue; continue;
} }
} }
if (!(t & (SH_TYPE_PROFILE|SH_TYPE_RESTRICTED))) if (!(t & SH_TYPE_RESTRICTED))
{ {
if (*s == 'r') if (*s == 'r')
{ {
@ -1222,7 +1222,7 @@ int sh_type(register const char *path)
if (!isalnum(*s)) if (!isalnum(*s))
return t; return t;
} }
return t & ~(SH_TYPE_KSH|SH_TYPE_PROFILE|SH_TYPE_RESTRICTED); return t & ~(SH_TYPE_KSH|SH_TYPE_RESTRICTED);
} }
@ -1948,7 +1948,6 @@ static Init_t *nv_init(void)
/* /*
* initialize name-value pairs * initialize name-value pairs
*/ */
Dt_t *sh_inittree(const struct shtable2 *name_vals) Dt_t *sh_inittree(const struct shtable2 *name_vals)
{ {
register Namval_t *np; register Namval_t *np;
@ -2006,7 +2005,6 @@ Dt_t *sh_inittree(const struct shtable2 *name_vals)
* *
* Returns pointer to A__z env var from which to import attributes, or 0. * Returns pointer to A__z env var from which to import attributes, or 0.
*/ */
static char *env_init(void) static char *env_init(void)
{ {
register char *cp; register char *cp;

View file

@ -211,7 +211,6 @@ static int onintr(struct addrinfo*);
* return <protocol>/<host>/<service> fd * return <protocol>/<host>/<service> fd
* If called with flags==O_NONBLOCK return 1 if protocol is supported * If called with flags==O_NONBLOCK return 1 if protocol is supported
*/ */
static int static int
inetopen(const char* path, int flags) inetopen(const char* path, int flags)
{ {
@ -1927,7 +1926,7 @@ static ssize_t piperead(Sfio_t *iop,void *buff,register size_t size,Sfdisc_t *ha
errno = EINTR; errno = EINTR;
return(-1); return(-1);
} }
if(sh_isstate(SH_INTERACTIVE) && sffileno(iop)==0 && io_prompt(iop,sh.nextprompt)<0 && errno==EIO) if(sh_isstate(SH_INTERACTIVE) && fd==0 && io_prompt(iop,sh.nextprompt)<0 && errno==EIO)
return(0); return(0);
sh_onstate(SH_TTYWAIT); sh_onstate(SH_TTYWAIT);
if(!(sh.fdstatus[fd]&IOCLEX) && (sfset(iop,0,0)&SF_SHARE)) if(!(sh.fdstatus[fd]&IOCLEX) && (sfset(iop,0,0)&SF_SHARE))
@ -1983,7 +1982,7 @@ static ssize_t slowread(Sfio_t *iop,void *buff,register size_t size,Sfdisc_t *ha
return(0); return(0);
if(sh.timeout) if(sh.timeout)
timeout = (void*)sh_timeradd(sh_isstate(SH_GRACE)?1000L*TGRACE:1000L*sh.timeout,0,time_grace,&sh); timeout = (void*)sh_timeradd(sh_isstate(SH_GRACE)?1000L*TGRACE:1000L*sh.timeout,0,time_grace,&sh);
rsize = (*readf)(sh.ed_context, sffileno(iop), (char*)buff, size, reedit); rsize = (*readf)(sh.ed_context, fno, (char*)buff, size, reedit);
if(timeout) if(timeout)
timerdel(timeout); timerdel(timeout);
timeout=0; timeout=0;
@ -2040,7 +2039,6 @@ static ssize_t slowread(Sfio_t *iop,void *buff,register size_t size,Sfdisc_t *ha
/* /*
* check and return the attributes for a file descriptor * check and return the attributes for a file descriptor
*/ */
int sh_iocheckfd(register int fd) int sh_iocheckfd(register int fd)
{ {
register int flags, n; register int flags, n;
@ -2117,7 +2115,6 @@ int sh_iocheckfd(register int fd)
/* /*
* Display prompt PS<flag> on standard error * Display prompt PS<flag> on standard error
*/ */
static int io_prompt(Sfio_t *iop,register int flag) static int io_prompt(Sfio_t *iop,register int flag)
{ {
register char *cp; register char *cp;
@ -2319,7 +2316,6 @@ struct eval
/* /*
* Create a stream consisting of a space separated argv[] list * Create a stream consisting of a space separated argv[] list
*/ */
Sfio_t *sh_sfeval(register char *argv[]) Sfio_t *sh_sfeval(register char *argv[])
{ {
register Sfio_t *iop; register Sfio_t *iop;
@ -2345,7 +2341,6 @@ Sfio_t *sh_sfeval(register char *argv[])
/* /*
* This code gets called whenever an end of string is found with eval * This code gets called whenever an end of string is found with eval
*/ */
static int eval_exceptf(Sfio_t *iop,int type, void *data, Sfdisc_t *handle) static int eval_exceptf(Sfio_t *iop,int type, void *data, Sfdisc_t *handle)
{ {
register struct eval *ep = (struct eval*)handle; register struct eval *ep = (struct eval*)handle;
@ -2385,7 +2380,6 @@ static int eval_exceptf(Sfio_t *iop,int type, void *data, Sfdisc_t *handle)
* the stream <sp> starting at offset <offset> * the stream <sp> starting at offset <offset>
* The stream can be read with the normal stream operations * The stream can be read with the normal stream operations
*/ */
static Sfio_t *subopen(Sfio_t* sp, off_t offset, long size) static Sfio_t *subopen(Sfio_t* sp, off_t offset, long size)
{ {
register struct subfile *disp; register struct subfile *disp;
@ -2604,7 +2598,6 @@ mode_t sh_umask(mode_t m)
* <fd> must be a non-negative number ofr SH_IOCOPROCESS or SH_IOHISTFILE. * <fd> must be a non-negative number ofr SH_IOCOPROCESS or SH_IOHISTFILE.
* returns NULL on failure and may set errno. * returns NULL on failure and may set errno.
*/ */
Sfio_t *sh_iogetiop(int fd, int mode) Sfio_t *sh_iogetiop(int fd, int mode)
{ {
int n; int n;

View file

@ -794,7 +794,6 @@ static void job_reset(register struct process *pw)
/* /*
* wait built-in command * wait built-in command
*/ */
void job_bwait(char **jobs) void job_bwait(char **jobs)
{ {
register char *jp; register char *jp;
@ -826,7 +825,6 @@ void job_bwait(char **jobs)
/* /*
* execute function <fun> for each job * execute function <fun> for each job
*/ */
int job_walk(Sfio_t *file,int (*fun)(struct process*,int),int arg,char *joblist[]) int job_walk(Sfio_t *file,int (*fun)(struct process*,int),int arg,char *joblist[])
{ {
register struct process *pw; register struct process *pw;
@ -894,7 +892,6 @@ int job_walk(Sfio_t *file,int (*fun)(struct process*,int),int arg,char *joblist[
* flag JOB_NFLAG for list only jobs marked for notification * flag JOB_NFLAG for list only jobs marked for notification
* flag JOB_PFLAG for process ID(s) only * flag JOB_PFLAG for process ID(s) only
*/ */
int job_list(struct process *pw,register int flag) int job_list(struct process *pw,register int flag)
{ {
register struct process *px = pw; register struct process *px = pw;
@ -1002,7 +999,6 @@ static struct process *job_bystring(register char *ajob)
/* /*
* Kill a job or process * Kill a job or process
*/ */
int job_kill(register struct process *pw,register int sig) int job_kill(register struct process *pw,register int sig)
{ {
register pid_t pid; register pid_t pid;
@ -1127,7 +1123,6 @@ int job_hup(struct process *pw, int sig)
/* /*
* Get process structure from first letters of jobname * Get process structure from first letters of jobname
*/ */
static struct process *job_byname(char *name) static struct process *job_byname(char *name)
{ {
register struct process *pw = job.pwlist; register struct process *pw = job.pwlist;
@ -1163,7 +1158,6 @@ static struct process *job_byname(char *name)
/* /*
* Initialize the process posting array * Initialize the process posting array
*/ */
void job_clear(void) void job_clear(void)
{ {
register struct process *pw, *px; register struct process *pw, *px;
@ -1207,7 +1201,6 @@ void job_clear(void)
* put the process <pid> on the process list and return the job number * put the process <pid> on the process list and return the job number
* if non-zero, <join> is the process ID of the job to join * if non-zero, <join> is the process ID of the job to join
*/ */
int job_post(pid_t pid, pid_t join) int job_post(pid_t pid, pid_t join)
{ {
register struct process *pw; register struct process *pw;
@ -1332,7 +1325,6 @@ int job_post(pid_t pid, pid_t join)
/* /*
* Returns a process structure give a process ID * Returns a process structure give a process ID
*/ */
static struct process *job_bypid(pid_t pid) static struct process *job_bypid(pid_t pid)
{ {
register struct process *pw, *px; register struct process *pw, *px;
@ -1348,7 +1340,6 @@ static struct process *job_bypid(pid_t pid)
/* /*
* return a pointer to a job given the job ID * return a pointer to a job given the job ID
*/ */
static struct process *job_byjid(int jobid) static struct process *job_byjid(int jobid)
{ {
register struct process *pw; register struct process *pw;
@ -1388,7 +1379,6 @@ static void job_prmsg(register struct process *pw)
* pid=1 to wait for at least one process to complete * pid=1 to wait for at least one process to complete
* pid=-1 to wait for all running processes * pid=-1 to wait for all running processes
*/ */
int job_wait(register pid_t pid) int job_wait(register pid_t pid)
{ {
register struct process *pw=0,*px; register struct process *pw=0,*px;
@ -1588,7 +1578,6 @@ done:
* move job to background if bgflag == 'b' * move job to background if bgflag == 'b'
* disown job if bgflag == 'd' * disown job if bgflag == 'd'
*/ */
int job_switch(register struct process *pw,int bgflag) int job_switch(register struct process *pw,int bgflag)
{ {
register const char *msg; register const char *msg;
@ -1652,7 +1641,6 @@ int job_switch(register struct process *pw,int bgflag)
/* /*
* Set the foreground group associated with a job * Set the foreground group associated with a job
*/ */
static void job_fgrp(register struct process *pw, int newgrp) static void job_fgrp(register struct process *pw, int newgrp)
{ {
for(; pw; pw=pw->p_nxtproc) for(; pw; pw=pw->p_nxtproc)
@ -1662,7 +1650,6 @@ static void job_fgrp(register struct process *pw, int newgrp)
/* /*
* turn off STOP state of a process group and send CONT signals * turn off STOP state of a process group and send CONT signals
*/ */
static void job_unstop(register struct process *px) static void job_unstop(register struct process *px)
{ {
register struct process *pw; register struct process *pw;
@ -1691,7 +1678,6 @@ static void job_unstop(register struct process *px)
* pwlist is reset if the first job is removed * pwlist is reset if the first job is removed
* if <notify> is non-zero, then jobs with pending notifications are unposted * if <notify> is non-zero, then jobs with pending notifications are unposted
*/ */
static struct process *job_unpost(register struct process *pwtop,int notify) static struct process *job_unpost(register struct process *pwtop,int notify)
{ {
register struct process *pw; register struct process *pw;
@ -1769,7 +1755,6 @@ static void job_unlink(register struct process *pw)
* get an unused job number * get an unused job number
* freejobs is a bit vector, 0 is unused * freejobs is a bit vector, 0 is unused
*/ */
static int job_alloc(void) static int job_alloc(void)
{ {
register int j=0; register int j=0;
@ -1800,7 +1785,6 @@ static int job_alloc(void)
/* /*
* return a job number * return a job number
*/ */
static void job_free(register int n) static void job_free(register int n)
{ {
register int j = (--n)/CHAR_BIT; register int j = (--n)/CHAR_BIT;

View file

@ -1750,7 +1750,6 @@ void sh_lexskip(Lex_t *lp,int close, register int copy, int state)
* noted with the IOQUOTE flag * noted with the IOQUOTE flag
* returns 1 for complete here-doc, 0 for EOF * returns 1 for complete here-doc, 0 for EOF
*/ */
static int here_copy(Lex_t *lp,register struct ionod *iop) static int here_copy(Lex_t *lp,register struct ionod *iop)
{ {
register const char *state; register const char *state;
@ -2071,7 +2070,6 @@ static char *fmttoken(Lex_t *lp, register int sym)
/* /*
* print a bad syntax message * print a bad syntax message
*/ */
noreturn void sh_syntax(Lex_t *lp) noreturn void sh_syntax(Lex_t *lp)
{ {
register const char *cp = sh_translate(e_unexpected); register const char *cp = sh_translate(e_unexpected);

View file

@ -85,7 +85,6 @@ static char beenhere = 0;
* search for file and exfile() it if it exists * search for file and exfile() it if it exists
* 1 returned if file found, 0 otherwise * 1 returned if file found, 0 otherwise
*/ */
static int sh_source(Sfio_t *iop, const char *file) static int sh_source(Sfio_t *iop, const char *file)
{ {
char* oid; char* oid;
@ -373,7 +372,6 @@ int sh_main(int ac, char *av[], Shinit_f userinit)
* iop is not null when the input is a string * iop is not null when the input is a string
* fdin is the input file descriptor * fdin is the input file descriptor
*/ */
static void exfile(register Sfio_t *iop,register int fno) static void exfile(register Sfio_t *iop,register int fno)
{ {
time_t curtime; time_t curtime;

View file

@ -2338,7 +2338,6 @@ void sh_scope(struct argnod *envlist, int fun)
* of nnod. This includes any strings representing the value(s) of the * of nnod. This includes any strings representing the value(s) of the
* node, as well as its dope vector, if it is an array. * node, as well as its dope vector, if it is an array.
*/ */
void sh_envnolocal (register Namval_t *np, void *data) void sh_envnolocal (register Namval_t *np, void *data)
{ {
char *cp = 0, was_export = nv_isattr(np,NV_EXPORT)!=0; char *cp = 0, was_export = nv_isattr(np,NV_EXPORT)!=0;
@ -2695,7 +2694,6 @@ void sh_optclear(void *old)
* *
* If <np> has no value, 0 is returned. * If <np> has no value, 0 is returned.
*/ */
char *nv_getval(register Namval_t *np) char *nv_getval(register Namval_t *np)
{ {
register union Value *up= &np->nvalue; register union Value *up= &np->nvalue;

View file

@ -376,7 +376,6 @@ static Shnode_t *makelist(Lex_t *lexp, int type, Shnode_t *l, Shnode_t *r)
* entry to shell parser * entry to shell parser
* Flag can be the union of SH_EOF|SH_NL * Flag can be the union of SH_EOF|SH_NL
*/ */
void *sh_parse(Sfio_t *iop, int flag) void *sh_parse(Sfio_t *iop, int flag)
{ {
register Shnode_t *t; register Shnode_t *t;
@ -507,7 +506,6 @@ Shnode_t *sh_dolparen(Lex_t* lp)
/* /*
* remove temporary files and stacks * remove temporary files and stacks
*/ */
void sh_freeup(void) void sh_freeup(void)
{ {
if(sh.st.staklist) if(sh.st.staklist)
@ -520,7 +518,6 @@ void sh_freeup(void)
* decrease reference count for each stack in function list when flag<=0 * decrease reference count for each stack in function list when flag<=0
* stack is freed when reference count is zero * stack is freed when reference count is zero
*/ */
void sh_funstaks(register struct slnod *slp,int flag) void sh_funstaks(register struct slnod *slp,int flag)
{ {
register struct slnod *slpold; register struct slnod *slpold;
@ -542,7 +539,6 @@ void sh_funstaks(register struct slnod *slp,int flag)
* list & [ cmd ] * list & [ cmd ]
* list [ ; cmd ] * list [ ; cmd ]
*/ */
static Shnode_t *sh_cmd(Lex_t *lexp, register int sym, int flag) static Shnode_t *sh_cmd(Lex_t *lexp, register int sym, int flag)
{ {
register Shnode_t *left, *right; register Shnode_t *left, *right;
@ -1199,7 +1195,6 @@ static struct argnod *assign(Lex_t *lexp, register struct argnod *ap, int type)
* case ... in ... esac * case ... in ... esac
* begin ... end * begin ... end
*/ */
static Shnode_t *item(Lex_t *lexp,int flag) static Shnode_t *item(Lex_t *lexp,int flag)
{ {
register Shnode_t *t; register Shnode_t *t;
@ -1896,7 +1891,6 @@ static struct ionod *inout(Lex_t *lexp,struct ionod *lastio,int flag)
/* /*
* convert argument chain to argument list when no special arguments * convert argument chain to argument list when no special arguments
*/ */
static struct argnod *qscan(struct comnod *ac,int argn) static struct argnod *qscan(struct comnod *ac,int argn)
{ {
register char **cp; register char **cp;

View file

@ -482,7 +482,6 @@ int path_open(const char *name, register Pathcomp_t *pp)
/* /*
* given a pathname return the base name * given a pathname return the base name
*/ */
char *path_basename(register const char *name) char *path_basename(register const char *name)
{ {
register const char *start = name; register const char *start = name;
@ -612,7 +611,6 @@ static void funload(int fno, const char *name)
* if the matching $PATH entry is '.' or empty, the simple name is written without prefixing the PWD * if the matching $PATH entry is '.' or empty, the simple name is written without prefixing the PWD
* - nothing executable was found * - nothing executable was found
*/ */
int path_search(register const char *name,Pathcomp_t **oldpp, int flag) int path_search(register const char *name,Pathcomp_t **oldpp, int flag)
{ {
register Namval_t *np; register Namval_t *np;
@ -927,7 +925,6 @@ err:
/* /*
* Return path relative to present working directory * Return path relative to present working directory
*/ */
char *path_relative(register const char* file) char *path_relative(register const char* file)
{ {
register const char *pwd; register const char *pwd;
@ -1269,7 +1266,6 @@ pid_t path_spawn(const char *opath,register char **argv, char **envp, Pathcomp_t
* File is executable but not machine code. * File is executable but not machine code.
* Assume file is a shell script and execute it. * Assume file is a shell script and execute it.
*/ */
static noreturn void exscript(register char *path,register char *argv[],char **envp) static noreturn void exscript(register char *path,register char *argv[],char **envp)
{ {
register Sfio_t *sp; register Sfio_t *sp;
@ -1387,8 +1383,8 @@ static noreturn void exscript(register char *path,register char *argv[],char **e
SHACCT = getenv("SHACCT"); SHACCT = getenv("SHACCT");
} }
/* /*
* suspend accounting until turned on by sh_accbegin() * suspend accounting until turned on by sh_accbegin()
*/ */
void sh_accsusp(void) void sh_accsusp(void)
{ {
shaccton=0; shaccton=0;
@ -1459,8 +1455,6 @@ static noreturn void exscript(register char *path,register char *argv[],char **e
} }
#endif /* SHOPT_ACCT */ #endif /* SHOPT_ACCT */
/* /*
* add a path component to the path search list and eliminate duplicates * add a path component to the path search list and eliminate duplicates
* and non-existing absolute paths. * and non-existing absolute paths.

View file

@ -564,7 +564,6 @@ static int gettok(register struct vars *vp)
/* /*
* evaluate a subexpression with precedence * evaluate a subexpression with precedence
*/ */
static int expr(register struct vars *vp,register int precedence) static int expr(register struct vars *vp,register int precedence)
{ {
register int c, op; register int c, op;
@ -943,7 +942,6 @@ Arith_t *arith_compile(const char *string,char **last,Sfdouble_t(*fun)(const cha
* *
* NOTE: (*convert)() may call arith_strval() * NOTE: (*convert)() may call arith_strval()
*/ */
Sfdouble_t arith_strval(const char *s, char **end, Sfdouble_t(*convert)(const char**,struct lval*,int,Sfdouble_t), int emode) Sfdouble_t arith_strval(const char *s, char **end, Sfdouble_t(*convert)(const char**,struct lval*,int,Sfdouble_t), int emode)
{ {
Arith_t *ep; Arith_t *ep;

View file

@ -45,7 +45,6 @@
* <table> is searched for string <sp> and corresponding value is returned * <table> is searched for string <sp> and corresponding value is returned
* This is only used for small tables and is used to save non-shareable memory * This is only used for small tables and is used to save non-shareable memory
*/ */
const Shtable_t *sh_locate(register const char *sp,const Shtable_t *table,int size) const Shtable_t *sh_locate(register const char *sp,const Shtable_t *table,int size)
{ {
register int first; register int first;
@ -230,7 +229,6 @@ found:
* TRIM(sp) * TRIM(sp)
* Remove escape characters from characters in <sp> and eliminate quoted nulls. * Remove escape characters from characters in <sp> and eliminate quoted nulls.
*/ */
void sh_trim(register char *sp) void sh_trim(register char *sp)
/*@ /*@
assume sp!=NULL; assume sp!=NULL;
@ -267,7 +265,6 @@ void sh_trim(register char *sp)
* <str2> must be big enough to hold <str1> * <str2> must be big enough to hold <str1>
* <str1> and <str2> may point to the same place. * <str1> and <str2> may point to the same place.
*/ */
void sh_utol(register char const *str1,register char *str2) void sh_utol(register char const *str1,register char *str2)
/*@ /*@
assume str1!=0 && str2!=0 assume str1!=0 && str2!=0

View file

@ -471,7 +471,6 @@ void sh_subjobcheck(pid_t pid)
* If comsub is not null, the return value will be a stream consisting of * If comsub is not null, the return value will be a stream consisting of
* output of command <t>. Otherwise, NULL will be returned. * output of command <t>. Otherwise, NULL will be returned.
*/ */
Sfio_t *sh_subshell(Shnode_t *t, volatile int flags, int comsub) Sfio_t *sh_subshell(Shnode_t *t, volatile int flags, int comsub)
{ {
struct subshell sub_data; struct subshell sub_data;

View file

@ -258,7 +258,6 @@ exec:
/* /*
* return true if shell ends in sh or ksh * return true if shell ends in sh or ksh
*/ */
static int endsh(register const char *shell) static int endsh(register const char *shell)
{ {
while(*shell) while(*shell)
@ -276,7 +275,6 @@ static int endsh(register const char *shell)
/* /*
* return true if shell is in <dir> directory * return true if shell is in <dir> directory
*/ */
static int in_dir(register const char *dir,register const char *shell) static int in_dir(register const char *dir,register const char *shell)
{ {
while(*dir) while(*dir)
@ -298,7 +296,6 @@ static void error_exit(const char *message)
/* /*
* This version of access checks against effective UID and effective GID * This version of access checks against effective UID and effective GID
*/ */
int eaccess(register const char *name, register int mode) int eaccess(register const char *name, register int mode)
{ {
struct stat statb; struct stat statb;
@ -374,7 +371,6 @@ static void setids(int mode,int owner,int group)
* Finally, the clone is exec'd. This file is unlinked by a grandchild * Finally, the clone is exec'd. This file is unlinked by a grandchild
* of this program, who waits around until the text is free. * of this program, who waits around until the text is free.
*/ */
static void setids(int mode,uid_t owner,gid_t group) static void setids(int mode,uid_t owner,gid_t group)
{ {
register int n,m; register int n,m;
@ -485,7 +481,6 @@ static void setids(int mode,uid_t owner,gid_t group)
/* /*
* create a unique name into the <template> * create a unique name into the <template>
*/ */
static void maketemp(char *template) static void maketemp(char *template)
{ {
register char *cp = template; register char *cp = template;
@ -503,7 +498,6 @@ static void maketemp(char *template)
/* /*
* copy THISPROG into the open file number <fdo> and close <fdo> * copy THISPROG into the open file number <fdo> and close <fdo>
*/ */
static int mycopy(int fdi, int fdo) static int mycopy(int fdi, int fdo)
{ {
char buffer[BLKSIZE]; char buffer[BLKSIZE];

View file

@ -26,8 +26,6 @@
* waiting for job completion. * waiting for job completion.
* The previous waitevent hook function is returned * The previous waitevent hook function is returned
*/ */
void *sh_waitnotify(int(*newevent)(int,long,int)) void *sh_waitnotify(int(*newevent)(int,long,int))
{ {
int (*old)(int,long,int); int (*old)(int,long,int);

View file

@ -2802,7 +2802,6 @@ int sh_run(int argn, char *argv[])
/* /*
* print out the command line if set -x is on * print out the command line if set -x is on
*/ */
int sh_trace(register char *argv[], register int nl) int sh_trace(register char *argv[], register int nl)
{ {
if(sh_isoption(SH_XTRACE)) if(sh_isoption(SH_XTRACE))
@ -2867,7 +2866,6 @@ int sh_trace(register char *argv[], register int nl)
* Traps are reset by the child * Traps are reset by the child
* The process-id of the child is returned to the parent, 0 to the child. * The process-id of the child is returned to the parent, 0 to the child.
*/ */
static void timed_out(void *handle) static void timed_out(void *handle)
{ {
NOT_USED(handle); NOT_USED(handle);

View file

@ -499,6 +499,10 @@ export foo
# ====== # ======
# unset exported readonly variables, combined with all other possible attributes # unset exported readonly variables, combined with all other possible attributes
(
### begin subshell
ulimit -t unlimited 2>/dev/null # run in forked subshell to be crash-proof
Errors=0
typeset -A expect=( typeset -A expect=(
[a]='typeset -x -r -a foo' [a]='typeset -x -r -a foo'
[b]='typeset -x -r -b foo' [b]='typeset -x -r -b foo'
@ -552,7 +556,13 @@ do unset foo
"expected $(printf %q "${expect[$flag]}"), got $(printf %q "$actual")" "expected $(printf %q "${expect[$flag]}"), got $(printf %q "$actual")"
fi fi
done done
unset expect exit "$Errors"
### end subshell
)
if let "(e=$?) > 128"
then err_exit "typeset -x -r test crashed with SIG$(kill -l "$e")"
else let "Errors += e"
fi
unset base unset base
for base in 0 1 65 for base in 0 1 65
@ -592,6 +602,10 @@ got=$(< $tmpfile)
# Combining -u with -F or -E caused an incorrect variable type # Combining -u with -F or -E caused an incorrect variable type
# https://github.com/ksh93/ksh/pull/163 # https://github.com/ksh93/ksh/pull/163
# Allow the last numeric type to win out # Allow the last numeric type to win out
(
### begin subshell
ulimit -t unlimited 2>/dev/null # run in forked subshell to be crash-proof
Errors=0
typeset -A expect=( typeset -A expect=(
[uF]='typeset -F a=2.0000000000' [uF]='typeset -F a=2.0000000000'
[Fu]='typeset -F a=2.0000000000' [Fu]='typeset -F a=2.0000000000'
@ -632,6 +646,14 @@ unset expect
[[ $(typeset -iX12 -s a=2; typeset -p a) == 'typeset -X 12 a=0x1.000000000000p+1' ]] || err_exit "typeset -iX12 -s failed to become typeset -X 12 a=0x1.000000000000p+1." [[ $(typeset -iX12 -s a=2; typeset -p a) == 'typeset -X 12 a=0x1.000000000000p+1' ]] || err_exit "typeset -iX12 -s failed to become typeset -X 12 a=0x1.000000000000p+1."
exit "$Errors"
### end subshell
)
if let "(e=$?) > 128"
then err_exit "typeset int+float test crashed with SIG$(kill -l "$e")"
else let "Errors += e"
fi
# ====== # ======
# Bug introduced in 0e4c4d61: could not alter the size of an existing justified string attribute # Bug introduced in 0e4c4d61: could not alter the size of an existing justified string attribute
# https://github.com/ksh93/ksh/issues/142#issuecomment-780931533 # https://github.com/ksh93/ksh/issues/142#issuecomment-780931533

View file

@ -867,6 +867,7 @@ PATH=$save_PATH
# ====== # ======
# These are the regression tests for the whence builtin's '-t' flag # These are the regression tests for the whence builtin's '-t' flag
((.sh.version >= 20211227)) &&
for w in 'whence -t' 'type -t' 'whence -t -v'; do for w in 'whence -t' 'type -t' 'whence -t -v'; do
exp=file exp=file
got=$($w $SHELL) got=$($w $SHELL)
@ -1428,6 +1429,7 @@ got="$($SHELL -i "$hist_error_leak" 2>&1)"
# ====== # ======
# printf -v works as of 2021-11-18 # printf -v works as of 2021-11-18
((.sh.version >= 20211118)) && {
integer ver=.sh.version integer ver=.sh.version
exp=ok$'\f'0000$ver$'\n' exp=ok$'\f'0000$ver$'\n'
printf -v got 'ok\f%012d\n' $ver 2>/dev/null printf -v got 'ok\f%012d\n' $ver 2>/dev/null
@ -1438,6 +1440,7 @@ printf -v 'got[1][two][3]' 'ok\f%012d\n' $ver 2>/dev/null
[[ ${got[1]["two"][3]} == "$exp" ]] || err_exit "printf -v not working with array subscripts" \ [[ ${got[1]["two"][3]} == "$exp" ]] || err_exit "printf -v not working with array subscripts" \
"(expected $(printf %q "$exp"), got $(printf %q "$got"))" "(expected $(printf %q "$exp"), got $(printf %q "$got"))"
unset got ver unset got ver
}
# ====== # ======
# The rm builtin's -d option should remove files and empty directories without # The rm builtin's -d option should remove files and empty directories without
@ -1491,45 +1494,63 @@ fi
# ====== # ======
# These are regression tests for the cd command's -e and -P flags # These are regression tests for the cd command's -e and -P flags
mkdir -p "$tmp/failpwd" mkdir -p "$tmp/failpwd"
ln -s "$tmp/failpwd" "$tmp/failpwd1" cd "$tmp/failpwd"
cd "$tmp/failpwd1" "$SHELL" -c 'cd /; exec rmdir "$1"' x "$tmp/failpwd"
rm ../failpwd1
cd -P . cd -P .
got=$?; exp=0 got=$?; exp=0
(( got == exp )) || err_exit "cd -P without -e exits with error status if \$PWD doesn't exist (expected $exp, got $got)" (( got == exp )) || err_exit "cd -P without -e exits with error status if \$PWD doesn't exist (expected $exp, got $got)"
cd -eP . if ((.sh.version >= 20211205))
got=$?; exp=1 then
(( got == exp )) || err_exit "cd -eP doesn't fail if \$PWD doesn't exist (expected $exp, got $got)" cd -eP .
got=$?; exp=1
(( got == exp )) || err_exit "cd -eP doesn't fail if \$PWD doesn't exist (expected $exp, got $got)"
fi
cd "$tmp" cd "$tmp"
cd -P "$tmp/notadir" >/dev/null 2>&1 cd -P "$tmp/notadir" >/dev/null 2>&1
got=$?; exp=1 got=$?; exp=1
(( got == exp )) || err_exit "cd -P without -e fails with wrong exit status on nonexistent dir (expected $exp, got $got)" (( got == exp )) || err_exit "cd -P without -e fails with wrong exit status on nonexistent dir (expected $exp, got $got)"
cd -eP "$tmp/notadir" >/dev/null 2>&1 if ((.sh.version >= 20211205))
got=$?; exp=2 then
(( got == exp )) || err_exit "cd -eP fails with wrong exit status on nonexistent dir (expected $exp, got $got)" cd -eP "$tmp/notadir" >/dev/null 2>&1
got=$?; exp=2
(( got == exp )) || err_exit "cd -eP fails with wrong exit status on nonexistent dir (expected $exp, got $got)"
fi
OLDPWD="$tmp/baddir" OLDPWD="$tmp/baddir"
cd -P - >/dev/null 2>&1 cd -P - >/dev/null 2>&1
got=$?; exp=1 got=$?; exp=1
(( got == exp )) || err_exit "cd -P without -e fails with wrong exit status on \$OLDPWD (expected $exp, got $got)" (( got == exp )) || err_exit "cd -P without -e fails with wrong exit status on \$OLDPWD (expected $exp, got $got)"
cd -eP - >/dev/null 2>&1 if ((.sh.version >= 20211205))
got=$?; exp=2 then
(( got == exp )) || err_exit "cd -eP fails with wrong exit status on \$OLDPWD (expected $exp, got $got)" cd -eP - >/dev/null 2>&1
got=$?; exp=2
(( got == exp )) || err_exit "cd -eP fails with wrong exit status on \$OLDPWD (expected $exp, got $got)"
fi
cd "$tmp" || err_exit "couldn't change directory from nonexistent dir" cd "$tmp" || err_exit "couldn't change directory from nonexistent dir"
(set -o restricted; cd -P /) >/dev/null 2>&1 (set -o restricted; cd -P /) >/dev/null 2>&1
got=$?; exp=1 got=$?; exp=1
(( got == exp )) || err_exit "cd -P in restricted shell has wrong exit status (expected $exp, got $got)" (( got == exp )) || err_exit "cd -P in restricted shell has wrong exit status (expected $exp, got $got)"
(set -o restricted; cd -eP /) >/dev/null 2>&1 if ((.sh.version >= 20211205))
got=$?; exp=2 then
(( got == exp )) || err_exit "cd -eP in restricted shell has wrong exit status (expected $exp, got $got)" (set -o restricted; cd -eP /) >/dev/null 2>&1
(set -o restricted; cd -?) >/dev/null 2>&1 got=$?; exp=2
(( got == exp )) || err_exit "cd -eP in restricted shell has wrong exit status (expected $exp, got $got)"
fi
(set -o restricted; cd -\?) >/dev/null 2>&1
got=$?; exp=1 got=$?; exp=1
(( got == exp )) || err_exit "cd -? shows usage info in restricted shell and has wrong exit status (expected $exp, got $got)" (( got == exp )) || err_exit "cd -\\? shows usage info in restricted shell and has wrong exit status (expected $exp, got $got)"
(cd -P '') >/dev/null 2>&1 (cd -P '') >/dev/null 2>&1
got=$?; exp=1 got=$?; exp=1
(( got == exp )) || err_exit "cd -P to empty string has wrong exit status (expected $exp, got $got)" (( got == exp )) || err_exit "cd -P to empty string has wrong exit status (expected $exp, got $got)"
(cd -eP '') >/dev/null 2>&1 if ((.sh.version >= 20211205))
got=$?; exp=2 then
(( got == exp )) || err_exit "cd -eP to empty string has wrong exit status (expected $exp, got $got)" (cd -eP '') >/dev/null 2>&1
got=$?; exp=2
(( got == exp )) || err_exit "cd -eP to empty string has wrong exit status (expected $exp, got $got)"
fi
# ====== # ======
# The head and tail builtins should work on files without newlines # The head and tail builtins should work on files without newlines

View file

@ -22,8 +22,7 @@
. "${SHTESTS_COMMON:-${0%/*}/_common}" . "${SHTESTS_COMMON:-${0%/*}/_common}"
# regression tests for compound variables # regression tests for compound variables
Command=${0##*/}
integer Errors=0
Point=( Point=(
float x=1. y=0. float x=1. y=0.
) )

View file

@ -22,10 +22,7 @@
. "${SHTESTS_COMMON:-${0%/*}/_common}" . "${SHTESTS_COMMON:-${0%/*}/_common}"
# "nounset" disabled for now typeset -is HAVE_signbit=0
#set -o nounset
Command=${0##*/}
integer Errors=0 HAVE_signbit=0
if typeset -f .sh.math.signbit >/dev/null && (( signbit(-NaN) )) if typeset -f .sh.math.signbit >/dev/null && (( signbit(-NaN) ))
then HAVE_signbit=1 then HAVE_signbit=1

View file

@ -954,6 +954,7 @@ got=$(
[[ $got == 'test' ]] || err_exit "issue 161 hypothetical bug 2" \ [[ $got == 'test' ]] || err_exit "issue 161 hypothetical bug 2" \
"(expected 'test', got $(printf %q "$got"))" "(expected 'test', got $(printf %q "$got"))"
got=$( got=$(
set +x
exec 4>&1 exec 4>&1
foo=${ { redirect 4>&1; } 6<&2 4<&-; } foo=${ { redirect 4>&1; } 6<&2 4<&-; }
echo "test" >&4 # => 4: cannot open [Bad file descriptor] echo "test" >&4 # => 4: cannot open [Bad file descriptor]

File diff suppressed because it is too large Load diff

View file

@ -94,7 +94,7 @@ static ssize_t filterread(Sfio_t* f, /* stream reading from */
} }
static ssize_t filterwrite(Sfio_t* f, /* stream writing to */ static ssize_t filterwrite(Sfio_t* f, /* stream writing to */
void* buf, /* buffer to write into */ const void* buf, /* buffer to write into */
size_t n, /* number of bytes requested */ size_t n, /* number of bytes requested */
Sfdisc_t* disc) /* discipline */ Sfdisc_t* disc) /* discipline */
{ {

View file

@ -39,7 +39,7 @@ typedef struct _skable_s
} Seek_t; } Seek_t;
static ssize_t skwrite(Sfio_t* f, /* stream involved */ static ssize_t skwrite(Sfio_t* f, /* stream involved */
void* buf, /* buffer to read into */ const void* buf, /* buffer to read into */
size_t n, /* number of bytes to read */ size_t n, /* number of bytes to read */
Sfdisc_t* disc) /* discipline */ Sfdisc_t* disc) /* discipline */
{ {

View file

@ -429,7 +429,7 @@ make install
exec - ${PACKAGEROOT}/src/lib/libcmd/cmdinit.c ${PACKAGEROOT}/src/lib/libcmd/basename.c ${PACKAGEROOT}/src/lib/libcmd/cat.c ${PACKAGEROOT}/src/lib/libcmd/chgrp.c ${PACKAGEROOT}/src/lib/libcmd/chmod.c ${PACKAGEROOT}/src/lib/libcmd/chown.c ${PACKAGEROOT}/src/lib/libcmd/cksum.c ${PACKAGEROOT}/src/lib/libcmd/cmp.c ${PACKAGEROOT}/src/lib/libcmd/comm.c ${PACKAGEROOT}/src/lib/libcmd/cp.c ${PACKAGEROOT}/src/lib/libcmd/cut.c ${PACKAGEROOT}/src/lib/libcmd/dirname.c ${PACKAGEROOT}/src/lib/libcmd/date.c ${PACKAGEROOT}/src/lib/libcmd/expr.c ${PACKAGEROOT}/src/lib/libcmd/fds.c ${PACKAGEROOT}/src/lib/libcmd/fmt.c ${PACKAGEROOT}/src/lib/libcmd/fold.c ${PACKAGEROOT}/src/lib/libcmd/getconf.c ${PACKAGEROOT}/src/lib/libcmd/head.c ${PACKAGEROOT}/src/lib/libcmd/id.c ${PACKAGEROOT}/src/lib/libcmd/join.c ${PACKAGEROOT}/src/lib/libcmd/ln.c ${PACKAGEROOT}/src/lib/libcmd/logname.c ${PACKAGEROOT}/src/lib/libcmd/md5sum.c ${PACKAGEROOT}/src/lib/libcmd/mkdir.c ${PACKAGEROOT}/src/lib/libcmd/mkfifo.c ${PACKAGEROOT}/src/lib/libcmd/mktemp.c ${PACKAGEROOT}/src/lib/libcmd/mv.c ${PACKAGEROOT}/src/lib/libcmd/paste.c ${PACKAGEROOT}/src/lib/libcmd/pathchk.c ${PACKAGEROOT}/src/lib/libcmd/pids.c ${PACKAGEROOT}/src/lib/libcmd/rev.c ${PACKAGEROOT}/src/lib/libcmd/rm.c ${PACKAGEROOT}/src/lib/libcmd/rmdir.c ${PACKAGEROOT}/src/lib/libcmd/stty.c ${PACKAGEROOT}/src/lib/libcmd/sum.c ${PACKAGEROOT}/src/lib/libcmd/sync.c ${PACKAGEROOT}/src/lib/libcmd/tail.c ${PACKAGEROOT}/src/lib/libcmd/tee.c ${PACKAGEROOT}/src/lib/libcmd/tty.c ${PACKAGEROOT}/src/lib/libcmd/uname.c ${PACKAGEROOT}/src/lib/libcmd/uniq.c ${PACKAGEROOT}/src/lib/libcmd/vmstate.c ${PACKAGEROOT}/src/lib/libcmd/wc.c ${PACKAGEROOT}/src/lib/libcmd/revlib.c ${PACKAGEROOT}/src/lib/libcmd/wclib.c ${PACKAGEROOT}/src/lib/libcmd/lib.c | exec - ${PACKAGEROOT}/src/lib/libcmd/cmdinit.c ${PACKAGEROOT}/src/lib/libcmd/basename.c ${PACKAGEROOT}/src/lib/libcmd/cat.c ${PACKAGEROOT}/src/lib/libcmd/chgrp.c ${PACKAGEROOT}/src/lib/libcmd/chmod.c ${PACKAGEROOT}/src/lib/libcmd/chown.c ${PACKAGEROOT}/src/lib/libcmd/cksum.c ${PACKAGEROOT}/src/lib/libcmd/cmp.c ${PACKAGEROOT}/src/lib/libcmd/comm.c ${PACKAGEROOT}/src/lib/libcmd/cp.c ${PACKAGEROOT}/src/lib/libcmd/cut.c ${PACKAGEROOT}/src/lib/libcmd/dirname.c ${PACKAGEROOT}/src/lib/libcmd/date.c ${PACKAGEROOT}/src/lib/libcmd/expr.c ${PACKAGEROOT}/src/lib/libcmd/fds.c ${PACKAGEROOT}/src/lib/libcmd/fmt.c ${PACKAGEROOT}/src/lib/libcmd/fold.c ${PACKAGEROOT}/src/lib/libcmd/getconf.c ${PACKAGEROOT}/src/lib/libcmd/head.c ${PACKAGEROOT}/src/lib/libcmd/id.c ${PACKAGEROOT}/src/lib/libcmd/join.c ${PACKAGEROOT}/src/lib/libcmd/ln.c ${PACKAGEROOT}/src/lib/libcmd/logname.c ${PACKAGEROOT}/src/lib/libcmd/md5sum.c ${PACKAGEROOT}/src/lib/libcmd/mkdir.c ${PACKAGEROOT}/src/lib/libcmd/mkfifo.c ${PACKAGEROOT}/src/lib/libcmd/mktemp.c ${PACKAGEROOT}/src/lib/libcmd/mv.c ${PACKAGEROOT}/src/lib/libcmd/paste.c ${PACKAGEROOT}/src/lib/libcmd/pathchk.c ${PACKAGEROOT}/src/lib/libcmd/pids.c ${PACKAGEROOT}/src/lib/libcmd/rev.c ${PACKAGEROOT}/src/lib/libcmd/rm.c ${PACKAGEROOT}/src/lib/libcmd/rmdir.c ${PACKAGEROOT}/src/lib/libcmd/stty.c ${PACKAGEROOT}/src/lib/libcmd/sum.c ${PACKAGEROOT}/src/lib/libcmd/sync.c ${PACKAGEROOT}/src/lib/libcmd/tail.c ${PACKAGEROOT}/src/lib/libcmd/tee.c ${PACKAGEROOT}/src/lib/libcmd/tty.c ${PACKAGEROOT}/src/lib/libcmd/uname.c ${PACKAGEROOT}/src/lib/libcmd/uniq.c ${PACKAGEROOT}/src/lib/libcmd/vmstate.c ${PACKAGEROOT}/src/lib/libcmd/wc.c ${PACKAGEROOT}/src/lib/libcmd/revlib.c ${PACKAGEROOT}/src/lib/libcmd/wclib.c ${PACKAGEROOT}/src/lib/libcmd/lib.c |
exec - sort -u exec - sort -u
exec - } > 1.${COTEMP}.h exec - } > 1.${COTEMP}.h
exec - if cmp 2>/dev/null -s 1.${COTEMP}.h cmdext.h exec - if cmp -s 1.${COTEMP}.h cmdext.h
exec - then rm -f 1.${COTEMP}.h exec - then rm -f 1.${COTEMP}.h
exec - else mv 1.${COTEMP}.h cmdext.h exec - else mv 1.${COTEMP}.h cmdext.h
exec - fi exec - fi
@ -762,16 +762,14 @@ make install
make ${PACKAGE_ast_INCLUDE}/cmd.h make ${PACKAGE_ast_INCLUDE}/cmd.h
prev ${PACKAGE_ast_INCLUDE} prev ${PACKAGE_ast_INCLUDE}
prev cmd.h prev cmd.h
exec - if cmp 2>/dev/null -s cmd.h ${PACKAGE_ast_INCLUDE}/cmd.h exec - if ! cmp -s cmd.h ${PACKAGE_ast_INCLUDE}/cmd.h
exec - then : exec - then ${STDCP} cmd.h ${PACKAGE_ast_INCLUDE}/cmd.h
exec - else ${STDCP} cmd.h ${PACKAGE_ast_INCLUDE}/cmd.h
exec - fi exec - fi
done ${PACKAGE_ast_INCLUDE}/cmd.h generated done ${PACKAGE_ast_INCLUDE}/cmd.h generated
make ${PACKAGE_ast_INCLUDE}/cmdext.h make ${PACKAGE_ast_INCLUDE}/cmdext.h
prev cmdext.h prev cmdext.h
exec - if cmp 2>/dev/null -s cmdext.h ${PACKAGE_ast_INCLUDE}/cmdext.h exec - if ! cmp -s cmdext.h ${PACKAGE_ast_INCLUDE}/cmdext.h
exec - then : exec - then ${STDCP} cmdext.h ${PACKAGE_ast_INCLUDE}/cmdext.h
exec - else ${STDCP} cmdext.h ${PACKAGE_ast_INCLUDE}/cmdext.h
exec - fi exec - fi
done ${PACKAGE_ast_INCLUDE}/cmdext.h generated done ${PACKAGE_ast_INCLUDE}/cmdext.h generated
make ${PACKAGE_ast_INCLUDE}/cmdlist.h make ${PACKAGE_ast_INCLUDE}/cmdlist.h
@ -838,14 +836,13 @@ make install
exec - | exec - |
exec - sort -u exec - sort -u
exec - } > 1.${COTEMP}.h exec - } > 1.${COTEMP}.h
exec - if cmp 2>/dev/null -s 1.${COTEMP}.h cmdlist.h exec - if cmp -s 1.${COTEMP}.h cmdlist.h
exec - then rm -f 1.${COTEMP}.h exec - then rm -f 1.${COTEMP}.h
exec - else mv 1.${COTEMP}.h cmdlist.h exec - else mv 1.${COTEMP}.h cmdlist.h
exec - fi exec - fi
done cmdlist.h generated done cmdlist.h generated
exec - if cmp 2>/dev/null -s cmdlist.h ${PACKAGE_ast_INCLUDE}/cmdlist.h exec - if ! cmp -s cmdlist.h ${PACKAGE_ast_INCLUDE}/cmdlist.h
exec - then : exec - then ${STDCP} cmdlist.h ${PACKAGE_ast_INCLUDE}/cmdlist.h
exec - else ${STDCP} cmdlist.h ${PACKAGE_ast_INCLUDE}/cmdlist.h
exec - fi exec - fi
done ${PACKAGE_ast_INCLUDE}/cmdlist.h generated done ${PACKAGE_ast_INCLUDE}/cmdlist.h generated
done install virtual done install virtual

View file

@ -24,7 +24,9 @@
#include <vmalloc.h> #include <vmalloc.h>
#include <sfdisc.h> #include <sfdisc.h>
#if !_std_malloc /* do not pointlessly compile this if vmalloc is disabled */ #if _std_malloc /* do not pointlessly compile this if vmalloc is disabled */
void _STUB_vmstate(){}
#else
#define FORMAT "region=%(region)p method=%(method)s flags=%(flags)s size=%(size)d segments=%(segments)d busy=(%(busy_size)d,%(busy_blocks)d,%(busy_max)d) free=(%(free_size)d,%(free_blocks)d,%(free_max)d)" #define FORMAT "region=%(region)p method=%(method)s flags=%(flags)s size=%(size)d segments=%(segments)d busy=(%(busy_size)d,%(busy_blocks)d,%(busy_max)d) free=(%(free_size)d,%(free_blocks)d,%(free_max)d)"

View file

@ -146,7 +146,7 @@ make install
bind -last bind -last
exec - iffe ${IFFEFLAGS} -v -c "${CC} ${mam_cc_FLAGS} ${KSH_RELFLAGS} ${CCFLAGS} ${LDFLAGS}" ref ${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} -I${INSTALLROOT}/include ${mam_libdl} ${mam_libast} : run features/dll exec - iffe ${IFFEFLAGS} -v -c "${CC} ${mam_cc_FLAGS} ${KSH_RELFLAGS} ${CCFLAGS} ${LDFLAGS}" ref ${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} -I${INSTALLROOT}/include ${mam_libdl} ${mam_libast} : run features/dll
done FEATURE/dll generated done FEATURE/dll generated
exec - cmp 2>/dev/null -s FEATURE/dll dlldefs.h || { rm -f dlldefs.h; silent test -d . || mkdir .; cp FEATURE/dll dlldefs.h; } exec - cmp -s FEATURE/dll dlldefs.h || { rm -f dlldefs.h; silent test -d . || mkdir .; cp FEATURE/dll dlldefs.h; }
done dlldefs.h generated done dlldefs.h generated
prev ${PACKAGE_ast_INCLUDE}/ast.h implicit prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
done dlfcn.c done dlfcn.c
@ -285,9 +285,8 @@ make install
make ${PACKAGE_ast_INCLUDE}/dlldefs.h make ${PACKAGE_ast_INCLUDE}/dlldefs.h
prev ${PACKAGE_ast_INCLUDE} prev ${PACKAGE_ast_INCLUDE}
prev dlldefs.h prev dlldefs.h
exec - if cmp 2>/dev/null -s dlldefs.h ${PACKAGE_ast_INCLUDE}/dlldefs.h exec - if ! cmp -s dlldefs.h ${PACKAGE_ast_INCLUDE}/dlldefs.h
exec - then : exec - then ${STDCP} dlldefs.h ${PACKAGE_ast_INCLUDE}/dlldefs.h
exec - else ${STDCP} dlldefs.h ${PACKAGE_ast_INCLUDE}/dlldefs.h
exec - fi exec - fi
done ${PACKAGE_ast_INCLUDE}/dlldefs.h generated done ${PACKAGE_ast_INCLUDE}/dlldefs.h generated
done install virtual done install virtual

View file

@ -212,9 +212,8 @@ make install
make ${PACKAGE_ast_INCLUDE}/sum.h make ${PACKAGE_ast_INCLUDE}/sum.h
prev ${PACKAGE_ast_INCLUDE} prev ${PACKAGE_ast_INCLUDE}
prev sum.h prev sum.h
exec - if cmp 2>/dev/null -s sum.h ${PACKAGE_ast_INCLUDE}/sum.h exec - if ! cmp -s sum.h ${PACKAGE_ast_INCLUDE}/sum.h
exec - then : exec - then ${STDCP} sum.h ${PACKAGE_ast_INCLUDE}/sum.h
exec - else ${STDCP} sum.h ${PACKAGE_ast_INCLUDE}/sum.h
exec - fi exec - fi
done ${PACKAGE_ast_INCLUDE}/sum.h generated done ${PACKAGE_ast_INCLUDE}/sum.h generated
done install virtual done install virtual