@@ -252,7 +252,7 @@ static void trapsig(int signum);
252252static void check_ok (void );
253253static char * escape_quotes (const char * src );
254254static int locale_date_order (const char * locale );
255- static bool check_locale_name (int category ,const char * locale ,
255+ static void check_locale_name (int category ,const char * locale ,
256256char * * canonname );
257257static bool check_locale_encoding (const char * locale ,int encoding );
258258static void setlocales (void );
@@ -2529,7 +2529,7 @@ locale_date_order(const char *locale)
25292529}
25302530
25312531/*
2532- *Is the locale name valid for the locale category?
2532+ *Verify that locale nameis valid for the locale category.
25332533 *
25342534 * If successful, and canonname isn't NULL, a malloc'd copy of the locale's
25352535 * canonical name is stored there. This is especially useful for figuring out
@@ -2540,7 +2540,7 @@ locale_date_order(const char *locale)
25402540 *
25412541 * this should match the backend's check_locale() function
25422542 */
2543- static bool
2543+ static void
25442544check_locale_name (int category ,const char * locale ,char * * canonname )
25452545{
25462546char * save ;
@@ -2551,7 +2551,11 @@ check_locale_name(int category, const char *locale, char **canonname)
25512551
25522552save = setlocale (category ,NULL );
25532553if (!save )
2554- return false;/* won't happen, we hope */
2554+ {
2555+ fprintf (stderr ,_ ("%s: setlocale failed\n" ),
2556+ progname );
2557+ exit (1 );
2558+ }
25552559
25562560/* save may be pointing at a modifiable scratch variable, so copy it. */
25572561save = pg_strdup (save );
@@ -2565,16 +2569,34 @@ check_locale_name(int category, const char *locale, char **canonname)
25652569
25662570/* restore old value. */
25672571if (!setlocale (category ,save ))
2572+ {
25682573fprintf (stderr ,_ ("%s: failed to restore old locale \"%s\"\n" ),
25692574progname ,save );
2575+ exit (1 );
2576+ }
25702577free (save );
25712578
2572- /*should we exit here? */
2579+ /*complain if locale wasn't valid */
25732580if (res == NULL )
2574- fprintf (stderr ,_ ("%s: invalid locale name \"%s\"\n" ),
2575- progname ,locale );
2576-
2577- return (res != NULL );
2581+ {
2582+ if (* locale )
2583+ fprintf (stderr ,_ ("%s: invalid locale name \"%s\"\n" ),
2584+ progname ,locale );
2585+ else
2586+ {
2587+ /*
2588+ * If no relevant switch was given on command line, locale is an
2589+ * empty string, which is not too helpful to report. Presumably
2590+ * setlocale() found something it did not like in the environment.
2591+ * Ideally we'd report the bad environment variable, but since
2592+ * setlocale's behavior is implementation-specific, it's hard to
2593+ * be sure what it didn't like. Print a safe generic message.
2594+ */
2595+ fprintf (stderr ,_ ("%s: invalid locale settings; check LANG and LC_* environment variables\n" ),
2596+ progname );
2597+ }
2598+ exit (1 );
2599+ }
25782600}
25792601
25802602/*
@@ -2642,41 +2664,27 @@ setlocales(void)
26422664}
26432665
26442666/*
2645- * canonicalize locale names, andoverride any missing/invalid values from
2646- *our current environment
2667+ * canonicalize locale names, andobtain any missing values from our
2668+ * current environment
26472669 */
26482670
2649- if (check_locale_name (LC_CTYPE ,lc_ctype ,& canonname ))
2650- lc_ctype = canonname ;
2651- else
2652- lc_ctype = pg_strdup (setlocale (LC_CTYPE ,NULL ));
2653- if (check_locale_name (LC_COLLATE ,lc_collate ,& canonname ))
2654- lc_collate = canonname ;
2655- else
2656- lc_collate = pg_strdup (setlocale (LC_COLLATE ,NULL ));
2657- if (check_locale_name (LC_NUMERIC ,lc_numeric ,& canonname ))
2658- lc_numeric = canonname ;
2659- else
2660- lc_numeric = pg_strdup (setlocale (LC_NUMERIC ,NULL ));
2661- if (check_locale_name (LC_TIME ,lc_time ,& canonname ))
2662- lc_time = canonname ;
2663- else
2664- lc_time = pg_strdup (setlocale (LC_TIME ,NULL ));
2665- if (check_locale_name (LC_MONETARY ,lc_monetary ,& canonname ))
2666- lc_monetary = canonname ;
2667- else
2668- lc_monetary = pg_strdup (setlocale (LC_MONETARY ,NULL ));
2671+ check_locale_name (LC_CTYPE ,lc_ctype ,& canonname );
2672+ lc_ctype = canonname ;
2673+ check_locale_name (LC_COLLATE ,lc_collate ,& canonname );
2674+ lc_collate = canonname ;
2675+ check_locale_name (LC_NUMERIC ,lc_numeric ,& canonname );
2676+ lc_numeric = canonname ;
2677+ check_locale_name (LC_TIME ,lc_time ,& canonname );
2678+ lc_time = canonname ;
2679+ check_locale_name (LC_MONETARY ,lc_monetary ,& canonname );
2680+ lc_monetary = canonname ;
26692681#if defined(LC_MESSAGES )&& !defined(WIN32 )
2670- if (check_locale_name (LC_MESSAGES ,lc_messages ,& canonname ))
2671- lc_messages = canonname ;
2672- else
2673- lc_messages = pg_strdup (setlocale (LC_MESSAGES ,NULL ));
2682+ check_locale_name (LC_MESSAGES ,lc_messages ,& canonname );
2683+ lc_messages = canonname ;
26742684#else
26752685/* when LC_MESSAGES is not available, use the LC_CTYPE setting */
2676- if (check_locale_name (LC_CTYPE ,lc_messages ,& canonname ))
2677- lc_messages = canonname ;
2678- else
2679- lc_messages = pg_strdup (setlocale (LC_CTYPE ,NULL ));
2686+ check_locale_name (LC_CTYPE ,lc_messages ,& canonname );
2687+ lc_messages = canonname ;
26802688#endif
26812689}
26822690