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