70 lines
1.4 KiB
C
70 lines
1.4 KiB
C
#include <stdio.h> /* fprintf(3), stderr, NULL */
|
|
#include <string.h> /* memset(3) */
|
|
#ifndef EX_USAGE
|
|
# include <sysexits.h>
|
|
#endif
|
|
#include <unistd.h> /* getopt(3) */
|
|
|
|
static char *program_name = "scrut";
|
|
|
|
#include "libfileis.h"
|
|
struct {
|
|
char c;
|
|
int (*f)(char *p);
|
|
} argsdict[] = {
|
|
{ 'b', f_blockspecial },
|
|
{ 'c', f_charspecial },
|
|
{ 'd', f_directory },
|
|
{ 'e', f_exists },
|
|
{ 'f', f_regular },
|
|
{ 'g', f_gid },
|
|
{ 'p', f_fifospecial },
|
|
{ 'r', f_readable },
|
|
{ 'x', f_executable },
|
|
{ 'k', f_sticky },
|
|
{ 'u', f_uid },
|
|
{ 'w', f_writeable },
|
|
{ 'L', f_symlink },
|
|
{ 'S', f_socket },
|
|
{ '\0', NULL }
|
|
};
|
|
|
|
int main(int argc, char *argv[]){
|
|
char args[(sizeof argsdict) / (sizeof *argsdict) + 1];
|
|
int c;
|
|
int (*f[(sizeof argsdict) / (sizeof *argsdict)])(char *p);
|
|
size_t fi;
|
|
size_t i;
|
|
|
|
if(argc < 2)
|
|
goto usage;
|
|
|
|
for(i = 0; i < (sizeof argsdict) / (sizeof *argsdict); ++i)
|
|
args[i] = argsdict[i].c;
|
|
args[(sizeof argsdict) / (sizeof *argsdict)] = '\0';
|
|
|
|
fi = 0;
|
|
while((c = getopt(argc, argv, args)) != -1)
|
|
for(i = 0; i < (sizeof argsdict) / (sizeof *argsdict); ++i)
|
|
if(argsdict[i].c == '\0')
|
|
goto usage;
|
|
else if(argsdict[i].c == c){
|
|
f[fi++] = argsdict[i].f;
|
|
break;
|
|
}
|
|
|
|
if(optind == argc){
|
|
usage: fprintf(stderr, "Usage: %s (-bcdefghkprsuwxLS) [file...]\n",
|
|
argv[0] == NULL ? program_name : argv[0]);
|
|
return EX_USAGE;
|
|
}
|
|
|
|
argv += optind;
|
|
do for(i = 0; i < fi; ++i)
|
|
if(!f[i](*argv))
|
|
return 1;
|
|
while(*++argv != NULL);
|
|
|
|
return 0;
|
|
}
|