diff --git a/tcsh-6.18.01-blk_buf.patch b/tcsh-6.18.01-blk_buf.patch deleted file mode 100644 index ad6c28c..0000000 --- a/tcsh-6.18.01-blk_buf.patch +++ /dev/null @@ -1,21 +0,0 @@ ---- tc.str.c -+++ tc.str.c 2012-05-10 07:57:01.358065084 +0000 -@@ -590,10 +590,14 @@ bb_cleanup(void *xbb) - struct blk_buf *bb; - size_t i; - -- bb = xbb; -- for (i = 0; i < bb->len; i++) -- xfree(bb->vec[i]); -- xfree(bb->vec); -+ bb = (struct blk_buf *)xbb; -+ if (bb->vec) { -+ for (i = 0; i < bb->len; i++) -+ xfree(bb->vec[i]); -+ xfree(bb->vec); -+ } -+ bb->vec = (Char**)0; -+ bb->len = 0; - } - - void diff --git a/tcsh-6.18.01-history-merge.dif b/tcsh-6.18.01-history-merge.dif deleted file mode 100644 index 554143b..0000000 --- a/tcsh-6.18.01-history-merge.dif +++ /dev/null @@ -1,38 +0,0 @@ ---- sh.hist.c -+++ sh.hist.c 2013-10-15 17:04:45.518796367 +0000 -@@ -107,7 +107,7 @@ hremove(struct Hist *hp) - - /* Prune length of history list to specified size by history variable. */ - PG_STATIC void --discardExcess(int histlen) -+discardExcess(int histlen, int flg) - { - struct Hist *hp, *np; - if (histTail == NULL) { -@@ -124,7 +124,7 @@ discardExcess(int histlen) - break; - } - while (histCount > (unsigned)histlen && (np = histTail) != &Histlist) { -- if (eventno - np->Href >= histlen || histlen == 0) -+ if ((eventno - np->Href >= histlen || histlen == 0) && ! (flg & HIST_MERGE)) - hremove(np), hfree(np); - else - break; -@@ -133,7 +133,7 @@ discardExcess(int histlen) - return; /* don't bother doing the full scan */ - for (hp = &Histlist; histCount > (unsigned)histlen && - (np = hp->Hnext) != NULL;) -- if (eventno - np->Href >= histlen || histlen == 0) -+ if ((eventno - np->Href >= histlen || histlen == 0) || flg & HIST_MERGE) - hremove(np), hfree(np); - else - hp = np; -@@ -161,7 +161,7 @@ savehist( - } - if (sp) - (void) enthist(++eventno, sp, 1, flg, histlen); -- discardExcess(histlen); -+ discardExcess(histlen, flg); - } - - #define USE_JENKINS_HASH 1 diff --git a/tcsh-6.18.01-metakey.patch b/tcsh-6.18.01-metakey.patch deleted file mode 100644 index b8989ca..0000000 --- a/tcsh-6.18.01-metakey.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ed.inputl.c -+++ ed.inputl.c 2012-05-25 16:31:24.130065248 +0000 -@@ -683,7 +683,7 @@ GetNextCommand(KEYCMD *cmdnum, Char *ch) - #ifdef DSPMBYTE - _enable_mbdisp && - #else -- MB_CUR_MAX == 1 && -+ MB_LEN_MAX == 1 && - #endif - !adrof(STRnokanji) && (*ch & META)) { - MetaNext = 0; diff --git a/tcsh-6.18.01.tar.gz b/tcsh-6.18.01.tar.gz deleted file mode 100644 index 1008726..0000000 --- a/tcsh-6.18.01.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d81ca27851f3e8545666399b4bcf25433e602a195113b3f7c73886fef84c9fa8 -size 926872 diff --git a/tcsh-6.17.10-catalogs.dif b/tcsh-6.18.03-catalogs.dif similarity index 80% rename from tcsh-6.17.10-catalogs.dif rename to tcsh-6.18.03-catalogs.dif index b15c350..e2ef23e 100644 --- a/tcsh-6.17.10-catalogs.dif +++ b/tcsh-6.18.03-catalogs.dif @@ -1,6 +1,134 @@ +--- + nls/Makefile.in | 48 ++++++++++++++++++++++++------------------------ + sh.c | 6 +++--- + 2 files changed, 27 insertions(+), 27 deletions(-) + +--- nls/Makefile.in ++++ nls/Makefile.in 2015-05-04 14:58:34.999037547 +0000 +@@ -16,96 +16,96 @@ CATGEN= ${srcdir}/catgen + + all: ${CATALOGS} + +-INSTALLED+=${localedir}/C/LC_MESSAGES/tcsh.cat +-${localedir}/C/LC_MESSAGES/tcsh.cat: C.cat ++INSTALLED+=${localedir}/C/LC_MESSAGES/tcsh ++${localedir}/C/LC_MESSAGES/tcsh: C.cat + mkdir -p $(@D) + $(INSTALL) $> $^ $@ + + C.cat: ${srcdir}/C/charset ${srcdir}/C/*set[0-9]* + @${CATGEN} $(GENCAT) $@ $^ $> + +-INSTALLED+=${localedir}/et/LC_MESSAGES/tcsh.cat +-${localedir}/et/LC_MESSAGES/tcsh.cat: et.cat ++INSTALLED+=${localedir}/et/LC_MESSAGES/tcsh ++${localedir}/et/LC_MESSAGES/tcsh: et.cat + mkdir -p $(@D) + $(INSTALL) $> $^ $@ + + et.cat: ${srcdir}/et/charset ${srcdir}/et/*set[0-9]* + @${CATGEN} $(GENCAT) $@ $^ $> + +-INSTALLED+=${localedir}/fi/LC_MESSAGES/tcsh.cat +-${localedir}/fi/LC_MESSAGES/tcsh.cat: finnish.cat ++INSTALLED+=${localedir}/fi/LC_MESSAGES/tcsh ++${localedir}/fi/LC_MESSAGES/tcsh: finnish.cat + mkdir -p $(@D) + $(INSTALL) $> $^ $@ + + finnish.cat: ${srcdir}/finnish/charset ${srcdir}/finnish/*set[0-9]* + @${CATGEN} $(GENCAT) $@ $^ $> + +-INSTALLED+=${localedir}/fr/LC_MESSAGES/tcsh.cat +-${localedir}/fr/LC_MESSAGES/tcsh.cat: french.cat ++INSTALLED+=${localedir}/fr/LC_MESSAGES/tcsh ++${localedir}/fr/LC_MESSAGES/tcsh: french.cat + mkdir -p $(@D) + $(INSTALL) $> $^ $@ + + french.cat: ${srcdir}/french/charset ${srcdir}/french/*set[0-9]* + @${CATGEN} $(GENCAT) $@ $^ $> + +-INSTALLED+=${localedir}/de/LC_MESSAGES/tcsh.cat +-${localedir}/de/LC_MESSAGES/tcsh.cat: german.cat ++INSTALLED+=${localedir}/de/LC_MESSAGES/tcsh ++${localedir}/de/LC_MESSAGES/tcsh: german.cat + mkdir -p $(@D) + $(INSTALL) $> $^ $@ + + german.cat: ${srcdir}/german/charset ${srcdir}/german/*set[0-9]* + @${CATGEN} $(GENCAT) $@ $^ $> + +-INSTALLED+=${localedir}/gr/LC_MESSAGES/tcsh.cat +-${localedir}/gr/LC_MESSAGES/tcsh.cat: greek.cat ++INSTALLED+=${localedir}/el_GR/LC_MESSAGES/tcsh ++${localedir}/el_GR/LC_MESSAGES/tcsh: greek.cat + mkdir -p $(@D) + $(INSTALL) $> $^ $@ + + greek.cat: ${srcdir}/greek/charset ${srcdir}/greek/*set[0-9]* + @${CATGEN} $(GENCAT) $@ $^ $> + +-INSTALLED+=${localedir}/it/LC_MESSAGES/tcsh.cat +-${localedir}/it/LC_MESSAGES/tcsh.cat: italian.cat ++INSTALLED+=${localedir}/it/LC_MESSAGES/tcsh ++${localedir}/it/LC_MESSAGES/tcsh: italian.cat + mkdir -p $(@D) + $(INSTALL) $> $^ $@ + + italian.cat: ${srcdir}/italian/charset ${srcdir}/italian/*set[0-9]* + @${CATGEN} $(GENCAT) $@ $^ $> + +-INSTALLED+=${localedir}/ja/LC_MESSAGES/tcsh.cat +-${localedir}/ja/LC_MESSAGES/tcsh.cat: ja.cat ++INSTALLED+=${localedir}/ja/LC_MESSAGES/tcsh ++${localedir}/ja/LC_MESSAGES/tcsh: ja.cat + mkdir -p $(@D) + $(INSTALL) $> $^ $@ + + ja.cat: ${srcdir}/ja/charset ${srcdir}/ja/*set[0-9]* + @${CATGEN} $(GENCAT) $@ $^ $> + +-INSTALLED+=${localedir}/pl/LC_MESSAGES/tcsh.cat +-${localedir}/pl/LC_MESSAGES/tcsh.cat: pl.cat ++INSTALLED+=${localedir}/pl/LC_MESSAGES/tcsh ++${localedir}/pl/LC_MESSAGES/tcsh: pl.cat + mkdir -p $(@D) + $(INSTALL) $> $^ $@ + + pl.cat: ${srcdir}/pl/charset ${srcdir}/pl/*set[0-9]* + @${CATGEN} $(GENCAT) $@ $^ $> + +-INSTALLED+=${localedir}/ru/LC_MESSAGES/tcsh.cat +-${localedir}/ru/LC_MESSAGES/tcsh.cat: russian.cat ++INSTALLED+=${localedir}/ru_RU/LC_MESSAGES/tcsh ++${localedir}/ru_RU/LC_MESSAGES/tcsh: russian.cat + mkdir -p $(@D) + $(INSTALL) $> $^ $@ + + russian.cat: ${srcdir}/russian/charset ${srcdir}/russian/*set[0-9]* + @${CATGEN} $(GENCAT) $@ $^ $> + +-INSTALLED+=${localedir}/es/LC_MESSAGES/tcsh.cat +-${localedir}/es/LC_MESSAGES/tcsh.cat: spanish.cat ++INSTALLED+=${localedir}/es/LC_MESSAGES/tcsh ++${localedir}/es/LC_MESSAGES/tcsh: spanish.cat + mkdir -p $(@D) + $(INSTALL) $> $^ $@ + + spanish.cat: ${srcdir}/spanish/charset ${srcdir}/spanish/*set[0-9]* + @${CATGEN} $(GENCAT) $@ $^ $> + +-INSTALLED+=${localedir}/ru_UA/LC_MESSAGES/tcsh.cat +-${localedir}/ru_UA/LC_MESSAGES/tcsh.cat: ukrainian.cat ++INSTALLED+=${localedir}/ru_UA.koi8u/LC_MESSAGES/tcsh ++${localedir}/ru_UA.koi8u/LC_MESSAGES/tcsh: ukrainian.cat + mkdir -p $(@D) + $(INSTALL) $> $^ $@ + --- sh.c -+++ sh.c 2011-11-17 08:28:47.027646998 +0000 -@@ -168,8 +168,8 @@ static void st_restore (void *); ++++ sh.c 2011-11-17 08:28:47.000000000 +0000 +@@ -169,8 +169,8 @@ static void st_restore (void *); static void add_localedir_to_nlspath(const char *path) { @@ -11,7 +139,7 @@ char *old; char *new, *new_p; size_t len; -@@ -181,7 +181,7 @@ add_localedir_to_nlspath(const char *pat +@@ -182,7 +182,7 @@ add_localedir_to_nlspath(const char *pat if (path == NULL) return; @@ -20,126 +148,3 @@ path); if (stat(trypath, &st) == -1) return; ---- nls/Makefile.in -+++ nls/Makefile.in 2012-01-10 16:53:02.899145576 +0000 -@@ -16,96 +16,96 @@ CATGEN= ${srcdir}/catgen - - all: ${CATALOGS} - --INSTALLED+=${localedir}/C/LC_MESSAGES/tcsh.cat --${localedir}/C/LC_MESSAGES/tcsh.cat: C.cat -+INSTALLED+=${localedir}/C/LC_MESSAGES/tcsh -+${localedir}/C/LC_MESSAGES/tcsh: C.cat - mkdir -p $(@D) - $(INSTALL) $< $@ - - C.cat: ${srcdir}/C/charset ${srcdir}/C/*set[0-9]* - @${CATGEN} $(GENCAT) $@ $^ $> - --INSTALLED+=${localedir}/et/LC_MESSAGES/tcsh.cat --${localedir}/et/LC_MESSAGES/tcsh.cat: et.cat -+INSTALLED+=${localedir}/et/LC_MESSAGES/tcsh -+${localedir}/et/LC_MESSAGES/tcsh: et.cat - mkdir -p $(@D) - $(INSTALL) $< $@ - - et.cat: ${srcdir}/et/charset ${srcdir}/et/*set[0-9]* - @${CATGEN} $(GENCAT) $@ $^ $> - --INSTALLED+=${localedir}/fi/LC_MESSAGES/tcsh.cat --${localedir}/fi/LC_MESSAGES/tcsh.cat: finnish.cat -+INSTALLED+=${localedir}/fi/LC_MESSAGES/tcsh -+${localedir}/fi/LC_MESSAGES/tcsh: finnish.cat - mkdir -p $(@D) - $(INSTALL) $< $@ - - finnish.cat: ${srcdir}/finnish/charset ${srcdir}/finnish/*set[0-9]* - @${CATGEN} $(GENCAT) $@ $^ $> - --INSTALLED+=${localedir}/fr/LC_MESSAGES/tcsh.cat --${localedir}/fr/LC_MESSAGES/tcsh.cat: french.cat -+INSTALLED+=${localedir}/fr/LC_MESSAGES/tcsh -+${localedir}/fr/LC_MESSAGES/tcsh: french.cat - mkdir -p $(@D) - $(INSTALL) $< $@ - - french.cat: ${srcdir}/french/charset ${srcdir}/french/*set[0-9]* - @${CATGEN} $(GENCAT) $@ $^ $> - --INSTALLED+=${localedir}/de/LC_MESSAGES/tcsh.cat --${localedir}/de/LC_MESSAGES/tcsh.cat: german.cat -+INSTALLED+=${localedir}/de/LC_MESSAGES/tcsh -+${localedir}/de/LC_MESSAGES/tcsh: german.cat - mkdir -p $(@D) - $(INSTALL) $< $@ - - german.cat: ${srcdir}/german/charset ${srcdir}/german/*set[0-9]* - @${CATGEN} $(GENCAT) $@ $^ $> - --INSTALLED+=${localedir}/gr/LC_MESSAGES/tcsh.cat --${localedir}/gr/LC_MESSAGES/tcsh.cat: greek.cat -+INSTALLED+=${localedir}/el/LC_MESSAGES/tcsh -+${localedir}/el/LC_MESSAGES/tcsh: greek.cat - mkdir -p $(@D) - $(INSTALL) $< $@ - - greek.cat: ${srcdir}/greek/charset ${srcdir}/greek/*set[0-9]* - @${CATGEN} $(GENCAT) $@ $^ $> - --INSTALLED+=${localedir}/it/LC_MESSAGES/tcsh.cat --${localedir}/it/LC_MESSAGES/tcsh.cat: italian.cat -+INSTALLED+=${localedir}/it/LC_MESSAGES/tcsh -+${localedir}/it/LC_MESSAGES/tcsh: italian.cat - mkdir -p $(@D) - $(INSTALL) $< $@ - - italian.cat: ${srcdir}/italian/charset ${srcdir}/italian/*set[0-9]* - @${CATGEN} $(GENCAT) $@ $^ $> - --INSTALLED+=${localedir}/ja/LC_MESSAGES/tcsh.cat --${localedir}/ja/LC_MESSAGES/tcsh.cat: ja.cat -+INSTALLED+=${localedir}/ja/LC_MESSAGES/tcsh -+${localedir}/ja/LC_MESSAGES/tcsh: ja.cat - mkdir -p $(@D) - $(INSTALL) $< $@ - - ja.cat: ${srcdir}/ja/charset ${srcdir}/ja/*set[0-9]* - @${CATGEN} $(GENCAT) $@ $^ $> - --INSTALLED+=${localedir}/pl/LC_MESSAGES/tcsh.cat --${localedir}/pl/LC_MESSAGES/tcsh.cat: pl.cat -+INSTALLED+=${localedir}/pl/LC_MESSAGES/tcsh -+${localedir}/pl/LC_MESSAGES/tcsh: pl.cat - mkdir -p $(@D) - $(INSTALL) $< $@ - - pl.cat: ${srcdir}/pl/charset ${srcdir}/pl/*set[0-9]* - @${CATGEN} $(GENCAT) $@ $^ $> - --INSTALLED+=${localedir}/ru/LC_MESSAGES/tcsh.cat --${localedir}/ru/LC_MESSAGES/tcsh.cat: russian.cat -+INSTALLED+=${localedir}/ru_RU/LC_MESSAGES/tcsh -+${localedir}/ru_RU/LC_MESSAGES/tcsh: russian.cat - mkdir -p $(@D) - $(INSTALL) $< $@ - - russian.cat: ${srcdir}/russian/charset ${srcdir}/russian/*set[0-9]* - @${CATGEN} $(GENCAT) $@ $^ $> - --INSTALLED+=${localedir}/es/LC_MESSAGES/tcsh.cat --${localedir}/es/LC_MESSAGES/tcsh.cat: spanish.cat -+INSTALLED+=${localedir}/es/LC_MESSAGES/tcsh -+${localedir}/es/LC_MESSAGES/tcsh: spanish.cat - mkdir -p $(@D) - $(INSTALL) $< $@ - - spanish.cat: ${srcdir}/spanish/charset ${srcdir}/spanish/*set[0-9]* - @${CATGEN} $(GENCAT) $@ $^ $> - --INSTALLED+=${localedir}/ru_UA.koi8u/LC_MESSAGES/tcsh.cat --${localedir}/ru_UA.koi8u/LC_MESSAGES/tcsh.cat: ukrainian.cat -+INSTALLED+=${localedir}/uk_UA/LC_MESSAGES/tcsh -+${localedir}/uk_UA/LC_MESSAGES/tcsh: ukrainian.cat - mkdir -p $(@D) - $(INSTALL) $< $@ - diff --git a/tcsh-6.17.03-colorls.dif b/tcsh-6.18.03-colorls.dif similarity index 55% rename from tcsh-6.17.03-colorls.dif rename to tcsh-6.18.03-colorls.dif index 1115400..dc68b43 100644 --- a/tcsh-6.17.03-colorls.dif +++ b/tcsh-6.18.03-colorls.dif @@ -1,14 +1,18 @@ +--- + tw.color.c | 25 ++++++++++++------------- + 1 file changed, 12 insertions(+), 13 deletions(-) + --- tw.color.c -+++ tw.color.c 2010-12-10 16:07:59.000000000 +0000 ++++ tw.color.c 2015-05-04 13:33:41.521518502 +0000 @@ -89,6 +89,7 @@ static Variable variables[] = { VAR(NOS, "hl", "44;37"), /* Reg file extra hard links, obsolete? */ VAR(NOS, "mh", "44;37"), /* Reg file extra hard links */ VAR(NOS, "ca", "30;41"), /* File with capability */ -+ VAR(NOS, "cl", ""), /* CLRTOEOL */ ++ VAR(NOS, "cl", ""), /* CLRTOEOL */ }; - enum FileType { -@@ -177,7 +178,7 @@ parseLS_COLORS(const Char *value) + #define nvariables (sizeof(variables)/sizeof(variables[0])) +@@ -328,7 +329,7 @@ parseLS_COLORS(const Char *value) size_t i, len; const Char *v; /* pointer in value */ char *c; /* pointer in colors */ @@ -17,24 +21,24 @@ jmp_buf_t osetexit; size_t omark; -@@ -240,13 +241,10 @@ parseLS_COLORS(const Char *value) - if ((Char)variables[i].variable[0] == (v[0] & CHAR) && - (Char)variables[i].variable[1] == (v[1] & CHAR)) - break; -- if (i < nvariables) { -- v += 3; -+ v += 3; -+ if (i < nvariables) - getstring(&c, &v, &variables[i].color, ':'); -- continue; -- } -- else -- stderror(ERR_BADCOLORVAR, v[0], v[1]); -+ continue; +@@ -385,13 +386,10 @@ parseLS_COLORS(const Char *value) + if ((Char)variables[i].variable[0] == (v[0] & CHAR) && + (Char)variables[i].variable[1] == (v[1] & CHAR)) + break; +- if (i < nvariables) { +- v += 3; ++ v += 3; ++ if (i < nvariables) + getstring(&c, &v, &variables[i].color, ':'); +- continue; +- } +- else +- stderror(ERR_BADCOLORVAR, v[0], v[1]); ++ continue; + } + break; } - break; - } -@@ -301,12 +303,13 @@ print_color(const Char *fname, size_t le +@@ -450,12 +448,13 @@ print_color(const Char *fname, size_t le break; } if (i == nvariables) { @@ -43,14 +47,14 @@ - && strncmp(last - extensions[i].extension.len, - extensions[i].extension.s, - extensions[i].extension.len) == 0) { -- color = &extensions[i].color; +- colorp = &extensions[i].color; + int j; + for (j = 0; j < nextensions; j++) + if (len >= extensions[j].extension.len + && strncmp(last - extensions[j].extension.len, + extensions[j].extension.s, + extensions[j].extension.len) == 0) { -+ color = &extensions[j].color; ++ colorp = &extensions[j].color; break; } } diff --git a/tcsh-6.18.00-history-file-locking.patch b/tcsh-6.18.03-history-file-locking.patch similarity index 74% rename from tcsh-6.18.00-history-file-locking.patch rename to tcsh-6.18.03-history-file-locking.patch index 02a9b27..f7b9b75 100644 --- a/tcsh-6.18.00-history-file-locking.patch +++ b/tcsh-6.18.03-history-file-locking.patch @@ -1,4 +1,4 @@ -From f813180f2fc1d682dd097e4a05ef4d15000204ad Mon Sep 17 00:00:00 2001 +Based on f813180f2fc1d682dd097e4a05ef4d15000204ad Mon Sep 17 00:00:00 2001 From: Roman Kollar Date: Mon, 29 Oct 2012 17:52:52 +0100 Subject: [PATCH] Add .history file locking - shared readers, exclusive writer @@ -14,11 +14,19 @@ https://bugzilla.redhat.com/show_bug.cgi?id=879371 Changes by Fridolin Pokorny --- + sh.c | 102 +++++++++++++++++++++++++++++++++++++-------------- + sh.decls.h | 4 +- + sh.dol.c | 2 - + sh.err.c | 16 ++++++++ + sh.h | 18 +++++++++ + sh.hist.c | 122 ++++++++++++++++++++++++++++++------------------------------- + sh.lex.c | 8 ++-- + sh.sem.c | 2 - + 8 files changed, 178 insertions(+), 96 deletions(-) -diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c ---- tcsh-6.18.00_orig/sh.c 2013-03-28 10:06:17.969859477 +0100 -+++ tcsh-6.18.00_work/sh.c 2013-03-28 10:07:21.155082032 +0100 -@@ -140,6 +140,7 @@ struct saved_state { +--- sh.c ++++ sh.c 2015-05-04 13:53:54.000000000 +0000 +@@ -141,6 +141,7 @@ struct saved_state { int cantell; struct Bin B; int justpr; @@ -26,7 +34,7 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c }; static int srccat (Char *, Char *); -@@ -1369,7 +1370,7 @@ main(int argc, char **argv) +@@ -1378,7 +1379,7 @@ main(int argc, char **argv) /* * Source history before .login so that it is available in .login */ @@ -35,7 +43,7 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c #ifndef LOGINFIRST if (loginsh) (void) srccat(varval(STRhome), STRsldotlogin); -@@ -1492,7 +1493,7 @@ static int +@@ -1501,7 +1502,7 @@ static int srccat(Char *cp, Char *dp) { if (cp[0] == '/' && cp[1] == '\0') @@ -44,7 +52,7 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c else { Char *ep; char *ptr; -@@ -1508,7 +1509,7 @@ srccat(Char *cp, Char *dp) +@@ -1517,7 +1518,7 @@ srccat(Char *cp, Char *dp) cleanup_push(ep, xfree); ptr = short2str(ep); @@ -53,7 +61,7 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c cleanup_until(ep); return rv; } -@@ -1522,20 +1523,49 @@ static int +@@ -1531,20 +1532,49 @@ static int #else int #endif /*WINNT_NATIVE*/ @@ -61,7 +69,8 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c +srcfile(const char *f, int onlyown, int flg, Char **av) { - int unit; -- ++ int *unit; + - if ((unit = xopen(f, O_RDONLY|O_LARGEFILE)) == -1) - return 0; - cleanup_push(&unit, open_cleanup); @@ -72,8 +81,6 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c - (void) close_on_exec(unit, 1); - srcunit(unit, onlyown, flag, av); - return 1; -+ int *unit; -+ + unit = xmalloc(sizeof(*unit)); + cleanup_push(unit, xfree); + *unit = xopen(f, O_LARGEFILE | @@ -116,7 +123,7 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c } -@@ -1544,7 +1574,7 @@ srcfile(const char *f, int onlyown, int +@@ -1553,7 +1583,7 @@ srcfile(const char *f, int onlyown, int * fd. */ static void @@ -125,7 +132,7 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c { st->insource = insource; st->SHIN = SHIN; -@@ -1593,10 +1623,14 @@ st_save(struct saved_state *st, int unit +@@ -1602,10 +1632,14 @@ st_save(struct saved_state *st, int unit st->onelflg = onelflg; st->enterhist = enterhist; st->justpr = justpr; @@ -141,7 +148,7 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c st->cantell = cantell; cpybin(st->B, B); -@@ -1635,7 +1669,7 @@ st_save(struct saved_state *st, int unit +@@ -1644,7 +1678,7 @@ st_save(struct saved_state *st, int unit evalp = 0; alvec = al; alvecp = 0; @@ -150,7 +157,7 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c if (enterhist) HIST = '\0'; insource = 1; -@@ -1668,7 +1702,8 @@ st_restore(void *xst) +@@ -1677,7 +1711,8 @@ st_restore(void *xst) } cpybin(B, st->B); @@ -160,7 +167,7 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c insource = st->insource; SHIN = st->SHIN; -@@ -1704,7 +1739,7 @@ st_restore(void *xst) +@@ -1713,7 +1748,7 @@ st_restore(void *xst) * we don't chance it. This occurs on ".cshrc"s and the like. */ static void @@ -169,7 +176,7 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c { struct saved_state st; -@@ -1730,7 +1765,7 @@ srcunit(int unit, int onlyown, int hflg, +@@ -1739,7 +1774,7 @@ srcunit(int unit, int onlyown, int hflg, } /* Save the current state and move us to a new state */ @@ -178,7 +185,7 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c /* * Now if we are allowing commands to be interrupted, we let ourselves be -@@ -2069,7 +2104,7 @@ process(int catch) +@@ -2078,7 +2113,7 @@ process(int catch) * elsewhere... */ if (enterhist || (catch && intty && !whyles && !tellwhat && !arun)) @@ -187,7 +194,7 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c if (Expand && seterr) Expand = 0; -@@ -2156,21 +2191,28 @@ process(int catch) +@@ -2165,21 +2200,28 @@ process(int catch) void dosource(Char **t, struct command *c) { @@ -219,16 +226,15 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c } f = globone(*t++, G_ERROR); -@@ -2178,9 +2220,16 @@ dosource(Char **t, struct command *c) - cleanup_push(file, xfree); +@@ -2188,9 +2230,15 @@ dosource(Char **t, struct command *c) xfree(f); t = glob_all_or_error(t); + cleanup_push(t, blk_cleanup); - if ((!srcfile(file, 0, hflg, t)) && (!hflg) && (!bequiet)) + fd = srcfile(file, 0, (flg | newflg), t); + if ((!fd) && (!newflg) && (!bequiet)) stderror(ERR_SYSTEM, file, strerror(errno)); - cleanup_until(file); -+ + /* We need to preserve fd and it's cleaning routines on the top of the + * cleaning stack. Don't call cleanup_until() but clean it manually. */ + cleanup_ignore(file); @@ -238,9 +244,8 @@ diff -upr tcsh-6.18.00_orig/sh.c tcsh-6.18.00_work/sh.c } /* -diff -upr tcsh-6.18.00_orig/sh.decls.h tcsh-6.18.00_work/sh.decls.h ---- tcsh-6.18.00_orig/sh.decls.h 2013-03-28 10:06:17.988859538 +0100 -+++ tcsh-6.18.00_work/sh.decls.h 2013-03-28 10:06:42.897948590 +0100 +--- sh.decls.h ++++ sh.decls.h 2015-05-04 13:56:16.000000000 +0000 @@ -38,6 +38,7 @@ */ extern Char *gethdir (const Char *); @@ -249,7 +254,7 @@ diff -upr tcsh-6.18.00_orig/sh.decls.h tcsh-6.18.00_work/sh.decls.h extern void exitstat (void); extern void goodbye (Char **, struct command *); extern void importpath (Char *); -@@ -98,6 +99,7 @@ extern void cleanup_until_mark(void); +@@ -99,6 +100,7 @@ extern void cleanup_until_mark(void); extern size_t cleanup_push_mark(void); extern void cleanup_pop_mark(size_t); extern void open_cleanup(void *); @@ -257,19 +262,18 @@ diff -upr tcsh-6.18.00_orig/sh.decls.h tcsh-6.18.00_work/sh.decls.h extern void opendir_cleanup(void *); extern void sigint_cleanup(void *); extern void sigprocmask_cleanup(void *); -@@ -219,7 +221,7 @@ extern struct Hist *enthist (int, str +@@ -220,7 +222,7 @@ extern struct Hist *enthist (int, str extern void savehist (struct wordent *, int); extern char *fmthist (int, ptr_t); extern void rechist (Char *, int); -extern void loadhist (Char *, int); +extern int loadhist (Char *, int); extern void displayHistStats(const char *); + extern void sethistory (int); - /* -diff -upr tcsh-6.18.00_orig/sh.dol.c tcsh-6.18.00_work/sh.dol.c ---- tcsh-6.18.00_orig/sh.dol.c 2013-03-28 10:06:17.988859538 +0100 -+++ tcsh-6.18.00_work/sh.dol.c 2013-03-28 10:06:42.898948594 +0100 -@@ -1110,6 +1110,6 @@ again: +--- sh.dol.c ++++ sh.dol.c 2013-03-28 09:06:43.000000000 +0000 +@@ -1120,6 +1120,6 @@ again: *obp = 0; tmp = short2str(obuf); (void) xwrite(0, tmp, strlen (tmp)); @@ -277,9 +281,8 @@ diff -upr tcsh-6.18.00_orig/sh.dol.c tcsh-6.18.00_work/sh.dol.c + (void) lseek(0, (off_t) 0, SEEK_SET); cleanup_until(&inheredoc); } -diff -upr tcsh-6.18.00_orig/sh.err.c tcsh-6.18.00_work/sh.err.c ---- tcsh-6.18.00_orig/sh.err.c 2013-03-28 10:06:17.972859480 +0100 -+++ tcsh-6.18.00_work/sh.err.c 2013-03-28 10:06:42.824948331 +0100 +--- sh.err.c ++++ sh.err.c 2013-03-28 09:06:43.000000000 +0000 @@ -514,6 +514,22 @@ open_cleanup(void *xptr) } @@ -303,9 +306,8 @@ diff -upr tcsh-6.18.00_orig/sh.err.c tcsh-6.18.00_work/sh.err.c opendir_cleanup(void *xdir) { DIR *dir; -diff -upr tcsh-6.18.00_orig/sh.h tcsh-6.18.00_work/sh.h ---- tcsh-6.18.00_orig/sh.h 2013-03-28 10:06:17.988859538 +0100 -+++ tcsh-6.18.00_work/sh.h 2013-03-28 10:06:42.899948597 +0100 +--- sh.h ++++ sh.h 2013-03-28 09:06:43.000000000 +0000 @@ -50,6 +50,24 @@ # include #endif @@ -331,10 +333,18 @@ diff -upr tcsh-6.18.00_orig/sh.h tcsh-6.18.00_work/sh.h #if !defined(HAVE_STDINT_H) && !defined(HAVE_INTTYPES_H) && !defined(WINNT_NATIVE) typedef unsigned long intptr_t; #endif -diff -upr tcsh-6.18.00_orig/sh.hist.c tcsh-6.18.00_work/sh.hist.c ---- tcsh-6.18.00_orig/sh.hist.c 2013-03-28 10:06:17.967859465 +0100 -+++ tcsh-6.18.00_work/sh.hist.c 2013-03-28 10:06:42.815948309 +0100 -@@ -44,14 +44,6 @@ Char HistLit = 0; +--- sh.hist.c ++++ sh.hist.c 2015-05-04 14:51:57.995328370 +0000 +@@ -36,6 +36,8 @@ RCSID("$tcsh: sh.hist.c,v 3.60 2015/02/2 + + #include /* for rename(2), grr. */ + #include ++#include ++#include + #include "tc.h" + #include "dotlock.h" + +@@ -46,14 +48,6 @@ Char HistLit = 0; static int heq (const struct wordent *, const struct wordent *); static void hfree (struct Hist *); @@ -349,34 +359,32 @@ diff -upr tcsh-6.18.00_orig/sh.hist.c tcsh-6.18.00_work/sh.hist.c /* * C shell */ -@@ -143,7 +135,7 @@ discardExcess(int histlen) +@@ -145,13 +139,13 @@ discardExcess(int hlen) void savehist( struct wordent *sp, - int mflg) /* true if -m (merge) specified */ -+ int flg) ++ int flg) /* true if -m (merge) specified */ { - int histlen = 0; - Char *cp; -@@ -160,7 +152,7 @@ savehist( - histlen = histlen * 10 + *cp++ - '0'; - } + /* throw away null lines */ + if (sp && sp->next->word[0] == '\n') + return; if (sp) - (void) enthist(++eventno, sp, 1, mflg, histlen); + (void) enthist(++eventno, sp, 1, flg, histlen); discardExcess(histlen); } -@@ -933,7 +925,7 @@ enthist( +@@ -923,7 +917,7 @@ enthist( int event, /* newly incremented global eventno */ struct wordent *lp, int docopy, - int mflg, /* true if merge requested */ -+ int flg, - int histlen) /* -1 if unknown */ ++ int flg, /* true if merge requested */ + int hlen) /* -1 if unknown */ { struct Hist *p = NULL, *pp = &Histlist, *pTime = NULL; -@@ -953,7 +945,7 @@ enthist( +@@ -943,7 +937,7 @@ enthist( Htime = p->Htime; /* If we are merging, and the old entry is at the place we want * to insert the new entry, then remember the place. */ @@ -385,7 +393,7 @@ diff -upr tcsh-6.18.00_orig/sh.hist.c tcsh-6.18.00_work/sh.hist.c pTime = p->Hprev; if (!fastMergeErase) renumberHist(p); /* Reset Href of subsequent entries */ -@@ -1012,7 +1004,7 @@ enthist( +@@ -1002,7 +996,7 @@ enthist( /* The head of history list is the default insertion point. If merging, advance insertion point, in pp, according to Htime. */ /* XXX -- In histdup=all, Htime values can be non-monotonic. */ @@ -394,19 +402,21 @@ diff -upr tcsh-6.18.00_orig/sh.hist.c tcsh-6.18.00_work/sh.hist.c pp = mergeInsertionPoint(np, pTime); for (p = pp->Hnext; p && p->Htime == np->Htime; pp = p, p = p->Hnext) { if (heq(&p->Hlex, &np->Hlex)) { -@@ -1051,9 +1043,9 @@ hfree(struct Hist *hp) +@@ -1041,11 +1035,11 @@ hfree(struct Hist *hp) } PG_STATIC void -phist(struct Hist *hp, int hflg) +phist(struct Hist *hp, int flg) { + if (hp->Href < 0) + return; - if (hflg & HIST_ONLY) { + if (flg & HIST_ONLY) { int old_output_raw; /* -@@ -1065,7 +1057,7 @@ phist(struct Hist *hp, int hflg) +@@ -1057,7 +1051,7 @@ phist(struct Hist *hp, int hflg) old_output_raw = output_raw; output_raw = 1; cleanup_push(&old_output_raw, output_raw_restore); @@ -415,7 +425,7 @@ diff -upr tcsh-6.18.00_orig/sh.hist.c tcsh-6.18.00_work/sh.hist.c /* * Make file entry with history time in format: * "+NNNNNNNNNN" (10 digits, left padded with ascii '0') -@@ -1096,7 +1088,7 @@ phist(struct Hist *hp, int hflg) +@@ -1088,7 +1082,7 @@ phist(struct Hist *hp, int hflg) } PG_STATIC void @@ -424,7 +434,7 @@ diff -upr tcsh-6.18.00_orig/sh.hist.c tcsh-6.18.00_work/sh.hist.c { struct Hist *hp; if (setintr) { -@@ -1105,7 +1097,7 @@ dophist(int n, int hflg) +@@ -1097,7 +1091,7 @@ dophist(int n, int hflg) pintr_push_enable(&old_pintr_disabled); cleanup_until(&old_pintr_disabled); } @@ -433,7 +443,7 @@ diff -upr tcsh-6.18.00_orig/sh.hist.c tcsh-6.18.00_work/sh.hist.c /* Since the history list is stored most recent first, non-reversing * print needs to print (backwards) up the list. */ if ((unsigned)n >= histCount) -@@ -1119,10 +1111,10 @@ dophist(int n, int hflg) +@@ -1111,10 +1105,10 @@ dophist(int n, int hflg) if (hp == NULL) return; /* nothing to print */ for (; hp != &Histlist; hp = hp->Hprev) @@ -446,7 +456,7 @@ diff -upr tcsh-6.18.00_orig/sh.hist.c tcsh-6.18.00_work/sh.hist.c } } -@@ -1130,7 +1122,7 @@ dophist(int n, int hflg) +@@ -1122,7 +1116,7 @@ dophist(int n, int hflg) void dohist(Char **vp, struct command *c) { @@ -455,7 +465,7 @@ diff -upr tcsh-6.18.00_orig/sh.hist.c tcsh-6.18.00_work/sh.hist.c USE(c); if (getn(varval(STRhistory)) == 0) -@@ -1141,40 +1133,40 @@ dohist(Char **vp, struct command *c) +@@ -1133,40 +1127,40 @@ dohist(Char **vp, struct command *c) while (*++vp2) switch (*vp2) { case 'c': @@ -507,7 +517,7 @@ diff -upr tcsh-6.18.00_orig/sh.hist.c tcsh-6.18.00_work/sh.hist.c rechist(*vp, 1); else { if (*vp) -@@ -1182,7 +1174,7 @@ dohist(Char **vp, struct command *c) +@@ -1174,7 +1168,7 @@ dohist(Char **vp, struct command *c) else { n = getn(varval(STRhistory)); } @@ -516,83 +526,75 @@ diff -upr tcsh-6.18.00_orig/sh.hist.c tcsh-6.18.00_work/sh.hist.c } } -@@ -1224,8 +1216,8 @@ fmthist(int fmt, ptr_t ptr) +@@ -1222,10 +1216,9 @@ dotlock_cleanup(void* lockpath) void rechist(Char *fname, int ref) { -- Char *snum; +- Char *snum, *rs; - int fp, ftmp, oldidfds; -+ Char *snum; -+ int fd = -1, ftmp, oldidfds; ++ Char *snum; ++ int fd = -1, ftmp, oldidfds; struct varent *shist; +- char path[MAXPATHLEN]; + struct stat st; static Char *dumphist[] = {STRhistory, STRmhT, 0, 0}; -@@ -1255,15 +1247,12 @@ rechist(Char *fname, int ref) - * with numerous shells being in simultaneous use. Imagine - * any kind of window system. All these shells 'share' the same - * ~/.history file for recording their command line history. -- * Currently the automatic merge can only succeed when the shells -- * nicely quit one after another. -- * -- * Users that like to nuke their environment require here an atomic -- * loadhist-creat-dohist(dumphist)-close -- * sequence. - * -- * jw. -- */ -+ * Atomic merge loadhist-creat/ftrunc-dohist(dumphist)-close -+ * implemented using fcntl (shared readers, exclusive writer) -+ * by Vojtech Vitek (V-Teq) . -+ */ -+ - /* - * We need the didfds stuff before loadhist otherwise - * exec in a script will fail to print if merge is set. -@@ -1271,32 +1260,42 @@ rechist(Char *fname, int ref) - */ - oldidfds = didfds; - didfds = 0; -- if ((shist = adrof(STRsavehist)) != NULL && shist->vec != NULL) -- if (shist->vec[1] && eq(shist->vec[1], STRmerge)) +@@ -1294,46 +1287,49 @@ rechist(Char *fname, int ref) + cleanup_push(lockpath, dotlock_cleanup); + #endif + } - loadhist(fname, 1); ++ /* Read .history file, leave it's fd open for writing. */ ++ fd = loadhist(fname, HIST_MERGE|HIST_FILE_WRLCK|HIST_FILE_OPEN|HIST_FILE_LOCK); ++ if (fd > 0) { ++ /* Truncate the .history file. */ ++ (void) ftruncate(fd, 0); ++ (void) lseek(fd, (off_t) 0, SEEK_SET); ++ } + } + } +- rs = randsuf(); +- xsnprintf(path, sizeof(path), "%S.%S", fname, rs); +- xfree(rs); - -- fp = xcreat(short2str(fname), 0600); -- cleanup_until(fname); +- fp = xcreat(path, 0600); - if (fp == -1) { - didfds = oldidfds; +- cleanup_until(fname); - return; -+ if (((shist = adrof(STRsavehist)) != NULL && shist->vec != NULL) && -+ (shist->vec[1] && eq(shist->vec[1], STRmerge))) { -+ /* Read .history file, leave it's fd open for writing. */ -+ fd = loadhist(fname, HIST_MERGE|HIST_FILE_WRLCK|HIST_FILE_OPEN|HIST_FILE_LOCK); -+ if (fd > 0) { -+ /* Truncate the .history file. */ -+ (void) ftruncate(fd, 0); -+ (void) lseek(fd, (off_t) 0, SEEK_SET); -+ } -+ } + if (fd <= 0) { -+ /* Open .history file for writing (if not open yet). */ ++ /* Open .history file for writing (if not open yet). */ + fd = xopen(short2str(fname), O_LARGEFILE|O_CREAT|O_WRONLY|O_TRUNC, 0600); + if (fd != -1) + cleanup_push(&fd, open_cleanup); -+ } -+ if (fd != -1) { -+ ftmp = SHOUT; -+ SHOUT = fd; -+ dumphist[2] = snum; -+ /* Write history to the .history file. */ -+ dohist(dumphist, NULL); -+ SHOUT = ftmp; } + /* Try to preserve ownership and permissions of the original history file */ + #ifndef WINNT_NATIVE + if (stat(short2str(fname), &st) != -1) { +- TCSH_IGNORE(fchown(fp, st.st_uid, st.st_gid)); +- TCSH_IGNORE(fchmod(fp, st.st_mode)); ++ TCSH_IGNORE(fchown(fd, st.st_uid, st.st_gid)); ++ TCSH_IGNORE(fchmod(fd, st.st_mode)); + } + #else + UNREFERENCED_PARAMETER(st); + #endif - ftmp = SHOUT; - SHOUT = fp; - dumphist[2] = snum; - dohist(dumphist, NULL); - xclose(fp); - SHOUT = ftmp; ++ if (fd != -1) { ++ ftmp = SHOUT; ++ SHOUT = fd; ++ dumphist[2] = snum; ++ dohist(dumphist, NULL); ++ SHOUT = ftmp; ++ } didfds = oldidfds; -+ cleanup_until(fname); +- (void)rename(path, short2str(fname)); + cleanup_until(fname); } @@ -609,7 +611,7 @@ diff -upr tcsh-6.18.00_orig/sh.hist.c tcsh-6.18.00_work/sh.hist.c if (fname != NULL) loadhist_cmd[2] = fname; -@@ -1305,15 +1304,17 @@ loadhist(Char *fname, int mflg) +@@ -1342,17 +1338,19 @@ loadhist(Char *fname, int mflg) else loadhist_cmd[2] = STRtildothist; @@ -631,9 +633,10 @@ diff -upr tcsh-6.18.00_orig/sh.hist.c tcsh-6.18.00_work/sh.hist.c + + return fd; /* Valid/invalid file descriptor (>FSAVE, -1). Zero on error. */ } -diff -upr tcsh-6.18.00_orig/sh.lex.c tcsh-6.18.00_work/sh.lex.c ---- tcsh-6.18.00_orig/sh.lex.c 2013-03-28 10:06:17.971859478 +0100 -+++ tcsh-6.18.00_work/sh.lex.c 2013-03-28 10:06:42.820948316 +0100 + + void +--- sh.lex.c ++++ sh.lex.c 2013-03-28 09:06:43.000000000 +0000 @@ -1595,7 +1595,7 @@ wide_read(int fildes, Char *buf, size_t /* Throwing away possible partial multibyte characters on error if the stream is not seekable */ @@ -670,10 +673,9 @@ diff -upr tcsh-6.18.00_orig/sh.lex.c tcsh-6.18.00_work/sh.lex.c return; fbuf = xcalloc(2, sizeof(Char **)); fblocks = 1; -diff -upr tcsh-6.18.00_orig/sh.sem.c tcsh-6.18.00_work/sh.sem.c ---- tcsh-6.18.00_orig/sh.sem.c 2013-03-28 10:06:17.970859477 +0100 -+++ tcsh-6.18.00_work/sh.sem.c 2013-03-28 10:06:42.819948308 +0100 -@@ -892,7 +892,7 @@ doio(struct command *t, int *pipein, int +--- sh.sem.c ++++ sh.sem.c 2013-03-28 09:06:43.000000000 +0000 +@@ -903,7 +903,7 @@ doio(struct command *t, int *pipein, int fd = xopen(tmp, O_WRONLY|O_APPEND|O_LARGEFILE); #else /* !O_APPEND */ fd = xopen(tmp, O_WRONLY|O_LARGEFILE); diff --git a/tcsh-6.18.03-history-merge.dif b/tcsh-6.18.03-history-merge.dif new file mode 100644 index 0000000..c181d18 --- /dev/null +++ b/tcsh-6.18.03-history-merge.dif @@ -0,0 +1,60 @@ +--- + sh.hist.c | 21 ++++++++++++++++----- + 1 file changed, 16 insertions(+), 5 deletions(-) + +--- sh.hist.c ++++ sh.hist.c 2015-05-05 07:16:26.382084939 +0000 +@@ -103,7 +103,7 @@ hremove(struct Hist *hp) + + /* Prune length of history list to specified size by history variable. */ + PG_STATIC void +-discardExcess(int hlen) ++discardExcess(int hlen, int flg) + { + struct Hist *hp, *np; + if (histTail == NULL) { +@@ -114,7 +114,7 @@ discardExcess(int hlen) + * the list is still too long scan the whole list as before. But only do a + * full scan if the list is more than 6% (1/16th) too long. */ + while (histCount > (unsigned)hlen && (np = Histlist.Hnext)) { +- if (eventno - np->Href >= hlen || hlen == 0) ++ if ((eventno - np->Href >= hlen || hlen == 0) && ! (flg & HIST_MERGE)) + hremove(np), hfree(np); + else + break; +@@ -129,7 +129,7 @@ discardExcess(int hlen) + return; /* don't bother doing the full scan */ + for (hp = &Histlist; histCount > (unsigned)hlen && + (np = hp->Hnext) != NULL;) +- if (eventno - np->Href >= hlen || hlen == 0) ++ if ((eventno - np->Href >= hlen || hlen == 0) || flg & HIST_MERGE) + hremove(np), hfree(np); + else + hp = np; +@@ -146,7 +146,7 @@ savehist( + return; + if (sp) + (void) enthist(++eventno, sp, 1, flg, histlen); +- discardExcess(histlen); ++ discardExcess(histlen, flg); + } + + #define USE_JENKINS_HASH 1 +@@ -1357,5 +1357,16 @@ void + sethistory(int n) + { + histlen = n; +- discardExcess(histlen); ++ int merge = 0; ++ struct varent *shist; ++ if ((shist = adrof(STRsavehist)) != NULL && shist->vec != NULL) { ++ size_t i; ++ for (i = 1; shist->vec[i]; i++) { ++ if (eq(shist->vec[i], STRmerge)) { ++ merge = HIST_MERGE; ++ break; ++ } ++ } ++ } ++ discardExcess(histlen, merge); + } diff --git a/tcsh-6.18.00.dif b/tcsh-6.18.03.dif similarity index 66% rename from tcsh-6.18.00.dif rename to tcsh-6.18.03.dif index e5c56f3..c561bc1 100644 --- a/tcsh-6.18.00.dif +++ b/tcsh-6.18.03.dif @@ -1,13 +1,21 @@ ---- Makefile.in -+++ Makefile.in 2011-11-16 12:12:02.000000000 +0000 -@@ -599,7 +599,6 @@ install: tcsh$(EXEEXT) install.catalogs - -mkdir -p ${DESTBIN} - -mv -f ${DESTBIN}/tcsh$(EXEEXT) ${DESTBIN}/tcsh.old - cp tcsh$(EXEEXT) ${DESTBIN}/tcsh$(EXEEXT) -- -strip ${DESTBIN}/tcsh$(EXEEXT) - chmod 755 ${DESTBIN}/tcsh$(EXEEXT) - - install.catalogs: +--- + config/linux | 7 +++++++ + config_f.h | 13 +++++++++---- + configure | 2 +- + configure.ac | 2 +- + glob.h | 3 ++- + pathnames.h | 2 +- + sh.c | 3 +++ + sh.h | 2 +- + sh.print.c | 8 ++++---- + tc.alloc.c | 10 ++++++---- + tc.func.c | 8 ++++++-- + tc.str.c | 2 +- + tc.who.c | 3 +++ + tcsh.man | 2 +- + tw.h | 4 ++++ + 15 files changed, 50 insertions(+), 21 deletions(-) + --- config/linux +++ config/linux 2011-11-16 12:15:09.000000000 +0000 @@ -132,4 +132,11 @@ @@ -67,7 +75,7 @@ # else --- configure +++ configure 2011-11-16 10:49:20.000000000 +0000 -@@ -3794,7 +3794,7 @@ return tgetent (); +@@ -4277,7 +4277,7 @@ return tgetent (); return 0; } _ACEOF @@ -76,9 +84,9 @@ if test -z "$ac_lib"; then ac_res="none required" else ---- configure.in -+++ configure.in 2011-11-16 10:49:09.000000000 +0000 -@@ -298,7 +298,7 @@ fi +--- configure.ac ++++ configure.ac 2015-05-04 14:27:52.000000000 +0000 +@@ -309,7 +309,7 @@ fi dnl Checks for libraries AC_SEARCH_LIBS(crypt, crypt) AC_SEARCH_LIBS(getspnam, sec) @@ -119,7 +127,7 @@ --- sh.c +++ sh.c 2010-12-10 16:10:45.000000000 +0000 -@@ -1353,6 +1353,9 @@ main(int argc, char **argv) +@@ -1365,6 +1365,9 @@ main(int argc, char **argv) setintr = osetintr; parintr = oparintr; } @@ -129,36 +137,79 @@ #ifdef LOGINFIRST if (loginsh) (void) srccat(varval(STRhome), STRsldotlogin); +--- sh.h ++++ sh.h 2015-05-05 07:20:23.946019208 +0000 +@@ -580,7 +580,7 @@ EXTERN int neednote IZERO; /* Need to + EXTERN int noexec IZERO; /* Don't execute, just syntax check */ + EXTERN int pjobs IZERO; /* want to print jobs if interrupted */ + EXTERN int setintr IZERO; /* Set interrupts on/off -> Wait intr... */ +-EXTERN int handle_intr IZERO;/* Are we currently handling an interrupt? */ ++EXTERN int handle_interrupt IZERO;/* Are we currently handling an interrupt? */ + EXTERN int havhash IZERO; /* path hashing is available */ + EXTERN int editing IZERO; /* doing filename expansion and line editing */ + EXTERN int noediting IZERO; /* initial $term defaulted to noedit */ +--- sh.print.c ++++ sh.print.c 2015-05-05 07:21:25.381518880 +0000 +@@ -231,13 +231,13 @@ flush(void) + return; + if (GettingInput && !Tty_raw_mode && linp < &linbuf[sizeof linbuf - 10]) + return; +- if (handle_intr) ++ if (handle_interrupt) + exitset = 1; + + if (interrupted) { + interrupted = 0; + linp = linbuf; /* avoid recursion as stderror calls flush */ +- if (handle_intr) ++ if (handle_interrupt) + fixerror(); + else + stderror(ERR_SILENT); +@@ -298,11 +298,11 @@ flush(void) + case EDQUOT: + #endif + /* Nothing to do, but die */ +- if (handle_intr == 0) ++ if (handle_interrupt == 0) + xexit(1); + /*FALLTHROUGH*/ + default: +- if (handle_intr) ++ if (handle_interrupt) + fixerror(); + else + stderror(ERR_SILENT); --- tc.alloc.c -+++ tc.alloc.c 2006-04-25 12:58:31.000000000 +0000 -@@ -489,7 +489,7 @@ smalloc(size_t n) ++++ tc.alloc.c 2015-05-04 14:29:30.000000000 +0000 +@@ -514,7 +514,7 @@ smalloc(size_t n) { ptr_t ptr; - n = n ? n : 1; + n = n ? n+1 : 1; - #ifdef HAVE_SBRK + #ifdef USE_SBRK if (membot == NULL) -@@ -512,7 +512,7 @@ srealloc(ptr_t p, size_t n) +@@ -537,7 +537,7 @@ srealloc(ptr_t p, size_t n) { ptr_t ptr; - n = n ? n : 1; + n = n ? n+1 : 1; - #ifdef HAVE_SBRK + #ifdef USE_SBRK if (membot == NULL) -@@ -536,7 +536,7 @@ scalloc(size_t s, size_t n) +@@ -561,7 +561,7 @@ scalloc(size_t s, size_t n) ptr_t ptr; n *= s; - n = n ? n : 1; + n = n ? n+1 : 1; - #ifdef HAVE_SBRK + #ifdef USE_SBRK if (membot == NULL) -@@ -561,8 +561,10 @@ scalloc(size_t s, size_t n) +@@ -586,8 +586,10 @@ scalloc(size_t s, size_t n) void sfree(ptr_t p) { @@ -172,7 +223,7 @@ #endif /* SYSMALLOC */ --- tc.func.c +++ tc.func.c 2007-07-13 11:15:03.000000000 +0000 -@@ -689,9 +689,13 @@ auto_lock(void) +@@ -714,9 +714,13 @@ auto_lock(void) handle_pending_signals(); errno = 0; } @@ -187,7 +238,7 @@ #else -@@ -1905,7 +1909,7 @@ getremotehost(int dest_fd) +@@ -1933,7 +1937,7 @@ getremotehost(int dest_fd) * have not caught up yet. */ addr.s_addr = inet_addr(name); @@ -198,7 +249,7 @@ if (sptr != name) { --- tc.str.c +++ tc.str.c 2006-04-25 12:58:31.000000000 +0000 -@@ -336,7 +336,7 @@ s_strlen(const Char *str) +@@ -342,7 +342,7 @@ s_strlen(const Char *str) { size_t n; @@ -208,8 +259,8 @@ return (n); } --- tc.who.c -+++ tc.who.c 2012-01-16 09:55:14.275144702 +0000 -@@ -277,6 +277,9 @@ watch_login(int force) ++++ tc.who.c 2012-01-16 09:55:14.000000000 +0000 +@@ -280,6 +280,9 @@ watch_login(int force) } stlast = sta.st_mtime; #if defined(HAVE_GETUTENT) || defined(HAVE_GETUTXENT) @@ -221,7 +272,7 @@ if ((utmpfd = xopen(TCSH_PATH_UTMP, O_RDONLY|O_LARGEFILE)) < 0) { --- tcsh.man +++ tcsh.man 2006-04-25 12:58:31.000000000 +0000 -@@ -578,7 +578,7 @@ Repeating \fIdabbrev-expand\fR without a +@@ -579,7 +579,7 @@ Repeating \fIdabbrev-expand\fR without a changes to the next previous word etc., skipping identical matches much like \fIhistory-search-backward\fR does. .TP 8 diff --git a/tcsh-6.18.04.tar.gz b/tcsh-6.18.04.tar.gz new file mode 100644 index 0000000..79b2b74 --- /dev/null +++ b/tcsh-6.18.04.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d4f8684c4773937f30cd1697f22d0d390c7ca8b1104392b02a9cfc732e3e418 +size 946874 diff --git a/tcsh.changes b/tcsh.changes index 6e5ad11..5b0f496 100644 --- a/tcsh.changes +++ b/tcsh.changes @@ -1,3 +1,37 @@ +------------------------------------------------------------------- +Tue May 5 10:16:14 UTC 2015 - werner@suse.de + +- Update tcsh to patch level 6.18.04 - 20150504 + * revert fix echo "\1", it is incorrect. + * revert fix to PR/437, breaks short strings. + +------------------------------------------------------------------- +Mon May 4 10:16:14 UTC 2015 - werner@suse.de + +- Update tcsh to patch level 6.18.03 - 20150503 + * PR/437: Nakajima Akira: Fix segmentation fault reading input files + * PR/291: Print job status messages to stderr. + * Fridolin Pokorny NUL in `` does not mean EOF. + * Pavel Raiskup fix hang with: + while (1) + ( date & ; wait ) + end + * Add cdtohome special variable (Martin Tournoij) + * Fix root prompt char for windows (Corinna Vinschen) + * For "next" completion matches only consider exact matches of the + previous word (Jamie Landeg-Jones) + * Fix echo "\1" for echo_style=both where the first character was + not processed properly (Gary Duzan) +- Remove patches now upstream + * tcsh-6.18.01-blk_buf.patch + * tcsh-6.18.01-metakey.patch +- Rename patches + tcsh-6.17.03-colorls.dif becomes tcsh-6.18.03-colorls.dif + tcsh-6.17.10-catalogs.dif becomes tcsh-6.18.03-catalogs.dif + tcsh-6.18.00-history-file-locking.patch becomes tcsh-6.18.03-history-file-locking.patch + tcsh-6.18.01-history-merge.dif becomes tcsh-6.18.03-history-merge.dif + tcsh-6.18.00.dif becomes tcsh-6.18.03.dif + ------------------------------------------------------------------- Fri Jan 30 13:15:39 UTC 2015 - werner@suse.de diff --git a/tcsh.spec b/tcsh.spec index 57cdf85..ae53228 100644 --- a/tcsh.spec +++ b/tcsh.spec @@ -17,26 +17,24 @@ Name: tcsh -Version: 6.18.01 +Version: 6.18.04 Release: 0 Summary: The C SHell License: BSD-3-Clause Group: System/Shells Url: http://www.tcsh.org/ -Source: ftp.astron.com:/pub/tcsh/tcsh-6.18.01.tar.gz +Source: ftp.astron.com:/pub/tcsh/tcsh-6.18.04.tar.gz Source2: bindkey.tcsh Source3: complete.tcsh -Patch0: tcsh-6.18.00.dif +Patch0: tcsh-6.18.03.dif Patch1: tcsh-6.15.00-pipe.dif Patch2: tcsh-6.16.00-norm-cmd.dif -Patch4: tcsh-6.17.03-colorls.dif +Patch4: tcsh-6.18.03-colorls.dif Patch5: tcsh-6.17.06-dspmbyte.dif -Patch6: tcsh-6.17.10-catalogs.dif -Patch7: tcsh-6.18.01-blk_buf.patch -Patch8: tcsh-6.18.01-metakey.patch +Patch6: tcsh-6.18.03-catalogs.dif # PATCH-FIX-SUSE add history file locking (bsc#901076) -Patch9: tcsh-6.18.00-history-file-locking.patch -Patch10: tcsh-6.18.01-history-merge.dif +Patch9: tcsh-6.18.03-history-file-locking.patch +Patch10: tcsh-6.18.03-history-merge.dif BuildRequires: autoconf BuildRequires: ncurses-devel BuildRequires: screen @@ -61,13 +59,12 @@ correction, a history mechanism, job control, and a C-like syntax. %patch4 -b .colorls %patch5 -b .dspmbyte %patch6 -b .catalogs -%patch7 -b .blk_buf -%patch8 -b .metakey -%patch9 -p1 -b .histlock +%patch9 -b .histlock %patch10 -b .histmerg %patch0 -b .0 %build + cflags () { local flag=$1; shift