11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved. 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met: 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions of source code must retain the above copyright 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer in 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the documentation and/or other materials provided with the 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * distribution. 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE. 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <pathconf.h> 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/vfs.h> 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/limits.h> 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <linux/ext2_fs.h> 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <linux/ext3_fs.h> 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <errno.h> 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* these may not be defined yet by our headers */ 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _POSIX_VDISABLE 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _POSIX_VDISABLE -1 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _POSIX_SYNC_IO 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _POSIX_SYNC_IO -1 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _POSIX_PRIO_IO 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _POSIX_PRIO_IO -1 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _POSIX_ASYNC_IO 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _POSIX_ASYNC_IO -1 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic long 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__filesizebits( struct statfs* s ) 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define EOL_MAGIC 0x0000U 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* list of known 64-bit aware filesystems */ 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static const uint32_t known64[] = { 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project EXT2_SUPER_MAGIC, 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project UFS_MAGIC, 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project REISERFS_SUPER_MAGIC, 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project XFS_SUPER_MAGIC, 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project SMB_SUPER_MAGIC, 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project UDF_SUPER_MAGIC, 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project JFS_SUPER_MAGIC, 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project NTFS_SB_MAGIC, 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project VXFS_SUPER_MAGIC, 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project EOL_MAGIC 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project }; 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int nn = 0; 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 737d03c9cbcedb1dc7e3a8210ac0001120558ec6dfBruce Beare for (; known64[nn] != EOL_MAGIC; ++nn) { 747d03c9cbcedb1dc7e3a8210ac0001120558ec6dfBruce Beare if (known64[nn] == s->f_type) { 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return 64; 767d03c9cbcedb1dc7e3a8210ac0001120558ec6dfBruce Beare } 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 787d03c9cbcedb1dc7e3a8210ac0001120558ec6dfBruce Beare return 32; 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic long 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__link_max( struct statfs* s ) 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* constant values were taken from official kernel headers. 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * I don't think this justified bringing in <linux/minix_fs.h> et al 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * into our cleaned-up kernel three 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static const struct { uint32_t type; int max; } knownMax[] = 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { EXT2_SUPER_MAGIC, EXT2_LINK_MAX }, 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { EXT3_SUPER_MAGIC, EXT3_LINK_MAX }, 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { MINIX_SUPER_MAGIC, 250 }, 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { MINIX2_SUPER_MAGIC, 65530 }, 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { REISERFS_SUPER_MAGIC, 0xffff - 1000 }, 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { UFS_MAGIC, 32000 }, 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { EOL_MAGIC, 0 } 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project }; 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int nn = 0; 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1017d03c9cbcedb1dc7e3a8210ac0001120558ec6dfBruce Beare for (; knownMax[nn].type != EOL_MAGIC; ++nn) { 1027d03c9cbcedb1dc7e3a8210ac0001120558ec6dfBruce Beare if (knownMax[nn].type == s->f_type) { 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return knownMax[nn].max; 1047d03c9cbcedb1dc7e3a8210ac0001120558ec6dfBruce Beare } 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return LINK_MAX; 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic long 1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__2_symlinks( struct statfs* s ) 1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* list of know filesystems that don't support symlinks */ 1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project static const uint32_t knownNoSymlinks[] = { 1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ADFS_SUPER_MAGIC, BFS_MAGIC, CRAMFS_MAGIC, 1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project EFS_SUPER_MAGIC, MSDOS_SUPER_MAGIC, NTFS_SB_MAGIC, 1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project QNX4_SUPER_MAGIC, 1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project EOL_MAGIC 1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project }; 1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int nn = 0; 1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1217d03c9cbcedb1dc7e3a8210ac0001120558ec6dfBruce Beare for (; knownNoSymlinks[nn] != EOL_MAGIC; ++nn) { 1227d03c9cbcedb1dc7e3a8210ac0001120558ec6dfBruce Beare if (knownNoSymlinks[nn] == s->f_type) { 1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return 0; 1247d03c9cbcedb1dc7e3a8210ac0001120558ec6dfBruce Beare } 1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1267d03c9cbcedb1dc7e3a8210ac0001120558ec6dfBruce Beare return 1; 1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic long 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__name_max( struct statfs* s ) 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return s->f_namelen; 1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectlong 1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectpathconf(const char *path, int name) 1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct statfs buf; 1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int ret = statfs( path, &buf ); 1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ret < 0) 1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return -1; 1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (name) { 1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_FILESIZEBITS: 1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __filesizebits(&buf); 1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_LINK_MAX: 1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __link_max(&buf); 1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_MAX_CANON: 1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return MAX_CANON; 1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_MAX_INPUT: 1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return MAX_INPUT; 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_NAME_MAX: 1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __name_max(&buf); 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_PATH_MAX: 1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return PATH_MAX; 1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_PIPE_BUF: 1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return PIPE_BUF; 1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_2_SYMLINKS: 1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __2_symlinks(&buf); 1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if 0 /* don't know what to do there, the specs are really weird */ 1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_ALLOC_SIZE_MIN: 1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_REC_INCR_XFER_SIZE: 1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_REC_MAX_XFER_SIZE: 1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_REC_MIN_XFER_SIZE: 1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_REC_XFER_ALIGN: 1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_SYMLINK_MAX: 1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return -1; /* no limit */ 1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_CHOWN_RESTRICTED: 1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return _POSIX_CHOWN_RESTRICTED; 1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_NO_TRUNC: 1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return _POSIX_NO_TRUNC; 1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_VDISABLE: 1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return _POSIX_VDISABLE; 1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_ASYNC_IO: 1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return _POSIX_ASYNC_IO; 1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_PRIO_IO: 1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return _POSIX_PRIO_IO; 1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_SYNC_IO: 1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return _POSIX_SYNC_IO; 1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project errno = EINVAL; 2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return -1; 2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectlong fpathconf(int fildes, int name) 2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct statfs buf; 2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int ret = fstatfs(fildes, &buf); 2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ret < 0) 2101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return -1; 2111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch (name) { 2131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_FILESIZEBITS: 2141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __filesizebits(&buf); 2151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_LINK_MAX: 2171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __link_max(&buf); 2181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_MAX_CANON: 2201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return MAX_CANON; 2211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_MAX_INPUT: 2231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return MAX_INPUT; 2241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_NAME_MAX: 2261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __name_max(&buf); 2271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_PATH_MAX: 2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return PATH_MAX; 2301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_PIPE_BUF: 2321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return PIPE_BUF; 2331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_2_SYMLINKS: 2351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __2_symlinks(&buf); 2361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if 0 /* don't know what to do there, the specs are really weird */ 2381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_ALLOC_SIZE_MIN: 2391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_REC_INCR_XFER_SIZE: 2401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_REC_MAX_XFER_SIZE: 2411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_REC_MIN_XFER_SIZE: 2421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_REC_XFER_ALIGN: 2431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 2441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_SYMLINK_MAX: 2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return -1; /* no limit */ 2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_CHOWN_RESTRICTED: 2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return _POSIX_CHOWN_RESTRICTED; 2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_NO_TRUNC: 2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return _POSIX_NO_TRUNC; 2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_VDISABLE: 2551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return _POSIX_VDISABLE; 2561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_ASYNC_IO: 2581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return _POSIX_ASYNC_IO; 2591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_PRIO_IO: 2611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return _POSIX_PRIO_IO; 2621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case _PC_SYNC_IO: 2641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return _POSIX_SYNC_IO; 2651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 2671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project errno = EINVAL; 2681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return -1; 2691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 271