4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
24 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
25 * Use is subject to license terms.
38 #define MIN(a, b) ((a) < (b) ? (a) : (b))
40 #define BLOCK_SIZE 512 /* bytes */
42 #define MEGABYTE (KILOBYTE * KILOBYTE)
43 #define GIGABYTE (KILOBYTE * MEGABYTE)
45 #define FILE_MODE (S_ISVTX + S_IRUSR + S_IWUSR)
47 static void usage(void);
50 main(int argc
, char **argv
)
60 int verbose
= 0; /* option variable */
61 int nobytes
= 0; /* option variable */
67 while (argv
[1] && argv
[1][0] == '-') {
87 len
= strlen(argv
[1]);
88 if (len
&& isalpha(argv
[1][len
-1])) {
89 switch (argv
[1][len
-1]) {
107 (void) fprintf(stderr
,
108 gettext("unknown size %s\n"), argv
[1]);
112 for (i
= 0; i
<= (len
-2); i
++) {
113 if (!isdigit(argv
[1][i
])) {
114 (void) fprintf(stderr
,
115 gettext("unknown size %s\n"), argv
[1]);
119 argv
[1][len
-1] = '\0';
121 size
= ((off_t
)atoll(argv
[1]) * (off_t
)mult
);
130 (void) fprintf(stdout
, gettext("%s %lld bytes\n"),
131 argv
[1], (offset_t
)size
);
132 fd
= open(argv
[1], O_CREAT
|O_TRUNC
|O_RDWR
, FILE_MODE
);
135 (void) fprintf(stderr
,
136 gettext("Could not open %s: %s\n"),
137 argv
[1], strerror(saverr
));
143 if (lseek(fd
, (off_t
)size
-1, SEEK_SET
) < 0) {
145 (void) fprintf(stderr
, gettext(
146 "Could not seek to offset %ld in %s: %s\n"),
147 (ulong_t
)size
-1, argv
[1], strerror(saverr
));
153 } else if (write(fd
, "", 1) != 1) {
155 (void) fprintf(stderr
, gettext(
156 "Could not set length of %s: %s\n"),
157 argv
[1], strerror(saverr
));
169 if (lseek(fd
, (off_t
)0, SEEK_SET
) < 0) {
171 (void) fprintf(stderr
, gettext(
172 "Could not seek to beginning of %s: %s\n"),
173 argv
[1], strerror(saverr
));
180 if (fstat64(fd
, &st
) < 0) {
182 (void) fprintf(stderr
, gettext(
183 "Could not fstat64 %s: %s\n"),
184 argv
[1], strerror(saverr
));
191 if (bufsz
!= st
.st_blksize
) {
193 bufsz
= (size_t)st
.st_blksize
;
194 buf
= calloc(bufsz
, 1);
196 (void) fprintf(stderr
, gettext(
197 "Could not allocate buffer of"
198 " size %d\n"), (int)bufsz
);
207 while (written
< size
) {
209 size_t bytes
= (size_t)MIN(bufsz
, size
-written
);
211 if ((result
= write(fd
, buf
, bytes
)) !=
217 (void) fprintf(stderr
, gettext(
218 "%s: initialized %lu of %lu bytes: %s\n"),
219 argv
[1], (ulong_t
)written
,
229 * A write(2) call in the above loop failed so
230 * close out this file and go on (error was
231 * already incremented when the write(2) failed).
233 if (written
< size
) {
242 (void) fprintf(stderr
, gettext(
243 "Error encountered when closing %s: %s\n"),
244 argv
[1], strerror(saverr
));
252 * Only set the modes (including the sticky bit) if we
253 * had no problems. It is not an error for the chmod(2)
254 * to fail, but do issue a warning.
256 if (chmod(argv
[1], FILE_MODE
) < 0)
257 (void) fprintf(stderr
, gettext(
258 "warning: couldn't set mode to %#o\n"), FILE_MODE
);
268 (void) fprintf(stderr
, gettext(
269 "Usage: mkfile [-nv] <size>[g|k|b|m] <name1> [<name2>] ...\n"));