// // aegis - project change supervisor // Copyright (C) 1991-2008 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see // . // #include #include #include #include #include static long pathconf_inner(const char *path, int arg) { #ifdef HAVE_PATHCONF long result; errno = EINVAL; // IRIX 5.2 fails to set on errors result = glue_pathconf(path, arg); if (result < 0) { switch (errno) { case ENOSYS: // lotsa systems say this for EINVAL #ifdef EOPNOTSUPP case EOPNOTSUPP: // HPUX says this for EINVAL #endif errno = EINVAL; break; } } else { #if INT_MAX < LONG_MAX if (result > INT_MAX) result = INT_MAX; #endif } return result; #else // // This system does not have the pathconf system call. // (Return EINVAL rather than ENOSYS, because the outer wrapper // expects EINVAL.) // errno = EINVAL; return -1; #endif } static long pathconf_wrapper(const char *path, int arg, long default_value) { #ifdef HAVE_PATHCONF long result; result = pathconf_inner(path, arg); if (result < 0 && errno == EINVAL) { // // Probably NFS/2 mounted (NFS/3 added pathconf), so // we will *guess* it's the same as the root filesystem. // Default if root is also NFS mounted. // result = pathconf_inner("/", arg); if (result < 0 && errno == EINVAL) result = default_value; } return result; #else // // This system does not have the pathconf system call. // return default_value; #endif } int os_pathconf_path_max(string_ty *path) { return os_pathconf_path_max(nstring(path)); } int os_pathconf_path_max(const nstring &path) { os_become_must_be_active(); long result = 1024; result = pathconf_wrapper(path.c_str(), _PC_PATH_MAX, result); if (result < 0) { int errno_old = errno; sub_context_ty sc; sc.errno_setx(errno_old); sc.var_set_string("File_Name", path); sc.fatal_intl(i18n("pathconf(\"$filename\", {PATH_MAX}): $errno")); // NOTREACHED } return result; } int os_pathconf_name_max(string_ty *path) { return os_pathconf_name_max(nstring(path)); } int os_pathconf_name_max(const nstring &path) { os_become_must_be_active(); #ifdef HAVE_LONG_FILE_NAMES long result = 255; #else long result = 14; #endif result = pathconf_wrapper(path.c_str(), _PC_NAME_MAX, result); if (result < 0) { int errno_old = errno; sub_context_ty sc; sc.errno_setx(errno_old); sc.var_set_string("File_Name", path); sc.fatal_intl(i18n("pathconf(\"$filename\", {NAME_MAX}): $errno")); // NOTREACHED } return result; }