src/idmapped-mounts: use renameat instead of renameat2
[xfstests-dev.git] / src / permname.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2000-2001 Silicon Graphics, Inc.
4  * All Rights Reserved.
5  */
6  
7 #include "global.h"
8
9 char    *alpha;
10 int     asize = 1;
11 int     asplit;
12 char    *buf;
13 int     dflag;
14 int     len = 1;
15 int     nproc = 1;
16 int     nflag;
17 int     vflag;
18 int     pid;
19
20 void    mkf(int idx, int p);
21
22 int
23 main(int argc, char **argv)
24 {
25         int             a;
26         int             stat;
27         long long       tot;
28         int             usage=0;
29         char *          argv0=argv[0];
30
31         argc--;
32         argv++;
33         pid=getpid();
34         
35         if (!argc) usage++;
36         while (argc) {
37                 if (strcmp(*argv, "-c") == 0) {
38                         argc--;
39                         argv++;
40                         asize = atoi(*argv);
41                         if (asize > 64 || asize < 1) {
42                                 fprintf(stderr, "bad alpha size %s\n", *argv);
43                                 return 1;
44                         }
45                 } else if (strcmp(*argv, "-d") == 0) {
46                         dflag = 1;
47                 } else if (strcmp(*argv, "-l") == 0) {
48                         argc--;
49                         argv++;
50                         len = atoi(*argv);
51                         if (len < 1) {
52                                 fprintf(stderr, "bad name length %s\n", *argv);
53                                 return 1;
54                         }
55                 } else if (strcmp(*argv, "-p") == 0) {
56                         argc--;
57                         argv++;
58                         nproc = atoi(*argv);
59                         if (nproc < 1) {
60                                 fprintf(stderr, "bad process count %s\n",
61                                         *argv);
62                                 return 1;
63                         }
64                 } else if (strcmp(*argv, "-n") == 0) {
65                         nflag = 1; 
66                 } else if (strcmp(*argv, "-v") == 0) {
67                         vflag = 1;
68                 } else if (strcmp(*argv, "-h") == 0) {
69                         usage++;
70                 } else {
71                         fprintf(stderr,"unknown switch \"%s\"\n", *argv);
72                         usage++;
73                 }
74                 argc--;
75                 argv++;
76         }
77         
78         if (usage) {
79                 fprintf(stderr,"permname: usage %s [-c alpha size] [-l name length] "
80                                "[-p proc count] [-n] [-v] [-d] [-h]\n", argv0);
81                 fprintf(stderr,"          -n : don't actually perform action\n");
82                 fprintf(stderr,"          -v : be verbose\n");
83                 fprintf(stderr,"          -d : create directories, not files\n");
84                 exit(1);
85         }
86         
87         if (asize % nproc) {
88                 fprintf(stderr,
89                         "alphabet size must be multiple of process count\n");
90                 return 1;
91         }
92         asplit = asize / nproc;
93         alpha = malloc(asize + 1);
94         buf = malloc(len + 1);
95         for (a = 0, tot = 1; a < len; a++)
96                 tot *= asize;
97         if (vflag) fprintf(stderr,"[%d] ",pid);
98         fprintf(stderr,
99                 "alpha size = %d, name length = %d, total files = %lld, nproc=%d\n",
100                 asize, len, tot, nproc);
101         fflush(stderr);
102         for (a = 0; a < asize; a++) {
103                 if (a < 26)
104                         alpha[a] = 'a' + a;
105                 else if (a < 52)
106                         alpha[a] = 'A' + a - 26;
107                 else if (a < 62)
108                         alpha[a] = '0' + a - 52;
109                 else if (a == 62)
110                         alpha[62] = '_';
111                 else if (a == 63)
112                         alpha[63] = '@';
113         }
114         for (a = 0; a < nproc; a++) {
115                 int r=fork();
116                 if (r<0) {
117                         perror("fork");
118                         exit(1);
119                 }
120                 if (!r) {
121                         pid=getpid();
122                         mkf(0, a);
123                         return 0;
124                 }
125         }
126         while (1) {
127                 int r=wait(&stat);
128                 if (r<0) {
129                         if (errno==ECHILD) break;
130                         perror("wait");
131                         exit(1);
132                 }
133                 if (!r) break;
134         }
135         
136         return 0;
137 }
138
139 void
140 mkf(int idx, int p)
141 {
142         int     i;
143         int     last;
144
145         last = (idx == len - 1);
146         if (last) {
147                 buf[len] = '\0';
148                 for (i = p * asplit; i < (p + 1) * asplit; i++) {
149                         buf[idx] = alpha[i];
150                         
151                         if (dflag) {
152                                 if (vflag) printf("[%d] mkdir %s\n", pid, buf);
153                                 if (!nflag) {
154                                     if (mkdir(buf, 0777)<0) {
155                                         perror("mkdir");
156                                         exit(1);
157                                     }
158                                 }
159                         } else {
160                                 if (vflag) printf("[%d] touch %s\n", pid, buf);
161                                 if (!nflag) {
162                                     int f=creat(buf, 0666);
163                                     if (f<0) {
164                                         perror("creat");
165                                         exit(1);
166                                     }
167                                     if (close(f)) {
168                                         perror("close");
169                                         exit(1);
170                                     }
171                                 }
172                         }
173                 }
174         } else {
175                 for (i = 0; i < asize; i++) {
176                         buf[idx] = alpha[i];
177                         mkf(idx + 1, p);
178                 }
179         }
180 }