Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/tests/sys/cddl/zfs/bin/largest_file.c
39536 views
1
/*
2
* CDDL HEADER START
3
*
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.
7
*
8
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9
* or http://www.opensolaris.org/os/licensing.
10
* See the License for the specific language governing permissions
11
* and limitations under the License.
12
*
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]
18
*
19
* CDDL HEADER END
20
*/
21
22
/*
23
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
24
* Use is subject to license terms.
25
*/
26
27
28
#include "file_common.h"
29
#include <sys/param.h>
30
#include <signal.h>
31
#include <stdio.h>
32
33
/*
34
* --------------------------------------------------------------
35
*
36
* Assertion:
37
* The last byte of the largest file size can be
38
* accessed without any errors. Also, the writing
39
* beyond the last byte of the largest file size
40
* will produce an errno of EFBIG.
41
*
42
* --------------------------------------------------------------
43
* If the write() system call below returns a "1",
44
* then the last byte can be accessed.
45
* --------------------------------------------------------------
46
*/
47
static void sigxfsz(int);
48
static void usage(char *);
49
50
int
51
main(int argc, char **argv)
52
{
53
int fd = 0;
54
off_t offset = (OFF_MAX - 1);
55
off_t lseek_ret = 0;
56
int write_ret = 0;
57
int err = 0;
58
char mybuf[5];
59
char *testfile;
60
61
if (argc != 2) {
62
usage(argv[0]);
63
}
64
65
(void) sigset(SIGXFSZ, sigxfsz);
66
67
testfile = strdup(argv[1]);
68
69
fd = open(testfile, O_CREAT | O_RDWR);
70
if (fd < 0) {
71
perror("Failed to create testfile");
72
err = errno;
73
goto out;
74
}
75
76
lseek_ret = lseek(fd, offset, SEEK_SET);
77
if (lseek_ret < 0) {
78
perror("Failed to seek to end of testfile");
79
err = errno;
80
goto out;
81
}
82
83
write_ret = write(fd, mybuf, 1);
84
if (write_ret < 0) {
85
perror("Failed to write to end of file");
86
err = errno;
87
goto out;
88
}
89
90
offset = 0;
91
lseek_ret = lseek(fd, offset, SEEK_CUR);
92
if (lseek_ret < 0) {
93
perror("Failed to seek to end of file");
94
err = errno;
95
goto out;
96
}
97
98
write_ret = write(fd, mybuf, 1);
99
if (write_ret < 0) {
100
if (errno == EFBIG) {
101
(void) printf("write errno=EFBIG: success\n");
102
err = 0;
103
} else {
104
perror("Did not receive EFBIG");
105
err = errno;
106
}
107
} else {
108
(void) printf("write completed successfully, test failed\n");
109
err = 1;
110
}
111
112
out:
113
(void) unlink(testfile);
114
free(testfile);
115
return (err);
116
}
117
118
static void
119
usage(char *name)
120
{
121
(void) printf("%s <testfile>\n", name);
122
exit(1);
123
}
124
125
/* ARGSUSED */
126
static void
127
sigxfsz(int signo)
128
{
129
(void) printf("\nlargest_file: sigxfsz() caught SIGXFSZ\n");
130
}
131
132