From 3dcf22a3197a947ee672e71a7aedafc88a1662bb Mon Sep 17 00:00:00 2001 From: tg <tg@mirbsd.org> Date: Wed, 6 Jun 2007 23:28:17 +0000 Subject: [PATCH] ok, icc _did_ track down a few ones, and I fixed errno abuse a little too however, bad S/N ratio side effect bonus: smaller code size now --- check.t | 4 ++-- edit.c | 66 ++++++++++++++++++++++++------------------------------- eval.c | 9 +++----- exec.c | 37 ++++++++++++++++++------------- funcs.c | 18 ++++++--------- histrap.c | 6 ++--- jobs.c | 8 +++---- main.c | 23 ++++++++----------- misc.c | 13 +++++------ sh.h | 10 +++++---- shf.c | 6 ++--- syn.c | 4 ++-- var.c | 5 +++-- 13 files changed, 98 insertions(+), 111 deletions(-) diff --git a/check.t b/check.t index d05c77e..63f0ee4 100644 --- a/check.t +++ b/check.t @@ -1,4 +1,4 @@ -# $MirOS: src/bin/mksh/check.t,v 1.110 2007/06/05 19:48:46 tg Exp $ +# $MirOS: src/bin/mksh/check.t,v 1.111 2007/06/06 23:28:12 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 R29 2007/06/05 + @(#)MIRBSD KSH R29 2007/06/06 description: Check version of shell. category: pdksh diff --git a/edit.c b/edit.c index 47351a7..9d41b79 100644 --- a/edit.c +++ b/edit.c @@ -5,7 +5,7 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.100 2007/06/06 22:26:26 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.101 2007/06/06 23:28:13 tg Exp $"); /* tty driver characters we are interested in */ typedef struct { @@ -25,21 +25,20 @@ X_chars edchars; #define XCF_FULLPATH BIT(2) /* command completion: store full path */ #define XCF_COMMAND_FILE (XCF_COMMAND|XCF_FILE) -int x_getc(void); -void x_flush(void); -void x_putc(int); -void x_puts(const u_char *); -bool x_mode(bool); -int x_do_comment(char *, int, int *); -void x_print_expansions(int, char *const *, int); -int x_cf_glob(int, const char *, int, int, int *, int *, char ***, int *); -int x_longest_prefix(int, char *const *); -int x_basename(const char *, const char *); -void x_free_words(int, char **); -int x_escape(const char *, size_t, int (*)(const char *, size_t)); -int x_emacs(char *, size_t); -void x_init_emacs(void); -int x_vi(char *, size_t); +static int x_getc(void); +static void x_flush(void); +static void x_putc(int); +static bool x_mode(bool); +static int x_do_comment(char *, int, int *); +static void x_print_expansions(int, char *const *, int); +static int x_cf_glob(int, const char *, int, int, int *, int *, char ***, int *); +static int x_longest_prefix(int, char *const *); +static int x_basename(const char *, const char *); +static void x_free_words(int, char **); +static int x_escape(const char *, size_t, int (*)(const char *, size_t)); +static int x_emacs(char *, size_t); +static void x_init_emacs(void); +static int x_vi(char *, size_t); #ifdef TIOCGWINSZ static void chkwinsz(void); @@ -121,7 +120,7 @@ x_read(char *buf, size_t len) /* tty I/O */ -int +static int x_getc(void) { char c; @@ -136,25 +135,18 @@ x_getc(void) return ((n == 1) ? (int)(unsigned char)c : -1); } -void +static void x_flush(void) { shf_flush(shl_out); } -void +static void x_putc(int c) { shf_putc(c, shl_out); } -void -x_puts(const u_char *s) -{ - while (*s != 0) - shf_putc(*s++, shl_out); -} - /* ------------------------------------------------------------------------- */ /* Misc common code for vi/emacs */ @@ -166,7 +158,7 @@ x_puts(const u_char *s) * If successful, *lenp contains the new length. Note: cursor should be * moved to the start of the line after (un)commenting. */ -int +static int x_do_comment(char *buf, int bsize, int *lenp) { int i, j; @@ -211,7 +203,7 @@ x_do_comment(char *buf, int bsize, int *lenp) /* Common file/command completion code for vi/emacs */ -void +static void x_print_expansions(int nwords, char * const *words, int is_command) { int use_copy = 0; @@ -500,7 +492,7 @@ x_locate_word(const char *buf, int buflen, int pos, int *startp, return end - start; } -int +static int x_cf_glob(int flags, const char *buf, int buflen, int pos, int *startp, int *endp, char ***wordsp, int *is_commandp) { @@ -574,7 +566,7 @@ add_glob(const char *str, int slen) /* * Find longest common prefix */ -int +static int x_longest_prefix(int nwords, char * const * words) { int i, j; @@ -594,7 +586,7 @@ x_longest_prefix(int nwords, char * const * words) return prefix_len; } -void +static void x_free_words(int nwords, char **words) { int i; @@ -616,7 +608,7 @@ x_free_words(int nwords, char **words) * /// 2 * 0 */ -int +static int x_basename(const char *s, const char *se) { const char *p; @@ -723,7 +715,7 @@ glob_path(int flags, const char *pat, XPtrV *wp, const char *lpath) * be escaped and the result will be put into edit buffer by * keybinding-specific function */ -int +static int x_escape(const char *s, size_t len, int (*putbuf_func)(const char *, size_t)) { size_t add, wlen; @@ -1431,7 +1423,7 @@ x_e_getmbc(char *sbuf) return (pos); } -int +static int x_emacs(char *buf, size_t len) { int c, i; @@ -2641,7 +2633,7 @@ x_bind(const char *a1, const char *a2, return (0); } -void +static void x_init_emacs(void) { int i, j; @@ -3255,7 +3247,7 @@ x_lastcp(void) return (xlp); } -bool +static bool x_mode(bool onoff) { static bool x_cur_mode; @@ -3499,7 +3491,7 @@ enum expand_mode { }; static enum expand_mode expanded = NONE; /* last input was expanded */ -int +static int x_vi(char *buf, size_t len) { int c; diff --git a/eval.c b/eval.c index 4730c24..792f03f 100644 --- a/eval.c +++ b/eval.c @@ -2,7 +2,7 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/eval.c,v 1.27 2007/05/13 19:14:04 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/eval.c,v 1.28 2007/06/06 23:28:14 tg Exp $"); #ifdef MKSH_SMALL #define MKSH_NOPWNAM @@ -712,17 +712,14 @@ varsub(Expand *xp, const char *sp, const char *word, if ((p = cstrchr(sp, '[')) && (p[1] == '*' || p[1] == '@') && p[2] == ']') { int n = 0; - int max = 0; vp = global(arrayname(sp)); if (vp->flag & (ISSET|ARRAY)) zero_ok = 1; for (; vp; vp = vp->u.array) - if (vp->flag & ISSET) { - max = vp->index + 1; + if (vp->flag & ISSET) n++; - } - c = n; /* ksh88/ksh93 go for number, not max index */ + c = n; } else if (c == '*' || c == '@') c = e->loc->argc; else { diff --git a/exec.c b/exec.c index 785cd47..ae5e4de 100644 --- a/exec.c +++ b/exec.c @@ -2,7 +2,7 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/exec.c,v 1.31 2007/05/13 18:49:00 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/exec.c,v 1.32 2007/06/06 23:28:14 tg Exp $"); static int comexec(struct op *, struct tbl *volatile, const char **, int volatile); @@ -348,11 +348,12 @@ execute(struct op *volatile t, cargs.ro = t->args; execve(t->str, cargs.rw, up); + rv = errno; } - if (errno == ENOEXEC) + if (rv == ENOEXEC) scriptexec(t, (const char **)up); else - errorf("%s: %s", s, strerror(errno)); + errorf("%s: %s", s, strerror(rv)); } Break: exstat = rv; @@ -514,7 +515,7 @@ comexec(struct op *t, struct tbl *volatile tp, const char **ap, case CFUNC: /* function call */ { - volatile int old_xflag; + volatile char old_xflag; volatile Tflag old_inuse; const char *volatile old_kshname; @@ -537,9 +538,10 @@ comexec(struct op *t, struct tbl *volatile tp, const char **ap, break; } if (include(tp->u.fpath, 0, NULL, 0) < 0) { + rv = errno; warningf(true, "%s: can't open function definition file %s - %s", - cp, tp->u.fpath, strerror(errno)); + cp, tp->u.fpath, strerror(rv)); rv = 127; break; } @@ -576,7 +578,7 @@ comexec(struct op *t, struct tbl *volatile tp, const char **ap, } old_xflag = Flag(FXTRACE); - Flag(FXTRACE) = tp->flag & TRACE ? true : false; + Flag(FXTRACE) = tp->flag & TRACE ? 1 : 0; old_inuse = tp->flag & FINUSE; tp->flag |= FINUSE; @@ -1137,11 +1139,13 @@ iosetup(struct ioword *iop, struct tbl *tp) } if (u < 0) { /* herein() may already have printed message */ - if (u == -1) + if (u == -1) { + u = errno; warningf(true, "cannot %s %s: %s", iotype == IODUP ? "dup" : (iotype == IOREAD || iotype == IOHERE) ? - "open" : "create", cp, strerror(errno)); + "open" : "create", cp, strerror(u)); + } return -1; } /* Do not save if it has already been redirected (i.e. "cat >x >y"). */ @@ -1163,10 +1167,13 @@ iosetup(struct ioword *iop, struct tbl *tp) close(iop->unit); else if (u != iop->unit) { if (ksh_dup2(u, iop->unit, true) < 0) { + int ev; + + ev = errno; warningf(true, "could not finish (dup) redirection %s: %s", snptreef(NULL, 32, "%R", &iotmp), - strerror(errno)); + strerror(ev)); if (iotype != IODUP) close(u); return -1; @@ -1212,9 +1219,10 @@ herein(const char *content, int sub) */ h = maketemp(ATEMP, TT_HEREDOC_EXP, &e->temps); if (!(shf = h->shf) || (fd = open(h->name, O_RDONLY, 0)) < 0) { + fd = errno; warningf(true, "can't %s temporary file %s: %s", !shf ? "create" : "open", - h->name, strerror(errno)); + h->name, strerror(fd)); if (shf) shf_close(shf); return -2 /* special to iosetup(): don't print error */; @@ -1244,9 +1252,11 @@ herein(const char *content, int sub) quitenv(NULL); if (shf_close(shf) == EOF) { + i = errno; close(fd); - warningf(true, "error writing %s: %s", h->name, - strerror(errno)); + fd = errno; + warningf(true, "error writing %s: %s, %s", h->name, + strerror(i), strerror(fd)); return -2; /* special to iosetup(): don't print error */ } @@ -1381,9 +1391,6 @@ pr_list(char *const *ap) * [[ ... ]] evaluation routines */ -extern const char *const dbtest_tokens[]; -extern const char db_close[]; - /* Test if the current token is a whatever. Accepts the current token if * it is. Returns 0 if it is not, non-zero if it is (in the case of * TM_UNOP and TM_BINOP, the returned value is a Test_op). diff --git a/funcs.c b/funcs.c index b34a4c0..09ecb9e 100644 --- a/funcs.c +++ b/funcs.c @@ -5,7 +5,7 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.55 2007/06/05 19:18:11 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.56 2007/06/06 23:28:15 tg Exp $"); int c_cd(const char **wp) @@ -1790,7 +1790,8 @@ int c_eval(const char **wp) { struct source *s, *saves = source; - int savef, rv; + char savef; + int rv; if (ksh_getopt(wp, &builtin_opt, null) == '?') return 1; @@ -1843,17 +1844,12 @@ c_trap(const char **wp) wp += builtin_opt.optind; if (*wp == NULL) { - int anydfl = 0; - - for (p = sigtraps, i = NSIG+1; --i >= 0; p++) { - if (p->trap == NULL) - anydfl = 1; - else { + for (p = sigtraps, i = NSIG+1; --i >= 0; p++) + if (p->trap != NULL) { shprintf("trap -- "); print_value_quoted(p->trap); shprintf(" %s\n", p->name); } - } return 0; } @@ -2267,11 +2263,11 @@ c_mknod(const char **wp) } dv = makedev(majnum, minnum); if ((unsigned long)major(dv) != majnum) { - bi_errorf("device major too large: %ld", majnum); + bi_errorf("device major too large: %lu", majnum); goto c_mknod_err; } if ((unsigned long)minor(dv) != minnum) { - bi_errorf("device minor too large: %ld", minnum); + bi_errorf("device minor too large: %lu", minnum); goto c_mknod_err; } if (mknod(argv[0], mode, dv)) diff --git a/histrap.c b/histrap.c index 05f7721..9df43a0 100644 --- a/histrap.c +++ b/histrap.c @@ -3,10 +3,10 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/histrap.c,v 1.48 2007/06/05 21:47:48 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/histrap.c,v 1.49 2007/06/06 23:28:15 tg Exp $"); Trap sigtraps[NSIG + 1]; -static struct sigaction Sigact_ign, Sigact_trap; +static struct sigaction Sigact_ign; #if HAVE_PERSISTENT_HISTORY static int hist_count_lines(unsigned char *, int); @@ -1009,8 +1009,6 @@ inittraps(void) sigemptyset(&Sigact_ign.sa_mask); Sigact_ign.sa_flags = 0; /* interruptible */ Sigact_ign.sa_handler = SIG_IGN; - Sigact_trap = Sigact_ign; - Sigact_trap.sa_handler = trapsig; sigtraps[SIGINT].flags |= TF_DFL_INTR | TF_TTY_INTR; sigtraps[SIGQUIT].flags |= TF_DFL_INTR | TF_TTY_INTR; diff --git a/jobs.c b/jobs.c index 5f7ea3b..bab9aea 100644 --- a/jobs.c +++ b/jobs.c @@ -2,7 +2,7 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/jobs.c,v 1.22 2007/05/13 17:51:22 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/jobs.c,v 1.23 2007/06/06 23:28:15 tg Exp $"); /* Order important! */ #define PRUNNING 0 @@ -49,7 +49,7 @@ struct job { Job *next; /* next job in list */ int job; /* job number: %n */ int flags; /* see JF_* */ - int state; /* job state */ + volatile int state; /* job state */ int status; /* exit status of last process */ pid_t pgrp; /* process group of job */ pid_t ppid; /* pid of process that forked job */ @@ -905,8 +905,8 @@ j_waitj(Job *j, if (!Flag(FMONITOR)) flags |= JW_STOPPEDWAIT; - while ((volatile int) j->state == PRUNNING || - ((flags & JW_STOPPEDWAIT) && (volatile int) j->state == PSTOPPED)) { + while (j->state == PRUNNING || + ((flags & JW_STOPPEDWAIT) && j->state == PSTOPPED)) { sigsuspend(&sm_default); if (fatal_trap) { int oldf = j->flags & (JF_WAITING|JF_W_ASYNCNOTIFY); diff --git a/main.c b/main.c index ef29a52..708a708 100644 --- a/main.c +++ b/main.c @@ -13,7 +13,7 @@ #include <locale.h> #endif -__RCSID("$MirOS: src/bin/mksh/main.c,v 1.75 2007/05/13 17:51:22 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/main.c,v 1.76 2007/06/06 23:28:16 tg Exp $"); extern char **environ; @@ -936,23 +936,18 @@ ksh_dup2(int ofd, int nfd, int errok) * move fd from user space (0<=fd<10) to shell space (fd>=10), * set close-on-exec flag. */ -int +short savefd(int fd) { - int nfd; + int nfd = fd; - if (fd < FDBASE) { - nfd = fcntl(fd, F_DUPFD, FDBASE); - if (nfd < 0) { - if (errno == EBADF) - return -1; - else - errorf("too many files open in shell"); - } - } else - nfd = fd; + if (fd < FDBASE && (nfd = fcntl(fd, F_DUPFD, FDBASE)) < 0 && + errno == EBADF) + return -1; + if (nfd < 0 || nfd > SHRT_MAX) + errorf("too many files open in shell"); fcntl(nfd, F_SETFD, FD_CLOEXEC); - return nfd; + return ((short)nfd); } void diff --git a/misc.c b/misc.c index db76813..5d8d007 100644 --- a/misc.c +++ b/misc.c @@ -6,7 +6,7 @@ #include <grp.h> #endif -__RCSID("$MirOS: src/bin/mksh/misc.c,v 1.56 2007/06/06 21:36:29 tg Exp $\t" +__RCSID("$MirOS: src/bin/mksh/misc.c,v 1.57 2007/06/06 23:28:16 tg Exp $\t" MKSH_SH_H_ID); #undef USE_CHVT @@ -226,9 +226,9 @@ getoptions(void) void change_flag(enum sh_flag f, int what, /* flag to change */ - int newval) /* what is changing the flag (command line vs set) */ + char newval) /* what is changing the flag (command line vs set) */ { - int oldval; + char oldval; oldval = Flag(f); Flag(f) = newval; @@ -274,11 +274,11 @@ parse_args(const char **argv, { static char cmd_opts[NELEM(options) + 5]; /* o:T:\0 */ static char set_opts[NELEM(options) + 6]; /* A:o;s\0 */ - char *opts; + char set, *opts; const char *array = NULL; Getopt go; size_t i; - int optc, set, sortargs = 0, arrayset = 0; + int optc, sortargs = 0, arrayset = 0; /* First call? Build option strings... */ if (cmd_opts[0] == '\0') { @@ -392,8 +392,7 @@ parse_args(const char **argv, for (i = 0; i < NELEM(options); i++) if (optc == options[i].c && (what & options[i].flags)) { - change_flag((enum sh_flag) i, what, - set); + change_flag((enum sh_flag)i, what, set); break; } if (i == NELEM(options)) diff --git a/sh.h b/sh.h index 538c081..0859a00 100644 --- a/sh.h +++ b/sh.h @@ -8,8 +8,8 @@ /* $OpenBSD: c_test.h,v 1.4 2004/12/20 11:34:26 otto Exp $ */ /* $OpenBSD: tty.h,v 1.5 2004/12/20 11:34:26 otto Exp $ */ -#define MKSH_SH_H_ID "$MirOS: src/bin/mksh/sh.h,v 1.142 2007/06/06 21:36:29 tg Exp $" -#define MKSH_VERSION "R29 2007/06/05" +#define MKSH_SH_H_ID "$MirOS: src/bin/mksh/sh.h,v 1.143 2007/06/06 23:28:16 tg Exp $" +#define MKSH_VERSION "R29 2007/06/06" #if HAVE_SYS_PARAM_H #include <sys/param.h> @@ -1360,7 +1360,7 @@ void shprintf(const char *, ...) int can_seek(int); void initio(void); int ksh_dup2(int, int, int); -int savefd(int); +short savefd(int); void restfd(int, int); void openpipe(int *); void closepipe(int *); @@ -1391,7 +1391,7 @@ char *str_save(const char *, Area *); char *str_nsave(const char *, int, Area *); size_t option(const char *); char *getoptions(void); -void change_flag(enum sh_flag, int, int); +void change_flag(enum sh_flag, int, char); int parse_args(const char **, int, int *); int getn(const char *, int *); int bi_getn(const char *, int *); @@ -1521,6 +1521,8 @@ struct test_env { void (*error)(Test_env *, int, const char *); }; +extern const char *const dbtest_tokens[]; + Test_op test_isop(Test_meta, const char *); int test_eval(Test_env *, Test_op, const char *, const char *, int); int test_parse(Test_env *); diff --git a/shf.c b/shf.c index 44730c8..ba02236 100644 --- a/shf.c +++ b/shf.c @@ -2,7 +2,7 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/shf.c,v 1.14 2007/05/13 17:51:23 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/shf.c,v 1.15 2007/06/06 23:28:17 tg Exp $"); /* flags to shf_emptybuf() */ #define EB_READSW 0x01 /* about to switch to reading */ @@ -553,7 +553,7 @@ shf_putchar(int c, struct shf *shf) return EOF; if (shf->flags & SHF_UNBUF) { - char cc = c; + u_char cc = (u_char)c; int n; if (shf->fd < 0) @@ -924,7 +924,7 @@ shf_vfprintf(struct shf *shf, const char *fmt, va_list args) case 'c': flags &= ~FL_DOT; - numbuf[0] = va_arg(args, int); + numbuf[0] = (char)(va_arg(args, int)); s = numbuf; len = 1; break; diff --git a/syn.c b/syn.c index cd059a7..ad4e369 100644 --- a/syn.c +++ b/syn.c @@ -2,7 +2,7 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/syn.c,v 1.13 2007/05/13 19:00:30 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/syn.c,v 1.14 2007/06/06 23:28:17 tg Exp $"); struct nesting_state { int start_token; /* token than began nesting (eg, FOR) */ @@ -315,7 +315,7 @@ get_command(int cf) if (!is_wdvarname(yylval.cp, true)) yyerror("%s: bad identifier\n", c == FOR ? "for" : "select"); - t->str = str_save(ident, ATEMP); + t->str = str_nsave(ident, strlen(ident), ATEMP); nesting_push(&old_nesting, c); t->vars = wordlist(); t->left = dogroup(); diff --git a/var.c b/var.c index 8ad939d..b426741 100644 --- a/var.c +++ b/var.c @@ -2,7 +2,7 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/var.c,v 1.38 2007/05/13 17:51:24 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/var.c,v 1.39 2007/06/06 23:28:17 tg Exp $"); /* * Variables @@ -953,7 +953,8 @@ setspec(struct tbl *vp) case V_PATH: if (path) afree(path, APERM); - path = str_save(str_val(vp), APERM); + s = str_val(vp); + path = str_save(s, APERM); flushcom(1); /* clear tracked aliases */ break; case V_IFS: