check: Remount file system if MOUNT_OPTIONS changed
[xfstests-dev.git] / src / permname.c
1 /*
2  * Copyright (c) 2000-2001 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it would be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write the Free Software Foundation,
16  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18  
19 #include "global.h"
20
21 char    *alpha;
22 int     asize = 1;
23 int     asplit;
24 char    *buf;
25 int     dflag;
26 int     len = 1;
27 int     nproc = 1;
28 int     nflag;
29 int     vflag;
30 int     pid;
31
32 void    mkf(int idx, int p);
33
34 int
35 main(int argc, char **argv)
36 {
37         int             a;
38         int             stat;
39         long long       tot;
40         int             usage=0;
41         char *          argv0=argv[0];
42
43         argc--;
44         argv++;
45         pid=getpid();
46         
47         if (!argc) usage++;
48         while (argc) {
49                 if (strcmp(*argv, "-c") == 0) {
50                         argc--;
51                         argv++;
52                         asize = atoi(*argv);
53                         if (asize > 64 || asize < 1) {
54                                 fprintf(stderr, "bad alpha size %s\n", *argv);
55                                 return 1;
56                         }
57                 } else if (strcmp(*argv, "-d") == 0) {
58                         dflag = 1;
59                 } else if (strcmp(*argv, "-l") == 0) {
60                         argc--;
61                         argv++;
62                         len = atoi(*argv);
63                         if (len < 1) {
64                                 fprintf(stderr, "bad name length %s\n", *argv);
65                                 return 1;
66                         }
67                 } else if (strcmp(*argv, "-p") == 0) {
68                         argc--;
69                         argv++;
70                         nproc = atoi(*argv);
71                         if (nproc < 1) {
72                                 fprintf(stderr, "bad process count %s\n",
73                                         *argv);
74                                 return 1;
75                         }
76                 } else if (strcmp(*argv, "-n") == 0) {
77                         nflag = 1; 
78                 } else if (strcmp(*argv, "-v") == 0) {
79                         vflag = 1;
80                 } else if (strcmp(*argv, "-h") == 0) {
81                         usage++;
82                 } else {
83                         fprintf(stderr,"unknown switch \"%s\"\n", *argv);
84                         usage++;
85                 }
86                 argc--;
87                 argv++;
88         }
89         
90         if (usage) {
91                 fprintf(stderr,"permname: usage %s [-c alpha size] [-l name length] "
92                                "[-p proc count] [-n] [-v] [-d] [-h]\n", argv0);
93                 fprintf(stderr,"          -n : don't actually perform action\n");
94                 fprintf(stderr,"          -v : be verbose\n");
95                 fprintf(stderr,"          -d : create directories, not files\n");
96                 exit(1);
97         }
98         
99         if (asize % nproc) {
100                 fprintf(stderr,
101                         "alphabet size must be multiple of process count\n");
102                 return 1;
103         }
104         asplit = asize / nproc;
105         alpha = malloc(asize + 1);
106         buf = malloc(len + 1);
107         for (a = 0, tot = 1; a < len; a++)
108                 tot *= asize;
109         if (vflag) fprintf(stderr,"[%d] ",pid);
110         fprintf(stderr,
111                 "alpha size = %d, name length = %d, total files = %lld, nproc=%d\n",
112                 asize, len, tot, nproc);
113         fflush(stderr);
114         for (a = 0; a < asize; a++) {
115                 if (a < 26)
116                         alpha[a] = 'a' + a;
117                 else if (a < 52)
118                         alpha[a] = 'A' + a - 26;
119                 else if (a < 62)
120                         alpha[a] = '0' + a - 52;
121                 else if (a == 62)
122                         alpha[62] = '_';
123                 else if (a == 63)
124                         alpha[63] = '@';
125         }
126         for (a = 0; a < nproc; a++) {
127                 int r=fork();
128                 if (r<0) {
129                         perror("fork");
130                         exit(1);
131                 }
132                 if (!r) {
133                         pid=getpid();
134                         mkf(0, a);
135                         return 0;
136                 }
137         }
138         while (1) {
139                 int r=wait(&stat);
140                 if (r<0) {
141                         if (errno==ECHILD) break;
142                         perror("wait");
143                         exit(1);
144                 }
145                 if (!r) break;
146         }
147         
148         return 0;
149 }
150
151 void
152 mkf(int idx, int p)
153 {
154         int     i;
155         int     last;
156
157         last = (idx == len - 1);
158         if (last) {
159                 buf[len] = '\0';
160                 for (i = p * asplit; i < (p + 1) * asplit; i++) {
161                         buf[idx] = alpha[i];
162                         
163                         if (dflag) {
164                                 if (vflag) printf("[%d] mkdir %s\n", pid, buf);
165                                 if (!nflag) {
166                                     if (mkdir(buf, 0777)<0) {
167                                         perror("mkdir");
168                                         exit(1);
169                                     }
170                                 }
171                         } else {
172                                 if (vflag) printf("[%d] touch %s\n", pid, buf);
173                                 if (!nflag) {
174                                     int f=creat(buf, 0666);
175                                     if (f<0) {
176                                         perror("creat");
177                                         exit(1);
178                                     }
179                                     if (close(f)) {
180                                         perror("close");
181                                         exit(1);
182                                     }
183                                 }
184                         }
185                 }
186         } else {
187                 for (i = 0; i < asize; i++) {
188                         buf[idx] = alpha[i];
189                         mkf(idx + 1, p);
190                 }
191         }
192 }