blob: a5b0246dfc5facd75e7709047b5f6f00b8aafed0 [file] [log] [blame]
// 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);
}
}
}