Hi Bruno, On 5/20/24 3:28 AM, Bruno Haible wrote: >> It looks like the current code wants drive-prefixes accepted, i.e. >> 'c:/ugly/windows/stuff'. > > ?? I don't see such code in gnulib/lib/getusershell.c.
It is defined in the 'ADDITIONAL_DEFAULT_SHELLS' macro [1]: #if ! defined ADDITIONAL_DEFAULT_SHELLS && defined __MSDOS__ # define ADDITIONAL_DEFAULT_SHELLS \ "c:/dos/command.com", "c:/windows/command.com", "c:/command.com", #else # define ADDITIONAL_DEFAULT_SHELLS /* empty */ #endif /* List of shells to use if the shells file is missing. */ static char const* const default_shells[] = { ADDITIONAL_DEFAULT_SHELLS "/bin/sh", "/bin/csh", "/usr/bin/sh", "/usr/bin/csh", NULL }; >> That sort of breaks the behavior of glibc and BSD where: >> >> input -> getusershell () output >> 'bin/bash' -> '/bash' > > ?? The code in gnulib/lib/getusershell.c does not test for a '/'. I probably explained it poorly, sorry. Perhaps the important section of code in glibc will help explain [2]. I was trying to point out that glibc and BSD will only return absolute file names. Since they do not target Windows that means just looking for a '/'. Here is a test program: ===================== #define _GNU_SOURCE 1 #include <stdlib.h> #include <stdio.h> #include <unistd.h> int main (void) { char *p; while ((p = getusershell ())) printf ("%s\n", p); return 0; } ===================== My /etc/shells: ===================== this-part-gets-removed/this-doesn't/bash /bin/sh ===================== And then the program output: $ uname -o GNU/Linux $ ./a.out /this-doesn't/bash /bin/sh The file format isn't very well defined, in my opinion [3]. I think the common assumption is that administrators put sane absolute file names one-per-line. Like this: /bin/bash /bin/sh /bin/ksh /usr/bin/csh The other patch I sent would behave similarly enough to glibc and BSD in my opinion while allowing for drive prefixes on Windows and spaces since I think they are common there. The removal of the first non-absolute part is strange in my opinion. Collin [1] https://git.savannah.gnu.org/cgit/gnulib.git/tree/lib/getusershell.c#n48 [2] https://sourceware.org/git/?p=glibc.git;a=blob;f=misc/getusershell.c;h=4221095dca743dfa5067637f1aad4651bd5cf279;hb=2be3352f0b1ebaa39596393fffe1062275186669#l130 [3] https://man.freebsd.org/cgi/man.cgi?query=shells&sektion=5&apropos=0&manpath=FreeBSD+14.0-RELEASE+and+Ports