]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/contrib/openzfs/tests/zfs-tests/tests/functional/truncate/truncate_test.c
Import tzdata 2020b
[FreeBSD/FreeBSD.git] / sys / contrib / openzfs / tests / zfs-tests / tests / functional / truncate / truncate_test.c
1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11
12 /*
13  * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
14  * Copyright 2017, loli10K <ezomori.nozomu@gmail.com>. All rights reserved.
15  */
16
17 #include <fcntl.h>
18 #include <sys/stat.h>
19 #include <sys/types.h>
20 #include <unistd.h>
21 #include <errno.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24
25 #define FSIZE   256*1024*1024
26
27 static long     fsize = FSIZE;
28 static int      errflag = 0;
29 static char     *filename = NULL;
30 static int      ftruncflag = 0;
31
32 static void parse_options(int argc, char *argv[]);
33
34 static void
35 usage(char *execname)
36 {
37         (void) fprintf(stderr,
38             "usage: %s [-s filesize] [-f] /path/to/file\n", execname);
39         (void) exit(1);
40 }
41
42 int
43 main(int argc, char *argv[])
44 {
45         int fd;
46
47         parse_options(argc, argv);
48
49         if (ftruncflag) {
50                 fd = open(filename, O_RDWR|O_CREAT, 0666);
51                 if (fd < 0) {
52                         perror("open");
53                         return (1);
54                 }
55                 if (ftruncate(fd, fsize) < 0) {
56                         perror("ftruncate");
57                         return (1);
58                 }
59                 if (close(fd)) {
60                         perror("close");
61                         return (1);
62                 }
63         } else {
64                 if (truncate(filename, fsize) < 0) {
65                         perror("truncate");
66                         return (1);
67                 }
68         }
69         return (0);
70 }
71
72 static void
73 parse_options(int argc, char *argv[])
74 {
75         int c;
76         extern char *optarg;
77         extern int optind, optopt;
78
79         while ((c = getopt(argc, argv, "s:f")) != -1) {
80                 switch (c) {
81                         case 's':
82                                 fsize = atoi(optarg);
83                                 break;
84                         case 'f':
85                                 ftruncflag++;
86                                 break;
87                         case ':':
88                                 (void) fprintf(stderr,
89                                     "Option -%c requires an operand\n", optopt);
90                                 errflag++;
91                                 break;
92                 }
93                 if (errflag) {
94                         (void) usage(argv[0]);
95                 }
96         }
97
98         if (argc <= optind) {
99                 (void) fprintf(stderr, "No filename specified\n");
100                 usage(argv[0]);
101         }
102         filename = argv[optind];
103 }