remove stest
This commit is contained in:
parent
a690038da5
commit
74d16592ba
@ -3,10 +3,10 @@
|
|||||||
|
|
||||||
include config.mk
|
include config.mk
|
||||||
|
|
||||||
SRC = drw.c dmenubar.c stest.c util.c
|
SRC = drw.c dmenubar.c util.c
|
||||||
OBJ = $(SRC:.c=.o)
|
OBJ = $(SRC:.c=.o)
|
||||||
|
|
||||||
all: options dmenubar stest
|
all: options dmenubar
|
||||||
|
|
||||||
options:
|
options:
|
||||||
@echo dmenu build options:
|
@echo dmenu build options:
|
||||||
@ -25,16 +25,13 @@ $(OBJ): arg.h config.h config.mk drw.h
|
|||||||
dmenubar: dmenubar.o drw.o util.o
|
dmenubar: dmenubar.o drw.o util.o
|
||||||
$(CC) -o $@ dmenubar.o drw.o util.o $(LDFLAGS)
|
$(CC) -o $@ dmenubar.o drw.o util.o $(LDFLAGS)
|
||||||
|
|
||||||
stest: stest.o
|
|
||||||
$(CC) -o $@ stest.o $(LDFLAGS)
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f dmenubar stest $(OBJ) dmenubar-$(VERSION).tar.gz
|
rm -f dmenubar $(OBJ) dmenubar-$(VERSION).tar.gz
|
||||||
|
|
||||||
dist: clean
|
dist: clean
|
||||||
mkdir -p dmenubar-$(VERSION)
|
mkdir -p dmenubar-$(VERSION)
|
||||||
cp LICENSE Makefile README arg.h config.def.h config.mk dmenubar.1\
|
cp LICENSE Makefile README arg.h config.def.h config.mk dmenubar.1\
|
||||||
drw.h util.h stest.1 $(SRC)\
|
drw.h util.h $(SRC)\
|
||||||
dmenubar-$(VERSION)
|
dmenubar-$(VERSION)
|
||||||
tar -cf dmenubar-$(VERSION).tar dmenubar-$(VERSION)
|
tar -cf dmenubar-$(VERSION).tar dmenubar-$(VERSION)
|
||||||
gzip dmenubar-$(VERSION).tar
|
gzip dmenubar-$(VERSION).tar
|
||||||
@ -42,19 +39,14 @@ dist: clean
|
|||||||
|
|
||||||
install: all
|
install: all
|
||||||
mkdir -p $(DESTDIR)$(PREFIX)/bin
|
mkdir -p $(DESTDIR)$(PREFIX)/bin
|
||||||
cp -f dmenubar stest $(DESTDIR)$(PREFIX)/bin
|
cp -f dmenubar $(DESTDIR)$(PREFIX)/bin
|
||||||
chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenubar
|
chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenubar
|
||||||
chmod 755 $(DESTDIR)$(PREFIX)/bin/stest
|
|
||||||
mkdir -p $(DESTDIR)$(MANPREFIX)/man1
|
mkdir -p $(DESTDIR)$(MANPREFIX)/man1
|
||||||
sed "s/VERSION/$(VERSION)/g" < dmenubar.1 > $(DESTDIR)$(MANPREFIX)/man1/dmenubar.1
|
sed "s/VERSION/$(VERSION)/g" < dmenubar.1 > $(DESTDIR)$(MANPREFIX)/man1/dmenubar.1
|
||||||
sed "s/VERSION/$(VERSION)/g" < stest.1 > $(DESTDIR)$(MANPREFIX)/man1/stest.1
|
|
||||||
chmod 644 $(DESTDIR)$(MANPREFIX)/man1/dmenubar.1
|
chmod 644 $(DESTDIR)$(MANPREFIX)/man1/dmenubar.1
|
||||||
chmod 644 $(DESTDIR)$(MANPREFIX)/man1/stest.1
|
|
||||||
|
|
||||||
uninstall:
|
uninstall:
|
||||||
rm -f $(DESTDIR)$(PREFIX)/bin/dmenubar\
|
rm -f $(DESTDIR)$(PREFIX)/bin/dmenubar\
|
||||||
$(DESTDIR)$(PREFIX)/bin/stest\
|
|
||||||
$(DESTDIR)$(MANPREFIX)/man1/dmenubar.1\
|
$(DESTDIR)$(MANPREFIX)/man1/dmenubar.1\
|
||||||
$(DESTDIR)$(MANPREFIX)/man1/stest.1
|
|
||||||
|
|
||||||
.PHONY: all options clean dist install uninstall
|
.PHONY: all options clean dist install uninstall
|
||||||
|
@ -1,90 +0,0 @@
|
|||||||
.TH STEST 1 dmenu\-VERSION
|
|
||||||
.SH NAME
|
|
||||||
stest \- filter a list of files by properties
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B stest
|
|
||||||
.RB [ -abcdefghlpqrsuwx ]
|
|
||||||
.RB [ -n
|
|
||||||
.IR file ]
|
|
||||||
.RB [ -o
|
|
||||||
.IR file ]
|
|
||||||
.RI [ file ...]
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.B stest
|
|
||||||
takes a list of files and filters by the files' properties, analogous to
|
|
||||||
.IR test (1).
|
|
||||||
Files which pass all tests are printed to stdout. If no files are given, stest
|
|
||||||
reads files from stdin.
|
|
||||||
.SH OPTIONS
|
|
||||||
.TP
|
|
||||||
.B \-a
|
|
||||||
Test hidden files.
|
|
||||||
.TP
|
|
||||||
.B \-b
|
|
||||||
Test that files are block specials.
|
|
||||||
.TP
|
|
||||||
.B \-c
|
|
||||||
Test that files are character specials.
|
|
||||||
.TP
|
|
||||||
.B \-d
|
|
||||||
Test that files are directories.
|
|
||||||
.TP
|
|
||||||
.B \-e
|
|
||||||
Test that files exist.
|
|
||||||
.TP
|
|
||||||
.B \-f
|
|
||||||
Test that files are regular files.
|
|
||||||
.TP
|
|
||||||
.B \-g
|
|
||||||
Test that files have their set-group-ID flag set.
|
|
||||||
.TP
|
|
||||||
.B \-h
|
|
||||||
Test that files are symbolic links.
|
|
||||||
.TP
|
|
||||||
.B \-l
|
|
||||||
Test the contents of a directory given as an argument.
|
|
||||||
.TP
|
|
||||||
.BI \-n " file"
|
|
||||||
Test that files are newer than
|
|
||||||
.IR file .
|
|
||||||
.TP
|
|
||||||
.BI \-o " file"
|
|
||||||
Test that files are older than
|
|
||||||
.IR file .
|
|
||||||
.TP
|
|
||||||
.B \-p
|
|
||||||
Test that files are named pipes.
|
|
||||||
.TP
|
|
||||||
.B \-q
|
|
||||||
No files are printed, only the exit status is returned.
|
|
||||||
.TP
|
|
||||||
.B \-r
|
|
||||||
Test that files are readable.
|
|
||||||
.TP
|
|
||||||
.B \-s
|
|
||||||
Test that files are not empty.
|
|
||||||
.TP
|
|
||||||
.B \-u
|
|
||||||
Test that files have their set-user-ID flag set.
|
|
||||||
.TP
|
|
||||||
.B \-v
|
|
||||||
Invert the sense of tests, only failing files pass.
|
|
||||||
.TP
|
|
||||||
.B \-w
|
|
||||||
Test that files are writable.
|
|
||||||
.TP
|
|
||||||
.B \-x
|
|
||||||
Test that files are executable.
|
|
||||||
.SH EXIT STATUS
|
|
||||||
.TP
|
|
||||||
.B 0
|
|
||||||
At least one file passed all tests.
|
|
||||||
.TP
|
|
||||||
.B 1
|
|
||||||
No files passed all tests.
|
|
||||||
.TP
|
|
||||||
.B 2
|
|
||||||
An error occurred.
|
|
||||||
.SH SEE ALSO
|
|
||||||
.IR dmenu (1),
|
|
||||||
.IR test (1)
|
|
109
dmenubar/stest.c
109
dmenubar/stest.c
@ -1,109 +0,0 @@
|
|||||||
/* See LICENSE file for copyright and license details. */
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "arg.h"
|
|
||||||
char *argv0;
|
|
||||||
|
|
||||||
#define FLAG(x) (flag[(x)-'a'])
|
|
||||||
|
|
||||||
static void test(const char *, const char *);
|
|
||||||
static void usage(void);
|
|
||||||
|
|
||||||
static int match = 0;
|
|
||||||
static int flag[26];
|
|
||||||
static struct stat old, new;
|
|
||||||
|
|
||||||
static void
|
|
||||||
test(const char *path, const char *name)
|
|
||||||
{
|
|
||||||
struct stat st, ln;
|
|
||||||
|
|
||||||
if ((!stat(path, &st) && (FLAG('a') || name[0] != '.') /* hidden files */
|
|
||||||
&& (!FLAG('b') || S_ISBLK(st.st_mode)) /* block special */
|
|
||||||
&& (!FLAG('c') || S_ISCHR(st.st_mode)) /* character special */
|
|
||||||
&& (!FLAG('d') || S_ISDIR(st.st_mode)) /* directory */
|
|
||||||
&& (!FLAG('e') || access(path, F_OK) == 0) /* exists */
|
|
||||||
&& (!FLAG('f') || S_ISREG(st.st_mode)) /* regular file */
|
|
||||||
&& (!FLAG('g') || st.st_mode & S_ISGID) /* set-group-id flag */
|
|
||||||
&& (!FLAG('h') || (!lstat(path, &ln) && S_ISLNK(ln.st_mode))) /* symbolic link */
|
|
||||||
&& (!FLAG('n') || st.st_mtime > new.st_mtime) /* newer than file */
|
|
||||||
&& (!FLAG('o') || st.st_mtime < old.st_mtime) /* older than file */
|
|
||||||
&& (!FLAG('p') || S_ISFIFO(st.st_mode)) /* named pipe */
|
|
||||||
&& (!FLAG('r') || access(path, R_OK) == 0) /* readable */
|
|
||||||
&& (!FLAG('s') || st.st_size > 0) /* not empty */
|
|
||||||
&& (!FLAG('u') || st.st_mode & S_ISUID) /* set-user-id flag */
|
|
||||||
&& (!FLAG('w') || access(path, W_OK) == 0) /* writable */
|
|
||||||
&& (!FLAG('x') || access(path, X_OK) == 0)) != FLAG('v')) { /* executable */
|
|
||||||
if (FLAG('q'))
|
|
||||||
exit(0);
|
|
||||||
match = 1;
|
|
||||||
puts(name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
usage(void)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "usage: %s [-abcdefghlpqrsuvwx] "
|
|
||||||
"[-n file] [-o file] [file...]\n", argv0);
|
|
||||||
exit(2); /* like test(1) return > 1 on error */
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
struct dirent *d;
|
|
||||||
char path[PATH_MAX], *line = NULL, *file;
|
|
||||||
size_t linesiz = 0;
|
|
||||||
ssize_t n;
|
|
||||||
DIR *dir;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
ARGBEGIN {
|
|
||||||
case 'n': /* newer than file */
|
|
||||||
case 'o': /* older than file */
|
|
||||||
file = EARGF(usage());
|
|
||||||
if (!(FLAG(ARGC()) = !stat(file, (ARGC() == 'n' ? &new : &old))))
|
|
||||||
perror(file);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* miscellaneous operators */
|
|
||||||
if (strchr("abcdefghlpqrsuvwx", ARGC()))
|
|
||||||
FLAG(ARGC()) = 1;
|
|
||||||
else
|
|
||||||
usage(); /* unknown flag */
|
|
||||||
} ARGEND;
|
|
||||||
|
|
||||||
if (!argc) {
|
|
||||||
/* read list from stdin */
|
|
||||||
while ((n = getline(&line, &linesiz, stdin)) > 0) {
|
|
||||||
if (n && line[n - 1] == '\n')
|
|
||||||
line[n - 1] = '\0';
|
|
||||||
test(line, line);
|
|
||||||
}
|
|
||||||
free(line);
|
|
||||||
} else {
|
|
||||||
for (; argc; argc--, argv++) {
|
|
||||||
if (FLAG('l') && (dir = opendir(*argv))) {
|
|
||||||
/* test directory contents */
|
|
||||||
while ((d = readdir(dir))) {
|
|
||||||
r = snprintf(path, sizeof path, "%s/%s",
|
|
||||||
*argv, d->d_name);
|
|
||||||
if (r >= 0 && (size_t)r < sizeof path)
|
|
||||||
test(path, d->d_name);
|
|
||||||
}
|
|
||||||
closedir(dir);
|
|
||||||
} else {
|
|
||||||
test(*argv, *argv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return match ? 0 : 1;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user