nodejs/node · error
U_FILE_ACCESS_ERROR
U_FILE_ACCESS_ERROR
Error message
Error opening <%s>.\n
What it means
While reading the list of input resource files (the file list passed to pkgdata), T_FileStream_open(l->str,"r") failed for one of the listed files. The function sets *status = U_FILE_ACCESS_ERROR and returns immediately, so no resources from any subsequent list files are collected. The name printed is the literal path string from the fileListFiles linked list.
Source
Thrown at deps/icu-small/source/tools/pkgdata/pkgdata.cpp:2057
CharList *l, *tail = nullptr, *tail2 = nullptr;
FileStream *in;
char line[16384];
char *linePtr, *lineNext;
const uint32_t lineMax = 16300;
char *tmp;
int32_t tmpLength = 0;
char *s;
int32_t ln=0; /* line number */
for(l = o->fileListFiles; l; l = l->next) {
if(o->verbose) {
fprintf(stdout, "# pkgdata: Reading %s..\n", l->str);
}
/* TODO: stdin */
in = T_FileStream_open(l->str, "r"); /* open files list */
if(!in) {
fprintf(stderr, "Error opening <%s>.\n", l->str);
*status = U_FILE_ACCESS_ERROR;
return;
}
while(T_FileStream_readLine(in, line, sizeof(line))!=nullptr) { /* for each line */
ln++;
if(uprv_strlen(line)>lineMax) {
fprintf(stderr, "%s:%d - line too long (over %d chars)\n", l->str, static_cast<int>(ln), static_cast<int>(lineMax));
exit(1);
}
/* remove spaces at the beginning */
linePtr = line;
/* On z/OS, disable call to isspace (#9996). Investigate using uprv_isspace instead (#9999) */
#if U_PLATFORM != U_PF_OS390
while(isspace(*linePtr)) {
linePtr++;
}
#endifView on GitHub (pinned to 1b2de5e052)
Solutions
- Run pkgdata from the directory the file list paths are relative to.
- Inspect the file list (the -F argument) and confirm every path exists and is readable.
- Re-run the upstream generator (genrb/make) that should have produced the missing .res files.
- Check read permissions on the listed files: ls -l <path>.
Example fix
# before: pkgdata invoked from wrong dir pkgdata -F reslist.txt -p mypkg # after: cd into the dir the list is relative to cd $OUTDIR && pkgdata -F reslist.txt -p mypkg
Defensive patterns
Strategy: validation
Validate before calling
// Pre-flight: every path in the file list must exist and be readable.
#include <unistd.h>
#include <stdio.h>
bool fileListAllReadable(const char *listFile) {
FILE *f = fopen(listFile, "r");
if (!f) return false;
char line[4096];
bool ok = true;
while (fgets(line, sizeof(line), f)) {
line[strcspn(line, "\r\n")] = 0;
if (line[0] && access(line, R_OK) != 0) { ok = false; break; }
}
fclose(f);
return ok;
} Prevention
- Generate the file list with the same tool that emits the .res files.
- Run pkgdata from the directory the list paths are relative to.
- Validate the list with a pre-flight read check before invoking pkgdata.
- Treat a failed upstream genrb as a build stop, not a warning.
When it happens
Trigger: The file list entry l->str points at a path that does not exist, is not readable by the build user, or is a directory rather than a file. Also triggered by a stale file list referencing files deleted after the list was generated.
Common situations: An ICU data build where the file list (e.g. tmpdata.res or the -F file) lists a .res that a prior gencnval/genrb step failed to emit; running pkgdata from the wrong CWD so relative paths in the list miss; file permissions stripped by a packaging step.
Related errors
- Unable to create map file: %s.\n
- T_FileStream_remove failed to delete %s\n
- T_FileStream_open failed to open %s for writing\n
- Error creating symbolic links of the data library file.
- Unable to open or read \"%s\" option file. status = %s\n
AI-assisted analysis of nodejs/node@1b2de5e052 (2026-08-13).
Data as JSON: /api/errors/d374357449d56d86.
Report an issue: GitHub.