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 http://www.opensolaris.org/os/licensing.
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.
33 #include <sys/types.h>
34 #include <sys/errno.h>
35 #include <sys/param.h>
42 static char fdname
[MAXPATHLEN
] = {0};
43 static char *pbasedir
= NULL
;
44 static int nlevel
= 2;
48 static void usage(char *this);
49 static void crtfile(char *pname
);
50 static char *getfdname(char *pdir
, char type
, int level
, int dir
, int file
);
51 static int mktree(char *pbasedir
, int level
);
54 main(int argc
, char *argv
[])
58 while ((c
= getopt(argc
, argv
, "b:l:d:f:")) != -1) {
64 nlevel
= atoi(optarg
);
76 if (nlevel
< 0 || ndir
< 0 || nfile
< 0 || pbasedir
== NULL
) {
80 ret
= mktree(pbasedir
, 1);
88 (void) fprintf(stderr
,
89 "\tUsage: %s -b <base_dir> -l [nlevel] -d [ndir] -f [nfile]\n",
95 mktree(char *pdir
, int level
)
98 char dname
[MAXPATHLEN
] = {0};
99 char fname
[MAXPATHLEN
] = {0};
101 if (level
> nlevel
) {
105 for (d
= 0; d
< ndir
; d
++) {
106 (void) memset(dname
, '\0', sizeof (dname
));
107 (void) strcpy(dname
, getfdname(pdir
, TYPE_D
, level
, d
, 0));
109 if (mkdir(dname
, 0777) != 0) {
110 (void) fprintf(stderr
, "mkdir(%s) failed."
112 dname
, errno
, strerror(errno
));
117 * No sub-directory need be created, only create files in it.
119 if (mktree(dname
, level
+1) != 0) {
120 for (f
= 0; f
< nfile
; f
++) {
121 (void) memset(fname
, '\0', sizeof (fname
));
123 getfdname(dname
, TYPE_F
, level
+1, d
, f
));
129 for (f
= 0; f
< nfile
; f
++) {
130 (void) memset(fname
, '\0', sizeof (fname
));
131 (void) strcpy(fname
, getfdname(pdir
, TYPE_F
, level
, d
, f
));
139 getfdname(char *pdir
, char type
, int level
, int dir
, int file
)
141 (void) snprintf(fdname
, sizeof (fdname
),
142 "%s/%c-l%dd%df%d", pdir
, type
, level
, dir
, file
);
152 char *context
= "0123456789ABCDF";
159 size
= sizeof (char) * 1024;
160 pbuf
= (char *)valloc(size
);
161 for (i
= 0; i
< size
/ strlen(context
); i
++) {
162 int offset
= i
* strlen(context
);
163 (void) snprintf(pbuf
+offset
, size
-offset
, "%s", context
);
166 if ((fd
= open(pname
, O_CREAT
|O_RDWR
, 0777)) < 0) {
167 (void) fprintf(stderr
, "open(%s, O_CREAT|O_RDWR, 0777) failed."
168 "\n[%d]: %s.\n", pname
, errno
, strerror(errno
));
171 if (write(fd
, pbuf
, 1024) < 1024) {
172 (void) fprintf(stderr
, "write(fd, pbuf, 1024) failed."
173 "\n[%d]: %s.\n", errno
, strerror(errno
));
177 if ((afd
= openat(fd
, "xattr", O_CREAT
| O_RDWR
| O_XATTR
, 0777)) < 0) {
178 (void) fprintf(stderr
, "openat failed.\n[%d]: %s.\n",
179 errno
, strerror(errno
));
182 if (write(afd
, pbuf
, 1024) < 1024) {
183 (void) fprintf(stderr
, "write(afd, pbuf, 1024) failed."
184 "\n[%d]: %s.\n", errno
, strerror(errno
));