| // SPDX-License-Identifier: GPL-2.0 |
| /* |
| * Copyright (c) 2000-2001 Silicon Graphics, Inc. |
| * All Rights Reserved. |
| */ |
| |
| #include "global.h" |
| |
| char *alpha; |
| int asize = 1; |
| int asplit; |
| char *buf; |
| int dflag; |
| int len = 1; |
| int nproc = 1; |
| int nflag; |
| int vflag; |
| int pid; |
| |
| void mkf(int idx, int p); |
| |
| int |
| main(int argc, char **argv) |
| { |
| int a; |
| int stat; |
| long long tot; |
| int usage=0; |
| char * argv0=argv[0]; |
| |
| argc--; |
| argv++; |
| pid=getpid(); |
| |
| if (!argc) usage++; |
| while (argc) { |
| if (strcmp(*argv, "-c") == 0) { |
| argc--; |
| argv++; |
| asize = atoi(*argv); |
| if (asize > 64 || asize < 1) { |
| fprintf(stderr, "bad alpha size %s\n", *argv); |
| return 1; |
| } |
| } else if (strcmp(*argv, "-d") == 0) { |
| dflag = 1; |
| } else if (strcmp(*argv, "-l") == 0) { |
| argc--; |
| argv++; |
| len = atoi(*argv); |
| if (len < 1) { |
| fprintf(stderr, "bad name length %s\n", *argv); |
| return 1; |
| } |
| } else if (strcmp(*argv, "-p") == 0) { |
| argc--; |
| argv++; |
| nproc = atoi(*argv); |
| if (nproc < 1) { |
| fprintf(stderr, "bad process count %s\n", |
| *argv); |
| return 1; |
| } |
| } else if (strcmp(*argv, "-n") == 0) { |
| nflag = 1; |
| } else if (strcmp(*argv, "-v") == 0) { |
| vflag = 1; |
| } else if (strcmp(*argv, "-h") == 0) { |
| usage++; |
| } else { |
| fprintf(stderr,"unknown switch \"%s\"\n", *argv); |
| usage++; |
| } |
| argc--; |
| argv++; |
| } |
| |
| if (usage) { |
| fprintf(stderr,"permname: usage %s [-c alpha size] [-l name length] " |
| "[-p proc count] [-n] [-v] [-d] [-h]\n", argv0); |
| fprintf(stderr," -n : don't actually perform action\n"); |
| fprintf(stderr," -v : be verbose\n"); |
| fprintf(stderr," -d : create directories, not files\n"); |
| exit(1); |
| } |
| |
| if (asize % nproc) { |
| fprintf(stderr, |
| "alphabet size must be multiple of process count\n"); |
| return 1; |
| } |
| asplit = asize / nproc; |
| alpha = malloc(asize + 1); |
| buf = malloc(len + 1); |
| for (a = 0, tot = 1; a < len; a++) |
| tot *= asize; |
| if (vflag) fprintf(stderr,"[%d] ",pid); |
| fprintf(stderr, |
| "alpha size = %d, name length = %d, total files = %lld, nproc=%d\n", |
| asize, len, tot, nproc); |
| fflush(stderr); |
| for (a = 0; a < asize; a++) { |
| if (a < 26) |
| alpha[a] = 'a' + a; |
| else if (a < 52) |
| alpha[a] = 'A' + a - 26; |
| else if (a < 62) |
| alpha[a] = '0' + a - 52; |
| else if (a == 62) |
| alpha[62] = '_'; |
| else if (a == 63) |
| alpha[63] = '@'; |
| } |
| for (a = 0; a < nproc; a++) { |
| int r=fork(); |
| if (r<0) { |
| perror("fork"); |
| exit(1); |
| } |
| if (!r) { |
| pid=getpid(); |
| mkf(0, a); |
| return 0; |
| } |
| } |
| while (1) { |
| int r=wait(&stat); |
| if (r<0) { |
| if (errno==ECHILD) break; |
| perror("wait"); |
| exit(1); |
| } |
| if (!r) break; |
| } |
| |
| return 0; |
| } |
| |
| void |
| mkf(int idx, int p) |
| { |
| int i; |
| int last; |
| |
| last = (idx == len - 1); |
| if (last) { |
| buf[len] = '\0'; |
| for (i = p * asplit; i < (p + 1) * asplit; i++) { |
| buf[idx] = alpha[i]; |
| |
| if (dflag) { |
| if (vflag) printf("[%d] mkdir %s\n", pid, buf); |
| if (!nflag) { |
| if (mkdir(buf, 0777)<0) { |
| perror("mkdir"); |
| exit(1); |
| } |
| } |
| } else { |
| if (vflag) printf("[%d] touch %s\n", pid, buf); |
| if (!nflag) { |
| int f=creat(buf, 0666); |
| if (f<0) { |
| perror("creat"); |
| exit(1); |
| } |
| if (close(f)) { |
| perror("close"); |
| exit(1); |
| } |
| } |
| } |
| } |
| } else { |
| for (i = 0; i < asize; i++) { |
| buf[idx] = alpha[i]; |
| mkf(idx + 1, p); |
| } |
| } |
| } |