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