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