Print this page
2964 need POSIX 2008 locale object support
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Approved by: TBD

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libc/port/locale/ldpart.c
          +++ new/usr/src/lib/libc/port/locale/ldpart.c
   1    1  /*
        2 + * Copyright 2013 Garrett D'Amore <garrett@damore.org>
   2    3   * Copyright 2010 Nexenta Systems, Inc.  All rights reserved.
   3    4   * Copyright (c) 2000, 2001 Alexey Zelkin <phantom@FreeBSD.org>
   4    5   * All rights reserved.
   5    6   *
   6    7   * Redistribution and use in source and binary forms, with or without
   7    8   * modification, are permitted provided that the following conditions
   8    9   * are met:
   9   10   * 1. Redistributions of source code must retain the above copyright
  10   11   *    notice, this list of conditions and the following disclaimer.
  11   12   * 2. Redistributions in binary form must reproduce the above copyright
↓ open down ↓ 18 lines elided ↑ open up ↑
  30   31  #include <sys/types.h>
  31   32  #include <sys/stat.h>
  32   33  #include <errno.h>
  33   34  #include <fcntl.h>
  34   35  #include <limits.h>
  35   36  #include <stdlib.h>
  36   37  #include <string.h>
  37   38  #include <unistd.h>
  38   39  #include <stdio.h>
  39   40  
       41 +#include "libc.h"
  40   42  #include "ldpart.h"
  41   43  #include "setlocale.h"
  42   44  
  43   45  static int split_lines(char *, const char *);
  44   46  
  45   47  int
  46      -__part_load_locale(const char *name, int *using_locale,
       48 +__part_load_locale(const char *name,
  47   49      char **locale_buf, const char *category_filename,
  48   50      int locale_buf_size_max, int locale_buf_size_min,
  49   51      const char **dst_localebuf)
  50   52  {
  51   53          int             saverr, fd, i, num_lines;
  52   54          char            *lbuf, *p;
  53   55          const char      *plim;
  54   56          char            filename[PATH_MAX];
  55   57          struct stat     st;
  56   58          size_t          namesize, bufsize;
  57   59  
  58      -        /* 'name' must be already checked. */
  59      -        if (strcmp(name, "C") == 0 || strcmp(name, "POSIX") == 0) {
  60      -                *using_locale = 0;
  61      -                return (_LDP_CACHE);
  62      -        }
  63      -
  64   60          /*
  65      -         * If the locale name is the same as our cache, use the cache.
  66      -         */
  67      -        if (*locale_buf != NULL && strcmp(name, *locale_buf) == 0) {
  68      -                *using_locale = 1;
  69      -                return (_LDP_CACHE);
  70      -        }
  71      -
  72      -        /*
  73   61           * Slurp the locale file into the cache.
  74   62           */
  75   63          namesize = strlen(name) + 1;
  76   64  
  77   65          /* 'PathLocale' must be already set & checked. */
  78   66  
  79   67          (void) snprintf(filename, sizeof (filename), "%s/%s/%s/LCL_DATA",
  80   68              _PathLocale, name, category_filename);
  81   69  
  82   70          if ((fd = open(filename, O_RDONLY)) < 0)
  83   71                  return (_LDP_ERROR);
  84   72          if (fstat(fd, &st) != 0)
  85   73                  goto bad_locale;
  86   74          if (st.st_size <= 0) {
  87   75                  errno = EINVAL;
  88   76                  goto bad_locale;
  89   77          }
  90   78          bufsize = namesize + st.st_size;
  91      -        if ((lbuf = malloc(bufsize)) == NULL) {
       79 +        if ((lbuf = libc_malloc(bufsize)) == NULL) {
  92   80                  errno = ENOMEM;
  93   81                  goto bad_locale;
  94   82          }
  95   83          (void) strcpy(lbuf, name);
  96   84          p = lbuf + namesize;
  97   85          plim = p + st.st_size;
  98   86          if (read(fd, p, (size_t)st.st_size) != st.st_size)
  99   87                  goto bad_lbuf;
 100   88          /*
 101   89           * Parse the locale file into localebuf.
↓ open down ↓ 8 lines elided ↑ open up ↑
 110   98          else if (num_lines >= locale_buf_size_min)
 111   99                  num_lines = locale_buf_size_min;
 112  100          else {
 113  101                  errno = EINVAL;
 114  102                  goto bad_lbuf;
 115  103          }
 116  104          (void) close(fd);
 117  105          /*
 118  106           * Record the successful parse in the cache.
 119  107           */
 120      -        if (*locale_buf != NULL)
 121      -                free(*locale_buf);
 122  108          *locale_buf = lbuf;
 123  109          for (p = *locale_buf, i = 0; i < num_lines; i++)
 124  110                  dst_localebuf[i] = (p += strlen(p) + 1);
 125  111          for (i = num_lines; i < locale_buf_size_max; i++)
 126  112                  dst_localebuf[i] = NULL;
 127      -        *using_locale = 1;
 128  113  
 129  114          return (_LDP_LOADED);
 130  115  
 131  116  bad_lbuf:
 132  117          saverr = errno;
 133  118          free(lbuf);
 134  119          errno = saverr;
 135  120  bad_locale:
 136  121          saverr = errno;
 137  122          (void) close(fd);
↓ open down ↓ 20 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX