From 41e668c8ebf82b92d0f596f96e1df919bdbc12b2 Mon Sep 17 00:00:00 2001 From: Stephen Gallagher Date: Thu, 10 Sep 2009 15:56:52 -0400 Subject: [PATCH 1/4] Add strtoint32 and strtouint32 convenience functions --- server/Makefile.am | 2 + server/configure.ac | 1 + server/external/sizes.m4 | 44 +++++++++++++++++++++++++++++++ server/util/strtonum.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++ server/util/strtonum.h | 32 ++++++++++++++++++++++ 5 files changed, 144 insertions(+), 0 deletions(-) create mode 100644 server/external/sizes.m4 create mode 100644 server/util/strtonum.c create mode 100644 server/util/strtonum.h diff --git a/server/Makefile.am b/server/Makefile.am index 27ac01d..18fb699 100644 --- a/server/Makefile.am +++ b/server/Makefile.am @@ -160,6 +160,7 @@ SSSD_UTIL_OBJ = \ util/signal.c \ util/usertools.c \ util/backup_file.c \ + util/strtonum.c \ $(SSSD_DEBUG_OBJ) SSSD_RESPONDER_OBJ = \ @@ -203,6 +204,7 @@ dist_noinst_HEADERS = \ util/dlinklist.h \ util/sssd-i18n.h \ util/util.h \ + util/strtonum.h \ config.h \ monitor/monitor.h \ monitor/monitor_interfaces.h \ diff --git a/server/configure.ac b/server/configure.ac index 8e7ea0b..3320507 100644 --- a/server/configure.ac +++ b/server/configure.ac @@ -61,6 +61,7 @@ m4_include([external/libpcre.m4]) m4_include([external/krb5.m4]) m4_include([external/libcares.m4]) m4_include([external/docbook.m4]) +m4_include([external/sizes.m4]) m4_include([util/signal.m4]) PKG_CHECK_MODULES([DBUS],[dbus-1]) diff --git a/server/external/sizes.m4 b/server/external/sizes.m4 new file mode 100644 index 0000000..53df61d --- /dev/null +++ b/server/external/sizes.m4 @@ -0,0 +1,44 @@ +# Solaris needs HAVE_LONG_LONG defined +AC_CHECK_TYPES(long long) + +AC_CHECK_SIZEOF(int) +AC_CHECK_SIZEOF(char) +AC_CHECK_SIZEOF(short) +AC_CHECK_SIZEOF(long) +AC_CHECK_SIZEOF(long long) + +if test $ac_cv_sizeof_long_long -lt 8 ; then +AC_MSG_ERROR([SSSD requires long long of 64-bits]) +fi + +AC_CHECK_TYPE(uint_t, unsigned int) +AC_CHECK_TYPE(int8_t, char) +AC_CHECK_TYPE(uint8_t, unsigned char) +AC_CHECK_TYPE(int16_t, short) +AC_CHECK_TYPE(uint16_t, unsigned short) + +if test $ac_cv_sizeof_int -eq 4 ; then +AC_CHECK_TYPE(int32_t, int) +AC_CHECK_TYPE(uint32_t, unsigned int) +elif test $ac_cv_size_long -eq 4 ; then +AC_CHECK_TYPE(int32_t, long) +AC_CHECK_TYPE(uint32_t, unsigned long) +else +AC_MSG_ERROR([LIBREPLACE no 32-bit type found]) +fi + +AC_CHECK_TYPE(int64_t, long long) +AC_CHECK_TYPE(uint64_t, unsigned long long) + +AC_CHECK_TYPE(size_t, unsigned int) +AC_CHECK_TYPE(ssize_t, int) + +AC_CHECK_SIZEOF(off_t) +AC_CHECK_SIZEOF(size_t) +AC_CHECK_SIZEOF(ssize_t) + +AC_CHECK_TYPE(intptr_t, long long) +AC_CHECK_TYPE(uintptr_t, unsigned long long) +AC_CHECK_TYPE(ptrdiff_t, unsigned long long) + + diff --git a/server/util/strtonum.c b/server/util/strtonum.c new file mode 100644 index 0000000..744e0f7 --- /dev/null +++ b/server/util/strtonum.c @@ -0,0 +1,65 @@ +/* + SSSD + + SSSD Utility functions + + Copyright (C) Stephen Gallagher 2009 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include "config.h" +#include "util/util.h" +#include "util/strtonum.h" + +/* strtoint32 */ +int32_t strtoint32(const char *nptr, char **endptr, int base) +{ + long long ret = 0; + + errno = 0; + ret = strtoll(nptr, endptr, base); + + if (ret > INT32_MAX) { + errno = ERANGE; + return INT32_MAX; + } + else if (ret < INT32_MIN) { + errno = ERANGE; + return INT32_MIN; + } + + /* If errno was set by strtoll, we'll pass it back as-is */ + return (int32_t)ret; +} + + +/* strtouint32 */ +uint32_t strtouint32(const char *nptr, char **endptr, int base) +{ + long long ret = 0; + errno = 0; + ret = strtoull(nptr, endptr, base); + + if (ret > UINT32_MAX) { + errno = ERANGE; + return UINT32_MAX; + } + + /* If errno was set by strtoll, we'll pass it back as-is */ + return (uint32_t)ret; +} diff --git a/server/util/strtonum.h b/server/util/strtonum.h new file mode 100644 index 0000000..4509596 --- /dev/null +++ b/server/util/strtonum.h @@ -0,0 +1,32 @@ +/* + SSSD + + SSSD Utility functions + + Copyright (C) Stephen Gallagher 2009 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _STRTONUM_H_ +#define _STRTONUM_H_ + +#include +#include +#include + +int32_t strtoint32(const char *nptr, char **endptr, int base); +uint32_t strtouint32(const char *nptr, char **endptr, int base); + +#endif /* _STRTONUM_H_ */ -- 1.6.2.5