1/*
2 * Copyright (c) 1999 Proofpoint, Inc. and its suppliers.
3 *	All rights reserved.
4 *
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
8 *
9 */
10
11/*
12**  The following test program tries the pathconf(2) routine.  It should
13**  be run in a non-NFS-mounted directory (e.g., /tmp) and on remote (NFS)
14**  mounted directories running both NFS-v2 and NFS-v3 from systems that
15**  both do and do not permit file giveaway.
16*/
17
18#include <sys/types.h>
19#include <errno.h>
20#include <fcntl.h>
21#include <stdio.h>
22#include <unistd.h>
23#ifdef EX_OK
24# undef EX_OK		/* unistd.h may have another use for this */
25#endif /* EX_OK */
26#include <sysexits.h>
27
28#ifndef lint
29static char id[] = "@(#)$Id: t_pathconf.c,v 8.7 2013-11-22 20:52:01 ca Exp $";
30#endif /* ! lint */
31
32int
33main(argc, argv)
34	int argc;
35	char **argv;
36{
37	int fd;
38	int i;
39	char tbuf[100];
40	extern int errno;
41
42	if (geteuid() == 0)
43	{
44		printf("*** Run me as a non-root user! ***\n");
45		exit(EX_USAGE);
46	}
47
48	strcpy(tbuf, "TXXXXXX");
49	fd = mkstemp(tbuf);
50	if (fd < 0)
51	{
52		printf("*** Could not create test file %s\n", tbuf);
53		exit(EX_CANTCREAT);
54	}
55	errno = 0;
56	i = pathconf(".", _PC_CHOWN_RESTRICTED);
57	printf("pathconf(.) returns %2d, errno = %d\n", i, errno);
58	errno = 0;
59	i = pathconf(tbuf, _PC_CHOWN_RESTRICTED);
60	printf("pathconf(%s) returns %2d, errno = %d\n", tbuf, i, errno);
61	errno = 0;
62	i = fpathconf(fd, _PC_CHOWN_RESTRICTED);
63	printf("fpathconf(%s) returns %2d, errno = %d\n", tbuf, i, errno);
64	if (errno == 0 && i >= 0)
65	{
66		/* so it claims that it doesn't work -- try anyhow */
67		printf("  fpathconf claims that chown is safe ");
68		if (fchown(fd, 1, 1) >= 0)
69			printf("*** but fchown works anyhow! ***\n");
70		else
71			printf("and fchown agrees\n");
72	}
73	else
74	{
75		/* well, let's see what really happens */
76		printf("  fpathconf claims that chown is not safe ");
77		if (fchown(fd, 1, 1) >= 0)
78			printf("as indeed it is not\n");
79		else
80			printf("*** but in fact it is safe ***\n");
81	}
82	(void) unlink(tbuf);
83	exit(EX_OK);
84}
85