On Fri, Jan 17, 2025 at 03:14:55PM +0100, Alejandro Colomar wrote: > Curiously, my system is also limited to 255 for tmpfs filesystems but > yours is not? I still get longer paths rejected. That was my mistake. Running your program confirms that tmpfs filenames are limited to 255 bytes as well. I had originally assumed that /tmp was tmpfs on my system, but it was actually bcachefs which has a _PC_NAME_MAX of 512. > Doesn't iconv(3) terminate its output? I've never used that API, so I > don't know. I thought that at first because I hadn’t ever used iconv(3) either. I created a test program in order to make sure that it doesn’t terminate its output: $ cat iconv_termination_test.c #include <err.h> #include <iconv.h> #include <langinfo.h> #include <locale.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <uchar.h> #define NELEMS(a) (sizeof(a) / sizeof(a[0])) void display_memory(char *memory_block, size_t len) { for (size_t i = 0; i < len; i++) { printf("%02hhX ", memory_block[i]); } printf("\n"); } int main(void) { char32_t utf32_pathname[] = U"example"; size_t pathname_len = NELEMS(utf32_pathname) - 1; size_t utf8_pathname_size = pathname_len * 4 + 1; char *utf8_pathname = malloc(utf8_pathname_size); if (utf8_pathname == NULL) { err(EXIT_FAILURE, "calloc"); } memset(utf8_pathname, 0xFF, utf8_pathname_size); printf("utf8_pathname before calling iconv: "); display_memory(utf8_pathname, utf8_pathname_size); iconv_t cd = iconv_open("UTF-8", "UTF-32"); if (cd == (iconv_t) - 1) { err(EXIT_FAILURE, "iconv_open"); } char *inbuf = (char *) utf32_pathname; size_t inbytesleft = pathname_len * (sizeof *utf32_pathname); char *outbuf = utf8_pathname; size_t outbytesleft = utf8_pathname_size; size_t iconv_result; while (inbytesleft > 0) { iconv_result = iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); if (iconv_result == -1) { err(EXIT_FAILURE, "iconv"); } } iconv_result = iconv(cd, NULL, &inbytesleft, &outbuf, &outbytesleft); if (iconv_result == -1) { err(EXIT_FAILURE, "iconv"); } if (iconv_close(cd) == -1) { err(EXIT_FAILURE, "iconv_close"); } printf("utf8_pathname after calling iconv: "); display_memory(utf8_pathname, utf8_pathname_size); free(utf8_pathname); exit(EXIT_SUCCESS); } $ gcc -Wall iconv_termination_test.c $ ./a.out utf8_pathname before calling iconv: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF utf8_pathname after calling iconv: 65 78 61 6D 70 6C 65 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF $