1*d583b39bSJohn Wren Kennedy /*
2*d583b39bSJohn Wren Kennedy  * CDDL HEADER START
3*d583b39bSJohn Wren Kennedy  *
4*d583b39bSJohn Wren Kennedy  * The contents of this file are subject to the terms of the
5*d583b39bSJohn Wren Kennedy  * Common Development and Distribution License (the "License").
6*d583b39bSJohn Wren Kennedy  * You may not use this file except in compliance with the License.
7*d583b39bSJohn Wren Kennedy  *
8*d583b39bSJohn Wren Kennedy  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*d583b39bSJohn Wren Kennedy  * or http://www.opensolaris.org/os/licensing.
10*d583b39bSJohn Wren Kennedy  * See the License for the specific language governing permissions
11*d583b39bSJohn Wren Kennedy  * and limitations under the License.
12*d583b39bSJohn Wren Kennedy  *
13*d583b39bSJohn Wren Kennedy  * When distributing Covered Code, include this CDDL HEADER in each
14*d583b39bSJohn Wren Kennedy  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*d583b39bSJohn Wren Kennedy  * If applicable, add the following below this CDDL HEADER, with the
16*d583b39bSJohn Wren Kennedy  * fields enclosed by brackets "[]" replaced with your own identifying
17*d583b39bSJohn Wren Kennedy  * information: Portions Copyright [yyyy] [name of copyright owner]
18*d583b39bSJohn Wren Kennedy  *
19*d583b39bSJohn Wren Kennedy  * CDDL HEADER END
20*d583b39bSJohn Wren Kennedy  */
21*d583b39bSJohn Wren Kennedy 
22*d583b39bSJohn Wren Kennedy /*
23*d583b39bSJohn Wren Kennedy  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24*d583b39bSJohn Wren Kennedy  * Use is subject to license terms.
25*d583b39bSJohn Wren Kennedy  */
26*d583b39bSJohn Wren Kennedy 
27*d583b39bSJohn Wren Kennedy /*
28*d583b39bSJohn Wren Kennedy  * Copyright (c) 2012 by Delphix. All rights reserved.
29*d583b39bSJohn Wren Kennedy  */
30*d583b39bSJohn Wren Kennedy 
31*d583b39bSJohn Wren Kennedy #include "../file_common.h"
32*d583b39bSJohn Wren Kennedy #include <sys/param.h>
33*d583b39bSJohn Wren Kennedy #include <signal.h>
34*d583b39bSJohn Wren Kennedy #include <stdio.h>
35*d583b39bSJohn Wren Kennedy 
36*d583b39bSJohn Wren Kennedy /*
37*d583b39bSJohn Wren Kennedy  * --------------------------------------------------------------
38*d583b39bSJohn Wren Kennedy  *
39*d583b39bSJohn Wren Kennedy  *	Assertion:
40*d583b39bSJohn Wren Kennedy  *		The last byte of the largest file size can be
41*d583b39bSJohn Wren Kennedy  *		accessed without any errors.  Also, the writing
42*d583b39bSJohn Wren Kennedy  *		beyond the last byte of the largest file size
43*d583b39bSJohn Wren Kennedy  *		will produce an errno of EFBIG.
44*d583b39bSJohn Wren Kennedy  *
45*d583b39bSJohn Wren Kennedy  * --------------------------------------------------------------
46*d583b39bSJohn Wren Kennedy  *	If the write() system call below returns a "1",
47*d583b39bSJohn Wren Kennedy  *	then the last byte can be accessed.
48*d583b39bSJohn Wren Kennedy  * --------------------------------------------------------------
49*d583b39bSJohn Wren Kennedy  */
50*d583b39bSJohn Wren Kennedy static void	sigxfsz(int);
51*d583b39bSJohn Wren Kennedy static void	usage(char *);
52*d583b39bSJohn Wren Kennedy 
53*d583b39bSJohn Wren Kennedy int
main(int argc,char ** argv)54*d583b39bSJohn Wren Kennedy main(int argc, char **argv)
55*d583b39bSJohn Wren Kennedy {
56*d583b39bSJohn Wren Kennedy 	int		fd = 0;
57*d583b39bSJohn Wren Kennedy 	offset_t	offset = (MAXOFFSET_T - 1);
58*d583b39bSJohn Wren Kennedy 	offset_t	llseek_ret = 0;
59*d583b39bSJohn Wren Kennedy 	int		write_ret = 0;
60*d583b39bSJohn Wren Kennedy 	int		err = 0;
61*d583b39bSJohn Wren Kennedy 	char		mybuf[5];
62*d583b39bSJohn Wren Kennedy 	char		*testfile;
63*d583b39bSJohn Wren Kennedy 	mode_t		mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
64*d583b39bSJohn Wren Kennedy 
65*d583b39bSJohn Wren Kennedy 	if (argc != 2) {
66*d583b39bSJohn Wren Kennedy 		usage(argv[0]);
67*d583b39bSJohn Wren Kennedy 	}
68*d583b39bSJohn Wren Kennedy 
69*d583b39bSJohn Wren Kennedy 	(void) sigset(SIGXFSZ, sigxfsz);
70*d583b39bSJohn Wren Kennedy 
71*d583b39bSJohn Wren Kennedy 	testfile = strdup(argv[1]);
72*d583b39bSJohn Wren Kennedy 
73*d583b39bSJohn Wren Kennedy 	fd = open(testfile, O_CREAT | O_RDWR, mode);
74*d583b39bSJohn Wren Kennedy 	if (fd < 0) {
75*d583b39bSJohn Wren Kennedy 		perror("Failed to create testfile");
76*d583b39bSJohn Wren Kennedy 		err = errno;
77*d583b39bSJohn Wren Kennedy 		goto out;
78*d583b39bSJohn Wren Kennedy 	}
79*d583b39bSJohn Wren Kennedy 
80*d583b39bSJohn Wren Kennedy 	llseek_ret = llseek(fd, offset, SEEK_SET);
81*d583b39bSJohn Wren Kennedy 	if (llseek_ret < 0) {
82*d583b39bSJohn Wren Kennedy 		perror("Failed to seek to end of testfile");
83*d583b39bSJohn Wren Kennedy 		err = errno;
84*d583b39bSJohn Wren Kennedy 		goto out;
85*d583b39bSJohn Wren Kennedy 	}
86*d583b39bSJohn Wren Kennedy 
87*d583b39bSJohn Wren Kennedy 	write_ret = write(fd, mybuf, 1);
88*d583b39bSJohn Wren Kennedy 	if (write_ret < 0) {
89*d583b39bSJohn Wren Kennedy 		perror("Failed to write to end of file");
90*d583b39bSJohn Wren Kennedy 		err = errno;
91*d583b39bSJohn Wren Kennedy 		goto out;
92*d583b39bSJohn Wren Kennedy 	}
93*d583b39bSJohn Wren Kennedy 
94*d583b39bSJohn Wren Kennedy 	offset = 0;
95*d583b39bSJohn Wren Kennedy 	llseek_ret = llseek(fd, offset, SEEK_CUR);
96*d583b39bSJohn Wren Kennedy 	if (llseek_ret < 0) {
97*d583b39bSJohn Wren Kennedy 		perror("Failed to seek to end of file");
98*d583b39bSJohn Wren Kennedy 		err = errno;
99*d583b39bSJohn Wren Kennedy 		goto out;
100*d583b39bSJohn Wren Kennedy 	}
101*d583b39bSJohn Wren Kennedy 
102*d583b39bSJohn Wren Kennedy 	write_ret = write(fd, mybuf, 1);
103*d583b39bSJohn Wren Kennedy 	if (write_ret < 0) {
104*d583b39bSJohn Wren Kennedy 		if (errno == EFBIG) {
105*d583b39bSJohn Wren Kennedy 			(void) printf("write errno=EFBIG: success\n");
106*d583b39bSJohn Wren Kennedy 			err = 0;
107*d583b39bSJohn Wren Kennedy 		} else {
108*d583b39bSJohn Wren Kennedy 			perror("Did not receive EFBIG");
109*d583b39bSJohn Wren Kennedy 			err = errno;
110*d583b39bSJohn Wren Kennedy 		}
111*d583b39bSJohn Wren Kennedy 	} else {
112*d583b39bSJohn Wren Kennedy 		(void) printf("write completed successfully, test failed\n");
113*d583b39bSJohn Wren Kennedy 		err = 1;
114*d583b39bSJohn Wren Kennedy 	}
115*d583b39bSJohn Wren Kennedy 
116*d583b39bSJohn Wren Kennedy out:
117*d583b39bSJohn Wren Kennedy 	(void) unlink(testfile);
118*d583b39bSJohn Wren Kennedy 	free(testfile);
119*d583b39bSJohn Wren Kennedy 	return (err);
120*d583b39bSJohn Wren Kennedy }
121*d583b39bSJohn Wren Kennedy 
122*d583b39bSJohn Wren Kennedy static void
usage(char * name)123*d583b39bSJohn Wren Kennedy usage(char *name)
124*d583b39bSJohn Wren Kennedy {
125*d583b39bSJohn Wren Kennedy 	(void) printf("%s <testfile>\n", name);
126*d583b39bSJohn Wren Kennedy 	exit(1);
127*d583b39bSJohn Wren Kennedy }
128*d583b39bSJohn Wren Kennedy 
129*d583b39bSJohn Wren Kennedy /* ARGSUSED */
130*d583b39bSJohn Wren Kennedy static void
sigxfsz(int signo)131*d583b39bSJohn Wren Kennedy sigxfsz(int signo)
132*d583b39bSJohn Wren Kennedy {
133*d583b39bSJohn Wren Kennedy 	(void) printf("\nlargest_file: sigxfsz() caught SIGXFSZ\n");
134*d583b39bSJohn Wren Kennedy }
135