1/***********************************************************************
2*                                                                      *
3*               This software is part of the ast package               *
4*          Copyright (c) 1985-2010 AT&T Intellectual Property          *
5*                      and is licensed under the                       *
6*                  Common Public License, Version 1.0                  *
7*                    by AT&T Intellectual Property                     *
8*                                                                      *
9*                A copy of the License is available at                 *
10*            http://www.opensource.org/licenses/cpl1.0.txt             *
11*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12*                                                                      *
13*              Information and Software Systems Research               *
14*                            AT&T Research                             *
15*                           Florham Park NJ                            *
16*                                                                      *
17*                 Glenn Fowler <gsf@research.att.com>                  *
18*                  David Korn <dgk@research.att.com>                   *
19*                   Phong Vo <kpv@research.att.com>                    *
20*                                                                      *
21***********************************************************************/
22#pragma prototyped
23/*
24 * AT&T Bell Laboratories
25 * return 1 if dir [any dir] is the preroot
26 */
27
28#include <ast.h>
29#include <preroot.h>
30
31#if FS_PREROOT
32
33#include <ls.h>
34
35/*
36 * return 1 if files a and b are the same under preroot
37 *
38 * NOTE: the kernel disables preroot for set-uid processes
39 */
40
41static int
42same(const char* a, const char* b)
43{
44	int		i;
45	int		euid;
46	int		ruid;
47
48	struct stat	ast;
49	struct stat	bst;
50
51	if ((ruid = getuid()) != (euid = geteuid())) setuid(ruid);
52	i = !stat(a, &ast) && !stat(b, &bst) && ast.st_dev == bst.st_dev && ast.st_ino == bst.st_ino;
53	if (ruid != euid) setuid(euid);
54	return(i);
55}
56
57int
58ispreroot(const char* dir)
59{
60	static int	prerooted = -1;
61
62	if (dir) return(same("/", dir));
63	if (prerooted < 0) prerooted = !same("/", PR_REAL);
64	return(prerooted);
65}
66
67#else
68
69NoN(ispreroot)
70
71#endif
72