summaryrefslogtreecommitdiffstats
path: root/crypto/o_str.c
diff options
context:
space:
mode:
authorTomas Mraz <tomas@openssl.org>2022-05-10 16:31:20 +0200
committerTomas Mraz <tomas@openssl.org>2022-05-13 08:30:41 +0200
commit71c17c36d913a82742c7d4ecd91ad047906cdae0 (patch)
tree9c2ae300271ed521c48ed7397cef18816e2b4d40 /crypto/o_str.c
parentcf91a2b3c196ee4d7be93ab9f8fc8e097128ad68 (diff)
Move OPENSSL_strcasecmp() and related to o_str.c
Otherwise the implementation is unnecessarily duplicated in legacy.so. Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com> Reviewed-by: Paul Dale <pauli@openssl.org> (Merged from https://github.com/openssl/openssl/pull/18282)
Diffstat (limited to 'crypto/o_str.c')
-rw-r--r--crypto/o_str.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/crypto/o_str.c b/crypto/o_str.c
index 1ddb449307..eccaa1e5be 100644
--- a/crypto/o_str.c
+++ b/crypto/o_str.c
@@ -8,9 +8,17 @@
*/
#include "internal/e_os.h"
+#include <string.h>
#include <limits.h>
+#ifndef OPENSSL_NO_LOCALE
+# include <locale.h>
+# ifdef OPENSSL_SYS_MACOSX
+# include <xlocale.h>
+# endif
+#endif
#include <openssl/crypto.h>
#include "internal/cryptlib.h"
+#include "internal/core.h"
#define DEFAULT_SEPARATOR ':'
#define CH_ZERO '\0'
@@ -338,3 +346,60 @@ int openssl_strerror_r(int errnum, char *buf, size_t buflen)
return 1;
#endif
}
+
+#ifndef OPENSSL_NO_LOCALE
+# ifndef FIPS_MODULE
+static locale_t loc;
+
+
+void *ossl_c_locale() {
+ return (void *)loc;
+}
+
+int ossl_init_casecmp_int() {
+# ifdef OPENSSL_SYS_WINDOWS
+ loc = _create_locale(LC_COLLATE, "C");
+# else
+ loc = newlocale(LC_COLLATE_MASK, "C", (locale_t) 0);
+# endif
+ return (loc == (locale_t) 0) ? 0 : 1;
+}
+
+void ossl_deinit_casecmp() {
+ freelocale(loc);
+}
+# endif
+
+int OPENSSL_strcasecmp(const char *s1, const char *s2)
+{
+ return strcasecmp_l(s1, s2, (locale_t)ossl_c_locale());
+}
+
+int OPENSSL_strncasecmp(const char *s1, const char *s2, size_t n)
+{
+ return strncasecmp_l(s1, s2, n, (locale_t)ossl_c_locale());
+}
+#else
+# ifndef FIPS_MODULE
+void *ossl_c_locale() {
+ return NULL;
+}
+# endif
+
+int ossl_init_casecmp_int() {
+ return 1;
+}
+
+void ossl_deinit_casecmp() {
+}
+
+int OPENSSL_strcasecmp(const char *s1, const char *s2)
+{
+ return strcasecmp(s1, s2);
+}
+
+int OPENSSL_strncasecmp(const char *s1, const char *s2, size_t n)
+{
+ return strncasecmp(s1, s2, n);
+}
+#endif