1/* 2 * Copyright (c) 1999, 2006 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23/* 24 * Copyright (c) 1993 25 * The Regents of the University of California. All rights reserved. 26 * 27 * Redistribution and use in source and binary forms, with or without 28 * modification, are permitted provided that the following conditions 29 * are met: 30 * 1. Redistributions of source code must retain the above copyright 31 * notice, this list of conditions and the following disclaimer. 32 * 2. Redistributions in binary form must reproduce the above copyright 33 * notice, this list of conditions and the following disclaimer in the 34 * documentation and/or other materials provided with the distribution. 35 * 3. All advertising materials mentioning features or use of this software 36 * must display the following acknowledgement: 37 * This product includes software developed by the University of 38 * California, Berkeley and its contributors. 39 * 4. Neither the name of the University nor the names of its contributors 40 * may be used to endorse or promote products derived from this software 41 * without specific prior written permission. 42 * 43 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 44 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 45 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 46 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 47 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 49 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 50 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 51 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 52 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 53 * SUCH DAMAGE. 54 */ 55 56 57#include <sys/param.h> 58#include <sys/sysctl.h> 59 60#include <errno.h> 61#include <paths.h> 62#include <stdlib.h> 63#include <string.h> 64#include <unistd.h> 65#include <stdio.h> /* for P_tmpdir */ 66 67#include <dirhelper_priv.h> 68 69extern char *_dirhelper(dirhelper_which_t which, char *path, size_t pathlen); 70 71#if __DARWIN_UNIX03 72#define CONFSTR_ERR_RET 0 73#else /* !__DARWIN_UNIX03 */ 74#define CONFSTR_ERR_RET -1 75#endif /* __DARWIN_UNIX03 */ 76 77size_t 78confstr(name, buf, len) 79 int name; 80 char *buf; 81 size_t len; 82{ 83 size_t tlen; 84 int mib[2], sverrno; 85 char *p; 86 87 switch (name) { 88 case _CS_PATH: 89 mib[0] = CTL_USER; 90 mib[1] = USER_CS_PATH; 91 if (sysctl(mib, 2, NULL, &tlen, NULL, 0) == -1) 92 return (CONFSTR_ERR_RET); 93 if (len != 0 && buf != NULL) { 94 if ((p = malloc(tlen)) == NULL) 95 return (CONFSTR_ERR_RET); 96 if (sysctl(mib, 2, p, &tlen, NULL, 0) == -1) { 97 sverrno = errno; 98 free(p); 99 errno = sverrno; 100 return (CONFSTR_ERR_RET); 101 } 102 /* 103 * POSIX 1003.2 requires partial return of 104 * the string -- that should be *real* useful. 105 */ 106 (void)strncpy(buf, p, len - 1); 107 buf[len - 1] = '\0'; 108 free(p); 109 } 110 return (tlen); 111 112 case _CS_POSIX_V6_ILP32_OFF32_CFLAGS: 113 case _CS_XBS5_ILP32_OFF32_CFLAGS: /* legacy */ 114 115 case _CS_POSIX_V6_ILP32_OFF32_LDFLAGS: 116 case _CS_XBS5_ILP32_OFF32_LDFLAGS: /* legacy */ 117 118 case _CS_POSIX_V6_ILP32_OFF32_LIBS: 119 case _CS_XBS5_ILP32_OFF32_LIBS: /* legacy */ 120 121 case _CS_XBS5_ILP32_OFF32_LINTFLAGS: /* legacy */ 122 123 case _CS_POSIX_V6_ILP32_OFFBIG_LIBS: 124 case _CS_XBS5_ILP32_OFFBIG_LIBS: /* legacy */ 125 126 case _CS_XBS5_ILP32_OFFBIG_LINTFLAGS: /* legacy */ 127 128 case _CS_POSIX_V6_LP64_OFF64_LIBS: 129 case _CS_XBS5_LP64_OFF64_LIBS: /* legacy */ 130 131 case _CS_XBS5_LP64_OFF64_LINTFLAGS: /* legacy */ 132 133 case _CS_POSIX_V6_LPBIG_OFFBIG_LIBS: 134 case _CS_XBS5_LPBIG_OFFBIG_LIBS: /* legacy */ 135 136 case _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS: /* legacy */ 137 /* No special flags... yet */ 138 p = ""; 139 goto docopy; 140 141 case _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS: 142 case _CS_XBS5_ILP32_OFFBIG_CFLAGS: /* legacy */ 143 144 case _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS: 145 case _CS_XBS5_ILP32_OFFBIG_LDFLAGS: /* legacy */ 146 p = "-W 32"; 147 goto docopy; 148 149 case _CS_POSIX_V6_LP64_OFF64_CFLAGS: 150 case _CS_XBS5_LP64_OFF64_CFLAGS: /* legacy */ 151 152 case _CS_POSIX_V6_LP64_OFF64_LDFLAGS: 153 case _CS_XBS5_LP64_OFF64_LDFLAGS: /* legacy */ 154 155 case _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS: 156 case _CS_XBS5_LPBIG_OFFBIG_CFLAGS: /* legacy */ 157 158 case _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS: 159 case _CS_XBS5_LPBIG_OFFBIG_LDFLAGS: /* legacy */ 160 p = "-W 64"; 161 goto docopy; 162 163 case _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS: 164 if (sizeof(long) >= 8) 165 p = "_POSIX_V6_LP64_OFF64"; 166 else 167 p = "_POSIX_V6_ILP32_OFFBIG"; 168 169docopy: 170 if (len != 0 && buf != NULL) 171 strlcpy(buf, p, len); 172 return (strlen(p) + 1); 173 174 case _CS_DARWIN_USER_DIR: 175 if ((p = alloca(PATH_MAX)) == NULL) { 176 errno = ENOMEM; 177 return (CONFSTR_ERR_RET); 178 } 179 if (_dirhelper(DIRHELPER_USER_LOCAL, p, PATH_MAX) == NULL) { 180 if (errno != ENOMEM) 181 errno = EIO; 182 return (CONFSTR_ERR_RET); 183 } 184 goto docopy; 185 186 case _CS_DARWIN_USER_TEMP_DIR: 187 if ((p = alloca(PATH_MAX)) == NULL) { 188 errno = ENOMEM; 189 return (CONFSTR_ERR_RET); 190 } 191 if (_dirhelper(DIRHELPER_USER_LOCAL_TEMP, p, PATH_MAX) == NULL) { 192 int dh_errno = errno; 193 /* 194 * If _dirhelper() fails, try TMPDIR and P_tmpdir, 195 * finally failing otherwise. 196 */ 197 if ((p = getenv("TMPDIR")) && access(p, W_OK) == 0) 198 goto docopy; 199 if (access(p = P_tmpdir, W_OK) == 0) 200 goto docopy; 201 if (dh_errno == ENOMEM) 202 errno = ENOMEM; 203 else 204 errno = EIO; 205 return (CONFSTR_ERR_RET); 206 } 207 goto docopy; 208 209 case _CS_DARWIN_USER_CACHE_DIR: 210 if ((p = alloca(PATH_MAX)) == NULL) { 211 errno = ENOMEM; 212 return (CONFSTR_ERR_RET); 213 } 214 if (_dirhelper(DIRHELPER_USER_LOCAL_CACHE, p, PATH_MAX) == NULL) { 215 if (errno != ENOMEM) 216 errno = EIO; 217 return (CONFSTR_ERR_RET); 218 } 219 goto docopy; 220 221 default: 222 errno = EINVAL; 223 return (0); 224 } 225 /* NOTREACHED */ 226} 227