X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Flocalcharset.c;h=e80a2c523991aea41240bc26e21ea2960a9fe05b;hb=9b1445bd01af11c9c2b508e2c642fa415fb9c829;hp=0005910b2c9f3e347a1a844c54a0bcd208113db3;hpb=7f69123abb161efe4940eae05ee962d8983759ad;p=gnulib.git diff --git a/lib/localcharset.c b/lib/localcharset.c index 0005910b2..e80a2c523 100644 --- a/lib/localcharset.c +++ b/lib/localcharset.c @@ -23,9 +23,16 @@ # include #endif -#include +#if HAVE_STDDEF_H +# include +#endif + #include -#include +#if HAVE_STRING_H +# include +#else +# include +#endif #if HAVE_STDLIB_H # include #endif @@ -38,9 +45,17 @@ # endif #endif +#include "path-concat.h" + char *xmalloc (); char *xrealloc (); +/* The following static variable is declared 'volatile' to avoid a + possible multithread problem in the function get_charset_aliases. If we + are running in a threaded environment, and if two threads initialize + 'charset_aliases' simultaneously, both will produce the same value, + and everything will be ok if the two assignments to 'charset_aliases' + are atomic. But I don't know what will happen if the two assignments mix. */ /* Pointer to the contents of the charset.alias file, if it has already been read, else NULL. Its format is: ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ @@ -56,10 +71,10 @@ get_charset_aliases () if (cp == NULL) { FILE *fp; + char *file_name = path_concat (LIBDIR, "charset.alias", NULL); - fp = fopen (LIBDIR "/" "charset.alias", "r"); - if (fp == NULL) - /* File not found, treat it as empty. */ + if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) + /* Out of memory or file not found, treat it as empty. */ cp = ""; else { @@ -117,6 +132,8 @@ get_charset_aliases () } charset_aliases = cp; + if (file_name != NULL) + free (file_name); } return cp;