/* * Copyright (c) 2004-2005 The Trustees of Indiana University. * All rights reserved. * Copyright (c) 2004-2005 The Trustees of the University of Tennessee. * All rights reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow * * $HEADER$ */ #include "ompi_config.h" #include #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_LIBGEN_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif #include #include #include "opal/util/os_path.h" #include "ompi/include/constants.h" #ifdef WIN32 #define PATH_SEP "\\" #else #define PATH_SEP "/" #endif static const char *path_sep = PATH_SEP; char *opal_os_path(bool relative, ...) { va_list ap, ap1; char *element, *path; int num_elements, total_length; va_start(ap, relative); va_start(ap1, relative); /* no way to protect ourselves from reading too far, so have to trust caller that they ended the list with the NULL */ num_elements = 0; total_length = 0; while (NULL != (element=va_arg(ap, char*))) { num_elements++; total_length = total_length + strlen(element); } if (0 == num_elements) { /* must be looking for a simple answer */ path = (char *)malloc(3); path[0] = '\0'; if (relative) { strcpy(path, "."); strcat(path, path_sep); } else { #ifndef WIN32 strcpy(path, path_sep); #endif } return(path); } /* setup path with enough room for the string terminator, the elements, and the separator between each of the elements */ total_length = total_length + num_elements + 1; if (total_length > MAXPATHLEN) { /* path length is too long - reject it */ return(NULL); } path = (char *)malloc(2 + total_length + num_elements-1); if (NULL == path) { return(NULL); } path[0] = 0; if (relative) { strcpy(path, "."); } while (NULL != (element=va_arg(ap1, char*))) { if (path_sep[0] != element[0]) { strcat(path, path_sep); } strcat(path, element); } va_end(ap); va_end(ap1); return(path); }