4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or https://opensource.org/licenses/CDDL-1.0.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
28 * Copyright (c) 2012 by Delphix. All rights reserved.
31 #include "file_common.h"
32 #include <sys/param.h>
36 #include <sys/stdtypes.h>
40 * --------------------------------------------------------------
43 * The last byte of the largest file size can be
44 * accessed without any errors. Also, the writing
45 * beyond the last byte of the largest file size
46 * will produce an errno of EFBIG.
48 * --------------------------------------------------------------
49 * If the write() system call below returns a "1",
50 * then the last byte can be accessed.
51 * --------------------------------------------------------------
53 static void sigxfsz(int);
54 static void usage(char *);
57 main(int argc
, char **argv
)
60 offset_t offset
= (MAXOFFSET_T
- 1);
61 offset_t llseek_ret
= 0;
64 char mybuf
[5] = "aaaa\0";
66 mode_t mode
= S_IRUSR
| S_IWUSR
| S_IRGRP
| S_IROTH
;
73 if (sigemptyset(&sa
.sa_mask
) == -1)
76 sa
.sa_handler
= sigxfsz
;
77 if (sigaction(SIGXFSZ
, &sa
, NULL
) == -1)
80 testfile
= strdup(argv
[1]);
84 fd
= open(testfile
, O_CREAT
| O_RDWR
, mode
);
87 perror("Failed to create testfile");
92 llseek_ret
= lseek64(fd
, offset
, SEEK_SET
);
95 perror("Failed to seek to end of testfile");
99 write_ret
= write(fd
, mybuf
, 1);
102 perror("Failed to write to end of file");
107 llseek_ret
= lseek64(fd
, offset
, SEEK_CUR
);
108 if (llseek_ret
< 0) {
110 perror("Failed to seek to end of file");
114 write_ret
= write(fd
, mybuf
, 1);
116 if (errno
== EFBIG
|| errno
== EINVAL
) {
117 (void) printf("write errno=EFBIG|EINVAL: success\n");
121 perror("Did not receive EFBIG");
124 (void) printf("write completed successfully, test failed\n");
129 (void) unlink(testfile
);
138 (void) printf("%s <testfile>\n", name
);
146 (void) printf("\nlargest_file: sigxfsz() caught SIGXFSZ\n");