X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/59e0d9fe772464b93d835d2a2964457702469a43..c13ac0be4e632012a2344baecc513dfb99811ccd:/gen/confstr.c diff --git a/gen/confstr.c b/gen/confstr.c index 8bb490c..a7f9613 100644 --- a/gen/confstr.c +++ b/gen/confstr.c @@ -1,10 +1,8 @@ /* - * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * Copyright (c) 1999, 2006 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * - * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. - * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -64,6 +62,55 @@ #include #include #include +#include /* for P_tmpdir */ + +#ifndef __has_include +#include +#else +#if __has_include() +#include +#else +typedef enum { + DIRHELPER_USER_LOCAL = 0, + DIRHELPER_USER_LOCAL_TEMP, + DIRHELPER_USER_LOCAL_CACHE, + DIRHELPER_USER_LOCAL_LAST = DIRHELPER_USER_LOCAL_CACHE +} dirhelper_which_t; +#endif +#endif + +#include "libc_private.h" + +#if __DARWIN_UNIX03 +static char *(*__dirhelper_func)(int, char *, size_t); + +__attribute__((__visibility__("hidden"))) +void +__confstr_init(const struct _libc_functions *funcs) +{ + __dirhelper_func = funcs->dirhelper; +} + +__attribute__((__visibility__("hidden"))) +char * +__dirhelper(dirhelper_which_t which, char *path, size_t pathlen) +{ + if (__dirhelper_func) { + return __dirhelper_func(which, path, pathlen); + } else { + return NULL; + } +} +#else // !__DARWIN_UNIX03 +__attribute__((__visibility__("hidden"))) +char *__dirhelper(dirhelper_which_t which, char *path, size_t pathlen); +#endif // !__DARWIN_UNIX03 + +#if __DARWIN_UNIX03 +#define CONFSTR_ERR_RET 0 +#else /* !__DARWIN_UNIX03 */ +#define CONFSTR_ERR_RET -1 +#endif /* __DARWIN_UNIX03 */ size_t confstr(name, buf, len) @@ -80,15 +127,15 @@ confstr(name, buf, len) mib[0] = CTL_USER; mib[1] = USER_CS_PATH; if (sysctl(mib, 2, NULL, &tlen, NULL, 0) == -1) - return (-1); + return (CONFSTR_ERR_RET); if (len != 0 && buf != NULL) { if ((p = malloc(tlen)) == NULL) - return (-1); + return (CONFSTR_ERR_RET); if (sysctl(mib, 2, p, &tlen, NULL, 0) == -1) { sverrno = errno; free(p); errno = sverrno; - return (-1); + return (CONFSTR_ERR_RET); } /* * POSIX 1003.2 requires partial return of @@ -98,7 +145,7 @@ confstr(name, buf, len) buf[len - 1] = '\0'; free(p); } - return (tlen + 1); + return (tlen); case _CS_POSIX_V6_ILP32_OFF32_CFLAGS: case _CS_XBS5_ILP32_OFF32_CFLAGS: /* legacy */ @@ -111,16 +158,31 @@ confstr(name, buf, len) case _CS_XBS5_ILP32_OFF32_LINTFLAGS: /* legacy */ + case _CS_POSIX_V6_ILP32_OFFBIG_LIBS: + case _CS_XBS5_ILP32_OFFBIG_LIBS: /* legacy */ + + case _CS_XBS5_ILP32_OFFBIG_LINTFLAGS: /* legacy */ + + case _CS_POSIX_V6_LP64_OFF64_LIBS: + case _CS_XBS5_LP64_OFF64_LIBS: /* legacy */ + + case _CS_XBS5_LP64_OFF64_LINTFLAGS: /* legacy */ + + case _CS_POSIX_V6_LPBIG_OFFBIG_LIBS: + case _CS_XBS5_LPBIG_OFFBIG_LIBS: /* legacy */ + + case _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS: /* legacy */ + /* No special flags... yet */ + p = ""; + goto docopy; + case _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS: case _CS_XBS5_ILP32_OFFBIG_CFLAGS: /* legacy */ case _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS: case _CS_XBS5_ILP32_OFFBIG_LDFLAGS: /* legacy */ - - case _CS_POSIX_V6_ILP32_OFFBIG_LIBS: - case _CS_XBS5_ILP32_OFFBIG_LIBS: /* legacy */ - - case _CS_XBS5_ILP32_OFFBIG_LINTFLAGS: /* legacy */ + p = "-W 32"; + goto docopy; case _CS_POSIX_V6_LP64_OFF64_CFLAGS: case _CS_XBS5_LP64_OFF64_CFLAGS: /* legacy */ @@ -128,23 +190,12 @@ confstr(name, buf, len) case _CS_POSIX_V6_LP64_OFF64_LDFLAGS: case _CS_XBS5_LP64_OFF64_LDFLAGS: /* legacy */ - case _CS_POSIX_V6_LP64_OFF64_LIBS: - case _CS_XBS5_LP64_OFF64_LIBS: /* legacy */ - - case _CS_XBS5_LP64_OFF64_LINTFLAGS: /* legacy */ - case _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS: case _CS_XBS5_LPBIG_OFFBIG_CFLAGS: /* legacy */ case _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS: case _CS_XBS5_LPBIG_OFFBIG_LDFLAGS: /* legacy */ - - case _CS_POSIX_V6_LPBIG_OFFBIG_LIBS: - case _CS_XBS5_LPBIG_OFFBIG_LIBS: /* legacy */ - - case _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS: /* legacy */ - /* No special flags... yet */ - p = ""; + p = "-W 64"; goto docopy; case _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS: @@ -158,6 +209,53 @@ docopy: strlcpy(buf, p, len); return (strlen(p) + 1); + case _CS_DARWIN_USER_DIR: + if ((p = alloca(PATH_MAX)) == NULL) { + errno = ENOMEM; + return (CONFSTR_ERR_RET); + } + if (__dirhelper(DIRHELPER_USER_LOCAL, p, PATH_MAX) == NULL) { + if (errno != ENOMEM) + errno = EIO; + return (CONFSTR_ERR_RET); + } + goto docopy; + + case _CS_DARWIN_USER_TEMP_DIR: + if ((p = alloca(PATH_MAX)) == NULL) { + errno = ENOMEM; + return (CONFSTR_ERR_RET); + } + if (__dirhelper(DIRHELPER_USER_LOCAL_TEMP, p, PATH_MAX) == NULL) { + int dh_errno = errno; + /* + * If __dirhelper() fails, try TMPDIR and P_tmpdir, + * finally failing otherwise. + */ + if ((p = getenv("TMPDIR")) && access(p, W_OK) == 0) + goto docopy; + if (access(p = P_tmpdir, W_OK) == 0) + goto docopy; + if (dh_errno == ENOMEM) + errno = ENOMEM; + else + errno = EIO; + return (CONFSTR_ERR_RET); + } + goto docopy; + + case _CS_DARWIN_USER_CACHE_DIR: + if ((p = alloca(PATH_MAX)) == NULL) { + errno = ENOMEM; + return (CONFSTR_ERR_RET); + } + if (__dirhelper(DIRHELPER_USER_LOCAL_CACHE, p, PATH_MAX) == NULL) { + if (errno != ENOMEM) + errno = EIO; + return (CONFSTR_ERR_RET); + } + goto docopy; + default: errno = EINVAL; return (0);