diff options
Diffstat (limited to 'hwloc-1.2.1/src/misc.c')
-rw-r--r-- | hwloc-1.2.1/src/misc.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/hwloc-1.2.1/src/misc.c b/hwloc-1.2.1/src/misc.c new file mode 100644 index 00000000..0432a1cd --- /dev/null +++ b/hwloc-1.2.1/src/misc.c @@ -0,0 +1,100 @@ +/* + * Copyright © 2009 CNRS + * Copyright © 2009-2010 INRIA. All rights reserved. + * Copyright © 2009-2010 Université Bordeaux 1 + * Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved. + * See COPYING in top-level directory. + */ + +#include <private/autogen/config.h> +#include <private/misc.h> + +#include <stdarg.h> +#ifdef HAVE_SYS_UTSNAME_H +#include <sys/utsname.h> +#endif +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> +#include <ctype.h> + +int hwloc_snprintf(char *str, size_t size, const char *format, ...) +{ + int ret; + va_list ap; + static char bin; + size_t fakesize; + char *fakestr; + + /* Some systems crash on str == NULL */ + if (!size) { + str = &bin; + size = 1; + } + + va_start(ap, format); + ret = vsnprintf(str, size, format, ap); + va_end(ap); + + if (ret >= 0 && (size_t) ret != size-1) + return ret; + + /* vsnprintf returned size-1 or -1. That could be a system which reports the + * written data and not the actually required room. Try increasing buffer + * size to get the latter. */ + + fakesize = size; + fakestr = NULL; + do { + fakesize *= 2; + free(fakestr); + fakestr = malloc(fakesize); + if (NULL == fakestr) + return -1; + va_start(ap, format); + errno = 0; + ret = vsnprintf(fakestr, fakesize, format, ap); + va_end(ap); + } while ((size_t) ret == fakesize-1 || (ret < 0 && (!errno || errno == ERANGE))); + + if (ret >= 0 && size) { + if (size > (size_t) ret+1) + size = ret+1; + memcpy(str, fakestr, size-1); + str[size-1] = 0; + } + free(fakestr); + + return ret; +} + +int hwloc_namecoloncmp(const char *haystack, const char *needle, size_t n) +{ + size_t i = 0; + while (*haystack && *haystack != ':') { + int ha = *haystack++; + int low_h = tolower(ha); + int ne = *needle++; + int low_n = tolower(ne); + if (low_h != low_n) + return 1; + i++; + } + return i < n; +} + +void hwloc_add_uname_info(struct hwloc_topology *topology __hwloc_attribute_unused) +{ +#ifdef HAVE_UNAME + struct utsname utsname; + + if (uname(&utsname) < 0) + return; + + hwloc_add_object_info(topology->levels[0][0], "OSName", utsname.sysname); + hwloc_add_object_info(topology->levels[0][0], "OSRelease", utsname.release); + hwloc_add_object_info(topology->levels[0][0], "OSVersion", utsname.version); + hwloc_add_object_info(topology->levels[0][0], "HostName", utsname.nodename); + hwloc_add_object_info(topology->levels[0][0], "Architecture", utsname.machine); +#endif /* HAVE_UNAME */ +} |