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.
37 #include <sys/stdtypes.h>
38 #include <sys/sysmacros.h>
40 #define BLOCKSIZE 512 /* bytes */
42 #define MEGABYTE (KILOBYTE * KILOBYTE)
43 #define GIGABYTE (KILOBYTE * MEGABYTE)
45 #define FILE_MODE (S_ISVTX + S_IRUSR + S_IWUSR)
47 static _Noreturn
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
));
142 } else if (fchown(fd
, getuid(), getgid()) < 0) {
144 (void) fprintf(stderr
, gettext(
145 "Could not set owner/group of %s: %s\n"),
146 argv
[1], strerror(saverr
));
152 } else if (lseek(fd
, (off_t
)size
-1, SEEK_SET
) < 0) {
154 (void) fprintf(stderr
, gettext(
155 "Could not seek to offset %ld in %s: %s\n"),
156 (unsigned long)size
-1, argv
[1], strerror(saverr
));
162 } else if (write(fd
, "", 1) != 1) {
164 (void) fprintf(stderr
, gettext(
165 "Could not set length of %s: %s\n"),
166 argv
[1], strerror(saverr
));
178 if (lseek(fd
, (off_t
)0, SEEK_SET
) < 0) {
180 (void) fprintf(stderr
, gettext(
181 "Could not seek to beginning of %s: %s\n"),
182 argv
[1], strerror(saverr
));
189 if (fstat64(fd
, &st
) < 0) {
191 (void) fprintf(stderr
, gettext(
192 "Could not fstat64 %s: %s\n"),
193 argv
[1], strerror(saverr
));
200 if (bufsz
!= st
.st_blksize
) {
203 bufsz
= (size_t)st
.st_blksize
;
204 buf
= calloc(1, bufsz
);
206 (void) fprintf(stderr
, gettext(
207 "Could not allocate buffer of"
208 " size %d\n"), (int)bufsz
);
217 while (written
< size
) {
219 size_t bytes
= (size_t)MIN(bufsz
, size
-written
);
221 if ((result
= write(fd
, buf
, bytes
)) !=
227 (void) fprintf(stderr
, gettext(
228 "%s: initialized %lu of %lu bytes: %s\n"),
229 argv
[1], (unsigned long)written
,
239 * A write(2) call in the above loop failed so
240 * close out this file and go on (error was
241 * already incremented when the write(2) failed).
243 if (written
< size
) {
252 (void) fprintf(stderr
, gettext(
253 "Error encountered when closing %s: %s\n"),
254 argv
[1], strerror(saverr
));
262 * Only set the modes (including the sticky bit) if we
263 * had no problems. It is not an error for the chmod(2)
264 * to fail, but do issue a warning.
266 if (chmod(argv
[1], FILE_MODE
) < 0)
267 (void) fprintf(stderr
, gettext(
268 "warning: couldn't set mode to %#o\n"), FILE_MODE
);
278 (void) fprintf(stderr
, gettext(
279 "Usage: mkfile [-nv] <size>[g|k|b|m] <name1> [<name2>] ...\n"));