/*********************************************************************** * * * This software is part of the ast package * * Copyright (c) 1985-2007 AT&T Knowledge Ventures * * and is licensed under the * * Common Public License, Version 1.0 * * by AT&T Knowledge Ventures * * * * A copy of the License is available at * * http://www.opensource.org/licenses/cpl1.0.txt * * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * * * * Information and Software Systems Research * * AT&T Research * * Florham Park NJ * * * * Glenn Fowler * * David Korn * * Phong Vo * * * ***********************************************************************/ #pragma prototyped /* * AT&T Bell Laboratories * return 1 if dir [any dir] is the preroot */ #include #include #if FS_PREROOT #include /* * return 1 if files a and b are the same under preroot * * NOTE: the kernel disables preroot for set-uid processes */ static int same(const char* a, const char* b) { int i; int euid; int ruid; struct stat ast; struct stat bst; if ((ruid = getuid()) != (euid = geteuid())) setuid(ruid); i = !stat(a, &ast) && !stat(b, &bst) && ast.st_dev == bst.st_dev && ast.st_ino == bst.st_ino; if (ruid != euid) setuid(euid); return(i); } int ispreroot(const char* dir) { static int prerooted = -1; if (dir) return(same("/", dir)); if (prerooted < 0) prerooted = !same("/", PR_REAL); return(prerooted); } #else NoN(ispreroot) #endif