commit 0c78b0bb78d87a7de18726a033d88904f158f0fe Author: Siddhesh Poyarekar Date: Mon Jun 7 14:22:17 2021 +0530 iconvconfig: Make file handling more general purpose Split out configuration file handling code from handle_dir into its own function so that it can be reused for multiple configuration files. Reviewed-by: DJ Delorie diff --git a/iconv/iconvconfig.c b/iconv/iconvconfig.c index b6fef1553cbbdd3d..2b3c587bc77cfdcd 100644 --- a/iconv/iconvconfig.c +++ b/iconv/iconvconfig.c @@ -644,37 +644,17 @@ add_module (char *rp, const char *directory) cost, need_ext); } - -/* Read the config file and add the data for this directory to that. */ -static int -handle_dir (const char *dir) +/* Read a gconv-modules configuration file. */ +static bool +handle_file (const char *dir, const char *infile) { - char *cp; FILE *fp; char *line = NULL; size_t linelen = 0; - size_t dirlen = strlen (dir); - - if (dir[dirlen - 1] != '/') - { - char *newp = (char *) xmalloc (dirlen + 2); - dir = memcpy (newp, dir, dirlen); - newp[dirlen++] = '/'; - newp[dirlen] = '\0'; - } - - char infile[prefix_len + dirlen + sizeof "gconv-modules"]; - cp = infile; - if (dir[0] == '/') - cp = mempcpy (cp, prefix, prefix_len); - strcpy (mempcpy (cp, dir, dirlen), "gconv-modules"); fp = fopen (infile, "r"); if (fp == NULL) - { - error (0, errno, "cannot open `%s'", infile); - return 1; - } + return false; /* No threads present. */ __fsetlocking (fp, FSETLOCKING_BYCALLER); @@ -723,7 +703,42 @@ handle_dir (const char *dir) fclose (fp); - return 0; + return true; +} + +/* Read config files and add the data for this directory to cache. */ +static int +handle_dir (const char *dir) +{ + char *cp; + size_t dirlen = strlen (dir); + bool found = false; + + if (dir[dirlen - 1] != '/') + { + char *newp = (char *) xmalloc (dirlen + 2); + dir = memcpy (newp, dir, dirlen); + newp[dirlen++] = '/'; + newp[dirlen] = '\0'; + } + + char infile[prefix_len + dirlen + sizeof "gconv-modules"]; + cp = infile; + if (dir[0] == '/') + cp = mempcpy (cp, prefix, prefix_len); + strcpy (mempcpy (cp, dir, dirlen), "gconv-modules"); + + found |= handle_file (dir, infile); + + if (!found) + { + error (0, errno, "failed to open gconv configuration file in `%s'", + dir); + error (0, 0, + "ensure that the directory contains a valid gconv-modules file."); + } + + return found ? 0 : 1; }