zsh: el shell de login del usuario, que no tenía receta en ninguna de las cinco colas

Salió de barrer la máquina del usuario y cruzar sus 481 paquetes explícitos contra las
1181 recetas del corpus y las cuatro colas. zsh es su shell —medido en su historial: 1611
`cd`, 1054 `cargo`, 134 `zellij`— y no estaba en ningún lado. Una imagen de takana
instalada en su laptop lo dejaba en bash: funciona, pero no es su máquina.

Es el mismo hueco de RUNTIME que bash-completion: nadie lo alcanza por deps de build, así
que ninguna métrica de deuda puede verlo. Sólo se ve mirando la máquina de quien la usa.

Sus tres deps ya estaban selladas (ncurses, pcre2, libcap) ⇒ no arrastra tanda.

Los seis parches son de main/zsh de aports y son el trabajo de portabilidad a musl que un
import de nix pierde. implicit.patch (16 K) es el gordo: declaraciones implícitas que
gcc14/clang rechazan como error.

⚠ RIESGO CONOCIDO para el primer build, heredado de bash.toml: si el configure mete
-rdynamic en la línea de enlace, el wrapper de cc del lab tira el -static y el binario sale
contra libncursesw.so.6, que NINGÚN artefacto del corpus provee ⇒ arrancaría en el sandbox
de Alpine y no dentro de una imagen de takana. Síntoma: `Error relocating ... symbol not
found`. El arreglo de bash fue `make LOCAL_LDFLAGS=` y vale igual. Verificar el primer
artefacto con `file`: debe decir `statically linked`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-16 15:12:08 -04:00
co-authored by Claude Opus 5
parent 099226b2d1
commit 38c2874e48
7 changed files with 841 additions and 0 deletions
@@ -0,0 +1,84 @@
From 1e52cd968d7ffd9da3249ef01f6c41f8b29e4df3 Mon Sep 17 00:00:00 2001
From: Bart Schaefer <schaefer@zsh.org>
Date: Sun, 22 May 2022 15:50:45 -0700
Subject: [PATCH] 50278: use `man -w` in preference to `manpath`; fix caching
and precedence of -M
---
ChangeLog | 5 ++++
Completion/Unix/Command/_man | 45 ++++++++++++++++++++++--------------
2 files changed, 33 insertions(+), 17 deletions(-)
diff --git a/Completion/Unix/Command/_man b/Completion/Unix/Command/_man
index dba1d13dc..190811e41 100644
--- a/Completion/Unix/Command/_man
+++ b/Completion/Unix/Command/_man
@@ -16,7 +16,7 @@
_man() {
local dirs expl mrd awk variant noinsert
local -a context line state state_descr args modes
- local -aU sects
+ local -aU sects _manpath
local -A opt_args val_args sect_descs
if [[ $service == man ]]; then
@@ -168,29 +168,40 @@ _man() {
_arguments -s -S : $args '*::: :->man' && return 0
[[ -n $state ]] || return 1
+ # Override man path
+ [[ -n ${opt_args[-M]} ]] &&
+ _manpath=( ${(s<:>)opt_args[-M]} )
+
+ # Restore cached man path to avoid $(manpath) if we can
if (( ! $#_manpath )); then
- local mp
- mp=( ${(s.:.)$(manpath 2>/dev/null)} )
- [[ "$mp" == *:* ]] && mp=( ${(s.:.)mp} )
- if (( $#mp )); then
- _manpath=( $mp )
- elif (( $#manpath )); then
- _manpath=( $manpath )
+ if (( ! $+_manpath_cache )); then
+ typeset -gHA _manpath_cache
fi
+ if [[ -z $_manpath_cache[$MANPATH] ]]; then
+ local mp
+ mp=( ${(s.:.)$({ command man -w || manpath } 2>/dev/null)} )
+ [[ "$mp" == *:* ]] && mp=( ${(s.:.)mp} )
+ if (( $#mp )); then
+ _manpath_cache[$MANPATH]=${(j.:.)mp}
+ elif (( $#manpath )); then
+ _manpath_cache[$MANPATH]=$MANPATH
+ fi
+ fi
+ _manpath=( ${(s.:.)_manpath_cache[$MANPATH]} )
+ fi
+
+ # Augment man path
+ if [[ -n ${opt_args[-m]} ]]; then
+ [[ $variant == (netbsd|openbsd)* ]] &&
+ _manpath+=( ${(s<:>)opt_args[-m]} )
+ elif [[ $variant == aix* ]]; then
+ # _manpath declared -U so no need to test
+ _manpath+=( /usr/share/man )
fi
(( $#_manpath )) ||
_manpath=( /usr/man(-/) /(opt|usr)/(pkg|dt|share|X11R6|local)/(cat|)man(-/) )
- # Override man path
- [[ -n ${opt_args[-M]} ]] &&
- _manpath=( ${(s<:>)opt_args[-M]} )
-
- # Augment man path
- [[ $variant == (netbsd|openbsd)* ]] &&
- [[ -n ${opt_args[-m]} ]] &&
- _manpath+=( ${(s<:>)opt_args[-m]} )
-
# `sman' is the SGML manual directory for Solaris 7.
# 1M is system administrator commands on SVR4
--
2.48.1
@@ -0,0 +1,38 @@
diff --git a/configure.ac b/configure.ac
index 0760346..be5dbd9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1761,27 +1761,27 @@ if test x$zsh_cv_path_term_header != xnone; then
fi
AC_MSG_CHECKING(if boolcodes is available)
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = boolcodes; puts(*test);]])],[AC_DEFINE(HAVE_BOOLCODES) boolcodes=yes],[boolcodes=no])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = (char **)boolcodes; puts(*test);]])],[AC_DEFINE(HAVE_BOOLCODES) boolcodes=yes],[boolcodes=no])
AC_MSG_RESULT($boolcodes)
AC_MSG_CHECKING(if numcodes is available)
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = numcodes; puts(*test);]])],[AC_DEFINE(HAVE_NUMCODES) numcodes=yes],[numcodes=no])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = (char **)numcodes; puts(*test);]])],[AC_DEFINE(HAVE_NUMCODES) numcodes=yes],[numcodes=no])
AC_MSG_RESULT($numcodes)
AC_MSG_CHECKING(if strcodes is available)
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = strcodes; puts(*test);]])],[AC_DEFINE(HAVE_STRCODES) strcodes=yes],[strcodes=no])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = (char **)strcodes; puts(*test);]])],[AC_DEFINE(HAVE_STRCODES) strcodes=yes],[strcodes=no])
AC_MSG_RESULT($strcodes)
AC_MSG_CHECKING(if boolnames is available)
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = boolnames; puts(*test);]])],[AC_DEFINE(HAVE_BOOLNAMES) boolnames=yes],[boolnames=no])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = (char **)boolnames; puts(*test);]])],[AC_DEFINE(HAVE_BOOLNAMES) boolnames=yes],[boolnames=no])
AC_MSG_RESULT($boolnames)
AC_MSG_CHECKING(if numnames is available)
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = numnames; puts(*test);]])],[AC_DEFINE(HAVE_NUMNAMES) numnames=yes],[numnames=no])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = (char **)numnames; puts(*test);]])],[AC_DEFINE(HAVE_NUMNAMES) numnames=yes],[numnames=no])
AC_MSG_RESULT($numnames)
AC_MSG_CHECKING(if strnames is available)
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = strnames; puts(*test);]])],[AC_DEFINE(HAVE_STRNAMES) strnames=yes],[strnames=no])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = (char **)strnames; puts(*test);]])],[AC_DEFINE(HAVE_STRNAMES) strnames=yes],[strnames=no])
AC_MSG_RESULT($strnames)
dnl There are apparently defective terminal library headers on some
+550
View File
@@ -0,0 +1,550 @@
https://bugs.gentoo.org/869539
https://www.zsh.org/mla/workers/2022/msg00964.html
--- a/configure.ac
+++ b/configure.ac
@@ -583,11 +583,11 @@ if test x$zsh_cv_c_have_union_init = xye
fi
dnl Checking if compiler correctly cast signed to unsigned.
AC_CACHE_CHECK(if signed to unsigned casting is broken,
zsh_cv_c_broken_signed_to_unsigned_casting,
-[AC_RUN_IFELSE([AC_LANG_SOURCE([[main(){return((int)(unsigned char)((char) -1) == 255);}]])],[zsh_cv_c_broken_signed_to_unsigned_casting=yes],[zsh_cv_c_broken_signed_to_unsigned_casting=no],[zsh_cv_c_broken_signed_to_unsigned_casting=no])])
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[int main(){return((int)(unsigned char)((char) -1) == 255);}]])],[zsh_cv_c_broken_signed_to_unsigned_casting=yes],[zsh_cv_c_broken_signed_to_unsigned_casting=no],[zsh_cv_c_broken_signed_to_unsigned_casting=no])])
AH_TEMPLATE([BROKEN_SIGNED_TO_UNSIGNED_CASTING],
[Define to 1 if compiler incorrectly cast signed to unsigned.])
if test x$zsh_cv_c_broken_signed_to_unsigned_casting = xyes; then
AC_DEFINE(BROKEN_SIGNED_TO_UNSIGNED_CASTING)
fi
@@ -1044,21 +1044,21 @@ if test x$zsh_cv_long_is_64_bit = xyes;
else
AC_CACHE_CHECK(if off_t is 64 bit, zsh_cv_off_t_is_64_bit,
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <sys/types.h>
-main() { return sizeof(off_t) < 8; }
+int main() { return sizeof(off_t) < 8; }
]])],[zsh_cv_off_t_is_64_bit=yes],[zsh_cv_off_t_is_64_bit=no],[zsh_cv_off_t_is_64_bit=no])])
if test x$zsh_cv_off_t_is_64_bit = xyes; then
AC_DEFINE(OFF_T_IS_64_BIT)
fi
AC_CACHE_CHECK(if ino_t is 64 bit, zsh_cv_ino_t_is_64_bit,
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <sys/types.h>
-main() { return sizeof(ino_t) < 8; }
+int main() { return sizeof(ino_t) < 8; }
]])],[zsh_cv_ino_t_is_64_bit=yes],[zsh_cv_ino_t_is_64_bit=no],[zsh_cv_ino_t_is_64_bit=no])])
if test x$zsh_cv_ino_t_is_64_bit = xyes; then
AC_DEFINE(INO_T_IS_64_BIT)
fi
@@ -1394,22 +1394,22 @@ zsh_cv_func_tgetent_accepts_null,
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <fcntl.h>
#include <stdlib.h>
int tgetent(char *, char *);
char *tgetstr(char *, char **);
-main()
+int main()
{
char buf[4096];
int r1 = tgetent(buf, "vt100");
int r2 = tgetent((char*)0,"vt100");
if (r1 >= 0 && r1 == r2) {
char tbuf[1024], *u;
u = tbuf;
tgetstr("cl", &u);
creat("conftest.tgetent", 0640);
}
- exit((r1 != r2) || r2 == -1);
+ return((r1 != r2) || r2 == -1);
}
]])],[if test -f conftest.tgetent; then
zsh_cv_func_tgetent_accepts_null=yes
else
zsh_cv_func_tgetent_accepts_null=no
@@ -1422,22 +1422,22 @@ zsh_cv_func_tgetent_zero_success,
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <fcntl.h>
#include <stdlib.h>
int tgetent(char *, char*);
char *tgetstr(char *, char **);
-main()
+int main()
{
char buf[4096];
int r1 = tgetent(buf, "!@#$%^&*");
int r2 = tgetent(buf, "vt100");
if (r1 < 0 && r2 == 0) {
char tbuf[1024], *u;
u = tbuf;
tgetstr("cl", &u);
creat("conftest.tgetent0", 0640);
}
- exit(r1 == r2);
+ return(r1 == r2);
}
]])],[if test -f conftest.tgetent0; then
zsh_cv_func_tgetent_zero_success=yes
else
zsh_cv_func_tgetent_zero_success=no
@@ -1860,27 +1860,27 @@ zsh_cv_rlim_t_is_longer,
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#include <sys/resource.h>
#include <stdlib.h>
-main(){struct rlimit r;exit(sizeof(r.rlim_cur) <= sizeof(long));}]])],[zsh_cv_rlim_t_is_longer=yes],[zsh_cv_rlim_t_is_longer=no],[zsh_cv_rlim_t_is_longer=yes])])
+int main(){struct rlimit r;return(sizeof(r.rlim_cur) <= sizeof(long));}]])],[zsh_cv_rlim_t_is_longer=yes],[zsh_cv_rlim_t_is_longer=no],[zsh_cv_rlim_t_is_longer=yes])])
if test x$zsh_cv_rlim_t_is_longer = xyes; then
AC_CACHE_CHECK(if rlim_t is a quad,
zsh_cv_rlim_t_is_quad_t,
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#include <stdio.h>
#include <sys/resource.h>
#include <stdlib.h>
-main() {
+int main() {
struct rlimit r;
char buf[20];
r.rlim_cur = 0;
sprintf(buf, "%qd", r.rlim_cur);
- exit(strcmp(buf, "0"));
+ return(strcmp(buf, "0"));
}]])],[zsh_cv_rlim_t_is_quad_t=yes],[zsh_cv_rlim_t_is_quad_t=no],[zsh_cv_rlim_t_is_quad_t=no])])
if test x$zsh_cv_rlim_t_is_quad_t = xyes; then
AC_DEFINE(RLIM_T_IS_QUAD_T)
DEFAULT_RLIM_T=quad_t
else
@@ -1894,11 +1894,11 @@ else
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#include <sys/resource.h>
#include <stdlib.h>
- main(){struct rlimit r;r.rlim_cur=-1;exit(r.rlim_cur<0);}]])],[zsh_cv_type_rlim_t_is_unsigned=yes],[zsh_cv_type_rlim_t_is_unsigned=no],[zsh_cv_type_rlim_t_is_unsigned=no])])
+ int main(){struct rlimit r;r.rlim_cur=-1;return(r.rlim_cur<0);}]])],[zsh_cv_type_rlim_t_is_unsigned=yes],[zsh_cv_type_rlim_t_is_unsigned=no],[zsh_cv_type_rlim_t_is_unsigned=no])])
if test x$zsh_cv_type_rlim_t_is_unsigned = xyes; then
AC_DEFINE(RLIM_T_IS_UNSIGNED)
DEFAULT_RLIM_T="unsigned $DEFAULT_RLIM_T"
fi
fi
@@ -2175,11 +2175,11 @@ zsh_cv_sys_fifo,
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
-main()
+int main()
{
char c;
int fd;
int pid, ret;
unlink("/tmp/fifo$$");
@@ -2189,19 +2189,19 @@ main()
if(mknod("/tmp/fifo$$", 0010600, 0) < 0)
#endif
exit(1);
pid = fork();
if(pid < 0)
- exit(1);
+ return(1);
if(pid) {
fd = open("/tmp/fifo$$", O_RDONLY);
- exit(fd < 0 || read(fd, &c, 1) != 1 || c != 'x');
+ return(fd < 0 || read(fd, &c, 1) != 1 || c != 'x');
}
fd = open("/tmp/fifo$$", O_WRONLY);
ret = (fd < 0 || write(fd, "x", 1) < 1);
unlink("/tmp/fifo$$");
- exit(ret);
+ return(ret);
}
]])],[zsh_cv_sys_fifo=yes],[zsh_cv_sys_fifo=no],[zsh_cv_sys_fifo=yes])
])
AH_TEMPLATE([HAVE_FIFOS],
[Define to 1 if system has working FIFOs.])
@@ -2276,24 +2276,24 @@ AC_CACHE_CHECK(if link() works,
zsh_cv_sys_link,
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
-main()
+int main()
{
int ret;
char *tmpfile, *newfile;
tmpfile="/tmp/zsh.linktest$$";
newfile="/tmp/zsh.linktest2$$";
unlink(tmpfile);
unlink(newfile);
if(creat(tmpfile, 0644) < 0)
- exit(1);
+ return(1);
ret = link(tmpfile, newfile);
unlink(tmpfile);
unlink(newfile);
- exit(ret<0);
+ return(ret<0);
}
]])],[zsh_cv_sys_link=yes],[zsh_cv_sys_link=no],[zsh_cv_sys_link=yes])])
AH_TEMPLATE([HAVE_LINK],
[Define to 1 if system has working link().])
if test x$zsh_cv_sys_link = xyes; then
@@ -2309,15 +2309,15 @@ zsh_cv_sys_killesrch,
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <stdlib.h>
-main()
+int main()
{
int pid = (getpid() + 10000) & 0xffffff;
while (pid && (kill(pid, 0) == 0 || errno != ESRCH)) pid >>= 1;
- exit(errno!=ESRCH);
+ return(errno!=ESRCH);
}
]])],[zsh_cv_sys_killesrch=yes],[zsh_cv_sys_killesrch=no],[zsh_cv_sys_killesrch=yes])])
AH_TEMPLATE([BROKEN_KILL_ESRCH],
[Define to 1 if kill(pid, 0) doesn't return ESRCH, ie BeOS R4.51.])
if test x$zsh_cv_sys_killesrch = xno; then
@@ -2339,11 +2339,11 @@ if test x$signals_style = xPOSIX_SIGNALS
#include <stdlib.h>
int child=0;
void handler(sig)
int sig;
{if(sig==SIGCHLD) child=1;}
-main() {
+int main() {
struct sigaction act;
sigset_t set;
int pid, ret;
act.sa_handler = &handler;
sigfillset(&act.sa_mask);
@@ -2354,11 +2354,11 @@ main() {
pid=fork();
if(pid==0) return 0;
if(pid>0) {
sigemptyset(&set);
ret=sigsuspend(&set);
- exit(child==0);
+ return(child==0);
}
}
]])],[zsh_cv_sys_sigsuspend=yes],[zsh_cv_sys_sigsuspend=no],[zsh_cv_sys_sigsuspend=yes])])
if test x$zsh_cv_sys_sigsuspend = xno; then
AC_DEFINE(BROKEN_POSIX_SIGSUSPEND)
@@ -2387,18 +2387,18 @@ case "x$zsh_working_tcsetpgrp" in
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
-main() {
+int main() {
int fd;
int ret;
fd=open("/dev/tty", O_RDWR);
if (fd < 0) exit(2);
ret=tcsetpgrp(fd, tcgetpgrp(fd));
if (ret < 0) exit(1);
- exit(0);
+ return(0);
}
]])],[zsh_cv_sys_tcsetpgrp=yes],[
case $? in
1) zsh_cv_sys_tcsetpgrp=no;;
2) zsh_cv_sys_tcsetpgrp=notty;;
@@ -2434,19 +2434,19 @@ if test x$ac_cv_func_getpwnam = xyes; th
#include <pwd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
-main() {
+int main() {
struct passwd *pw1, *pw2;
char buf[1024], name[1024];
sprintf(buf, "%d:%d", getpid(), rand());
pw1=getpwnam(buf);
if (pw1) strcpy(name, pw1->pw_name);
sprintf(buf, "%d:%d", rand(), getpid());
pw2=getpwnam(buf);
- exit(pw1!=0 && pw2!=0 && !strcmp(name, pw2->pw_name));
+ return(pw1!=0 && pw2!=0 && !strcmp(name, pw2->pw_name));
}
]])],[zsh_cv_sys_getpwnam_faked=no],[zsh_cv_sys_getpwnam_faked=yes],[zsh_cv_sys_getpwnam_faked=no])])
if test x$zsh_cv_sys_getpwnam_faked = xyes; then
AC_DEFINE(GETPWNAM_FAKED)
fi
@@ -2763,22 +2763,20 @@ elif test "x$dynamic" = xyes; then
zsh_cv_sys_elf,
[AC_RUN_IFELSE([AC_LANG_SOURCE([[/* Test for whether ELF binaries are produced */
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
-main(argc, argv)
-int argc;
-char *argv[];
+int main(int argc, char *argv[])
{
char b[4];
int i = open(argv[0],O_RDONLY);
if(i == -1)
exit(1); /* fail */
if(read(i,b,4)==4 && b[0]==127 && b[1]=='E' && b[2]=='L' && b[3]=='F')
- exit(0); /* succeed (yes, it's ELF) */
+ return(0); /* succeed (yes, it's ELF) */
else
- exit(1); /* fail */
+ return(1); /* fail */
}]])],[zsh_cv_sys_elf=yes],[zsh_cv_sys_elf=no],[zsh_cv_sys_elf=yes])])
# We use [0-9]* in case statements, so need to change quoting
changequote(, )
@@ -2908,11 +2908,11 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
EXTRA_LDFLAGS="${EXTRA_LDFLAGS=-rdynamic}"],[zsh_cvs_rdynamic_available=no])
LDFLAGS="$old_LDFLAGS")
AC_CACHE_CHECK(if your dlsym() needs a leading underscore,
zsh_cv_func_dlsym_needs_underscore,
[echo failed >conftestval && cat >conftest.c <<EOM
-fred () { }
+void fred () { }
EOM
AC_TRY_COMMAND($CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest.c 1>&AS_MESSAGE_LOG_FD) &&
AC_TRY_COMMAND($DLLD $LDFLAGS $DLLDFLAGS -o conftest.$DL_EXT conftest.o 1>&AS_MESSAGE_LOG_FD) &&
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <stdio.h>
@@ -2943,34 +2941,34 @@ char *zsh_gl_sym_addr ;
#define RTLD_LAZY 1
#endif
extern int fred() ;
-main()
+int main()
{
void * handle ;
void * symbol ;
FILE *f=fopen("conftestval", "w");
if (!f) exit(1);
handle = dlopen("./conftest.$DL_EXT", RTLD_LAZY) ;
if (handle == NULL) {
fprintf (f, "dlopen failed") ;
- exit(1);
+ return(1);
}
symbol = dlsym(handle, "fred") ;
if (symbol == NULL) {
/* try putting a leading underscore */
symbol = dlsym(handle, "_fred") ;
if (symbol == NULL) {
fprintf (f, "dlsym failed") ;
- exit(1);
+ return(1);
}
fprintf (f, "yes") ;
}
else
fprintf (f, "no") ;
- exit(0);
+ return(0);
}]])],[zsh_cv_func_dlsym_needs_underscore=`cat conftestval`],[zsh_cv_func_dlsym_needs_underscore=failed
dynamic=no],[zsh_cv_func_dlsym_needs_underscore=no])])
if test "x$zsh_cv_func_dlsym_needs_underscore" = xyes; then
AC_DEFINE(DLSYM_NEEDS_UNDERSCORE)
elif test "x$zsh_cv_func_dlsym_needs_underscore" != xno; then
--- a/aczsh.m4.old
+++ b/aczsh.m4
@@ -42,10 +42,11 @@ AC_DEFUN(zsh_64_BIT_TYPE,
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
+int
main()
{
$1 foo = 0;
int bar = (int) foo;
return sizeof($1) != 8;
@@ -144,33 +145,34 @@ char *zsh_gl_sym_addr ;
#endif
#ifndef RTLD_GLOBAL
#define RTLD_GLOBAL 0
#endif
+int
main()
{
void *handle1, *handle2;
void *(*zsh_getaddr1)(), *(*zsh_getaddr2)();
void *sym1, *sym2;
handle1 = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle1) exit(1);
+ if(!handle1) return(1);
handle2 = dlopen("./conftest2.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle2) exit(1);
+ if(!handle2) return(1);
zsh_getaddr1 = (void *(*)()) dlsym(handle1, "${us}zsh_getaddr1");
zsh_getaddr2 = (void *(*)()) dlsym(handle2, "${us}zsh_getaddr2");
sym1 = zsh_getaddr1();
sym2 = zsh_getaddr2();
- if(!sym1 || !sym2) exit(1);
- if(sym1 != sym2) exit(1);
+ if(!sym1 || !sym2) return(1);
+ if(sym1 != sym2) return(1);
dlclose(handle1);
handle1 = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle1) exit(1);
+ if(!handle1) return(1);
zsh_getaddr1 = (void *(*)()) dlsym(handle1, "${us}zsh_getaddr1");
sym1 = zsh_getaddr1();
- if(!sym1) exit(1);
- if(sym1 != sym2) exit(1);
- exit(0);
+ if(!sym1) return(1);
+ if(sym1 != sym2) return(1);
+ return(0);
}
]])],[zsh_cv_shared_$1=yes],
[zsh_cv_shared_$1=no],
[zsh_cv_shared_$1=no]
)
@@ -226,23 +228,23 @@ char *zsh_gl_sym_addr ;
#endif
#ifndef RTLD_GLOBAL
#define RTLD_GLOBAL 0
#endif
-
+int
main()
{
void *handle1, *handle2;
int (*fred1)(), (*fred2)();
handle1 = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle1) exit(1);
+ if(!handle1) return(1);
handle2 = dlopen("./conftest2.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle2) exit(1);
+ if(!handle2) return(1);
fred1 = (int (*)()) dlsym(handle1, "${us}fred");
fred2 = (int (*)()) dlsym(handle2, "${us}fred");
- if(!fred1 || !fred2) exit(1);
- exit((*fred1)() != 42 || (*fred2)() != 69);
+ if(!fred1 || !fred2) return(1);
+ return((*fred1)() != 42 || (*fred2)() != 69);
}
]])],[zsh_cv_sys_dynamic_clash_ok=yes],
[zsh_cv_sys_dynamic_clash_ok=no],
[zsh_cv_sys_dynamic_clash_ok=no]
)
@@ -302,21 +304,22 @@ char *zsh_gl_sym_addr ;
#endif
#ifndef RTLD_GLOBAL
#define RTLD_GLOBAL 0
#endif
+int
main()
{
void *handle;
int (*barneysym)();
handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle) exit(1);
+ if(!handle) return(1);
handle = dlopen("./conftest2.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle) exit(1);
+ if(!handle) return(1);
barneysym = (int (*)()) dlsym(handle, "${us}barney");
- if(!barneysym) exit(1);
- exit((*barneysym)() != 69);
+ if(!barneysym) return(1);
+ return((*barneysym)() != 69);
}
]])],[zsh_cv_sys_dynamic_rtld_global=yes],
[zsh_cv_sys_dynamic_rtld_global=no],
[zsh_cv_sys_dynamic_rtld_global=no]
)
@@ -372,19 +375,20 @@ char *zsh_gl_sym_addr ;
#endif
#ifndef RTLD_GLOBAL
#define RTLD_GLOBAL 0
#endif
+int
main()
{
void *handle;
int (*barneysym)();
handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle) exit(1);
+ if(!handle) return(1);
barneysym = (int (*)()) dlsym(handle, "${us}barney");
- if(!barneysym) exit(1);
- exit((*barneysym)() != 69);
+ if(!barneysym) return(1);
+ return((*barneysym)() != 69);
}
int fred () { return 42; }
]])],[zsh_cv_sys_dynamic_execsyms=yes],
[zsh_cv_sys_dynamic_execsyms=no],
@@ -446,19 +450,20 @@ char *zsh_gl_sym_addr ;
#endif
#ifndef RTLD_GLOBAL
#define RTLD_GLOBAL 0
#endif
+int
main()
{
void *handle;
int (*barneysym)();
handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle) exit(1);
+ if(!handle) return(1);
barneysym = (int (*)()) dlsym(handle, "${us}barney");
- if(!barneysym) exit(1);
- exit((*barneysym)() != 69);
+ if(!barneysym) return(1);
+ return((*barneysym)() != 69);
}
int fred () { return 42; }
]])],[zsh_cv_sys_dynamic_strip_exe=yes],
[zsh_cv_sys_dynamic_strip_exe=no],
@@ -514,19 +519,20 @@ char *zsh_gl_sym_addr ;
#endif
#ifndef RTLD_GLOBAL
#define RTLD_GLOBAL 0
#endif
+int
main()
{
void *handle;
int (*fredsym)();
handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle) exit(1);
+ if(!handle) return(1);
fredsym = (int (*)()) dlsym(handle, "${us}fred");
- if(!fredsym) exit(1);
- exit((*fredsym)() != 42);
+ if(!fredsym) return(1);
+ return((*fredsym)() != 42);
}
]])],[zsh_cv_sys_dynamic_strip_lib=yes],
[zsh_cv_sys_dynamic_strip_lib=no],
[zsh_cv_sys_dynamic_strip_lib=no]
)
+25
View File
@@ -0,0 +1,25 @@
From: Jakub Jirutka <jakub@jirutka.cz>
Date: Sun, 03 Jul 2022 01:52:19 +0200
Subject: Skip test case in E02xtrace failing on musl
--- a/Test/E02xtrace.ztst
+++ b/Test/E02xtrace.ztst
@@ -150,7 +150,6 @@
test_cases=(
f # baseline
foo-bar # Dash
- ヌ # Meta (the UTF-8 representation of this character has an 0x83 byte)
\$\'ba\\0z\' # Nul, escaped as though by ${(qqqq)}
)
for 1 in "$test_cases[@]"; do
@@ -172,10 +171,6 @@
> # traced
> echo inner
>}
->$'\M-c\M-\C-C\M-\C-L' () {
-> # traced
-> echo inner
->}
>$'ba\C-@z' () {
> # traced
> echo inner
+29
View File
@@ -0,0 +1,29 @@
Fix tests on a system with a user called "user"
--- a/Test/Y01completion.ztst
+++ b/Test/Y01completion.ztst
@@ -73,16 +73,16 @@
>NO:{file2}
comptesteval $'zstyle -d \'*\' glob'
- comptesteval '_users () { compadd user1 user2 }'
+ comptesteval '_users () { compadd zsh-test-user1 zsh-test-user2 }'
comptest $': ~\t\t\t\t\t'
0:tilde
->line: {: ~user}{}
->line: {: ~user}{}
->NO:{user1}
->NO:{user2}
->line: {: ~user1}{}
->line: {: ~user2}{}
->line: {: ~user1}{}
+>line: {: ~zsh-test-user}{}
+>line: {: ~zsh-test-user}{}
+>NO:{zsh-test-user1}
+>NO:{zsh-test-user2}
+>line: {: ~zsh-test-user1}{}
+>line: {: ~zsh-test-user2}{}
+>line: {: ~zsh-test-user1}{}
comptest $'echo ;:\C-b\C-b\t'
0:directories and files before separator
+17
View File
@@ -0,0 +1,17 @@
From: Jakub Jirutka <jakub@jirutka.cz>
Date: Sun, 13 Mar 2022 22:44:00 +0100
Subject: [PATCH] Recommend alpine-zsh-config in zsh-newuser-install
--- a/Functions/Newuser/zsh-newuser-install
+++ b/Functions/Newuser/zsh-newuser-install
@@ -959,6 +959,10 @@
the file by hand, if so desired).
"
fi
+ print -r "Or you can install Alpine's system-wide Z Shell configuration, which provides
+sensible defaults for a great user experience right out of the box.
+To do this, press (q) and run this command as root: apk add alpine-zsh-config.
+"
read -k key$longprompt
print
+98
View File
@@ -0,0 +1,98 @@
# zsh 5.9 — **el shell del usuario**, y por eso entra al piso y no a los extras.
#
# ══ POR QUÉ ESTA RECETA EXISTE ═════════════════════════════════════════════════════════════════
# Barrido del 2026-09-16 sobre la laptop del usuario: su shell de login es zsh (1611 `cd`, 1054
# `cargo`, 134 `zellij` en el historial), y zsh **no tenía receta en el corpus ni en ninguna de las
# cuatro colas**. Una imagen de takana instalada en esa máquina la dejaba en `bash` — funciona, pero
# no es su máquina. Es el mismo hueco de RUNTIME que `bash-completion` en `[perfil.base]`: nadie lo
# alcanza por deps de build, así que ninguna métrica de deuda podía verlo.
#
# ⚠ **PUNTO DE PARTIDA, NO SELLADA.** Escrita en el laptop, que no tiene lab ni store (su
# `.dev-fs/alpine` tiene 104 paquetes contra los 110 de `lab-toolchain.lock`, así que ni siquiera
# calcula hashes comparables). El primer build va en el worker. Lo que sigue son las trampas
# conocidas de hermanos ya sellados, anotadas para que el primer build no las redescubra.
#
# ══ LOS SEIS PARCHES SON DE ALPINE, Y NO SON OPCIONALES ════════════════════════════════════════
# Vienen de `main/zsh` de aports y son el trabajo de portabilidad a musl que un import de nix
# pierde. `implicit.patch` (16 K) es el gordo: declaraciones implícitas que gcc14/clang rechazan
# como error. Los otros cinco son tests que no aplican fuera de glibc, el instalador de usuario
# nuevo de Alpine, punteros incompatibles de gcc14 y el cacheo de `man -w`.
#
# ══ RIESGO CONOCIDO PARA EL PRIMER BUILD (heredado de bash.toml) ═══════════════════════════════
# `link = "static"` puede salir DINÁMICO igual, como le pasó a bash: si el `configure` mete
# `-rdynamic` en la línea de enlace, el wrapper de cc del lab (`sandbox.rs:597`) tira el `-static`
# inyectado y el binario sale contra `libncursesw.so.6` — que **ningún artefacto del corpus
# provee**, así que arrancaría en el sandbox de Alpine y no dentro de una imagen de takana. El
# síntoma exacto a buscar es `Error relocating ... symbol not found`. Si pasa, el arreglo de bash
# fue `make LOCAL_LDFLAGS=` y vale acá igual.
# Verificar el primer artefacto con `file`: debe decir `statically linked`.
name = "zsh"
version = "5.9"
license = "MIT"
[source]
tarball = "https://sourceforge.net/projects/zsh/files/zsh/5.9/zsh-5.9.tar.xz"
# sha256 calculado sobre el tarball bajado el 2026-09-16 (Alpine publica sha512, no sha256).
sha256 = "9b8d1ecedd5b5e81fbf1918e876752a7dd948e05c1a0dba10ab863842d45acd5"
patches = [
"implicit.patch",
"fix-gcc14-incompatible-pointer-types.patch",
"zsh-newuser-install-alpine.patch",
"0001-50278-use-man-w-in-preference-to-manpath-fix-caching.patch",
"skip-test-failing-on-musl.patch",
"tests-user.patch",
]
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
# Split de la info de depuración (SDD 23 etapa 4). Entra en `hash_inputs`.
strip_debug = true
flags = []
[build.phases]
# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST).
#
# `--enable-function-subdirs` + `--enable-fndir`: zsh instala ~1200 ficheros de funciones en
# `/usr/share/zsh/functions`. NO se recortan: sin ellas no hay `compinit`, y un zsh sin completado
# es justamente lo que el usuario no tiene hoy. Es la lección de CLAUDE.md §3 al revés — acá el
# artefacto "completo" son los datos, no el binario.
#
# `--disable-gdbm` es deliberado: gdbm no está en el corpus y sólo aporta el módulo `zsh/db/gdbm`.
# Encenderlo pediría una receta más para una capacidad que nadie pidió.
compile = '''
_abuild_phase() {
./configure \
--build=$CBUILD \
--host=$CHOST \
--prefix=/usr \
--bindir=/bin \
--enable-etcdir=/etc/zsh \
--enable-pcre \
--enable-cap \
--enable-multibyte \
--enable-function-subdirs \
--enable-fndir=/usr/share/zsh/functions \
--enable-zsh-secure-free \
--disable-gdbm \
--sysconfdir=/etc \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--with-tcsetpgrp
make
}
_abuild_phase
'''
# de package() de Alpine (traducido $pkgdir→/out). Sin locales: el corpus no los hidrata y pesan.
install = '''
_abuild_phase() {
make DESTDIR="/out" install install.info
rm -rf "/out"/usr/share/locale
# `/etc/shells` no se escribe acá: es estado del sistema instalado, no del artefacto.
}
_abuild_phase
'''
[deps]
build = ["binutils", "ncurses", "pcre2", "libcap", "linux-headers", "make"]