// 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); } } }