annotate config/dmenu/stest.c @ 4:7c8c5e548075 default tip

fix stuff
author Yasuri <yasuri@charliesmp.net>
date Sat, 03 Oct 2026 19:23:53 -0500
parents face7f4d84f7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
1 /* See LICENSE file for copyright and license details. */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
2 #include <sys/stat.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
3
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
4 #include <dirent.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
5 #include <limits.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
6 #include <stdio.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
7 #include <stdlib.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
8 #include <string.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
9 #include <unistd.h>
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
10
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
11 #include "arg.h"
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
12 char *argv0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
13
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
14 #define FLAG(x) (flag[(x)-'a'])
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
15
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
16 static void test(const char *, const char *);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
17 static void usage(void);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
18
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
19 static int match = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
20 static int flag[26];
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
21 static struct stat old, new;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
22
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
23 static void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
24 test(const char *path, const char *name)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
25 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
26 struct stat st, ln;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
27
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
28 if ((!stat(path, &st) && (FLAG('a') || name[0] != '.') /* hidden files */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
29 && (!FLAG('b') || S_ISBLK(st.st_mode)) /* block special */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
30 && (!FLAG('c') || S_ISCHR(st.st_mode)) /* character special */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
31 && (!FLAG('d') || S_ISDIR(st.st_mode)) /* directory */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
32 && (!FLAG('e') || access(path, F_OK) == 0) /* exists */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
33 && (!FLAG('f') || S_ISREG(st.st_mode)) /* regular file */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
34 && (!FLAG('g') || st.st_mode & S_ISGID) /* set-group-id flag */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
35 && (!FLAG('h') || (!lstat(path, &ln) && S_ISLNK(ln.st_mode))) /* symbolic link */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
36 && (!FLAG('n') || st.st_mtime > new.st_mtime) /* newer than file */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
37 && (!FLAG('o') || st.st_mtime < old.st_mtime) /* older than file */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
38 && (!FLAG('p') || S_ISFIFO(st.st_mode)) /* named pipe */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
39 && (!FLAG('r') || access(path, R_OK) == 0) /* readable */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
40 && (!FLAG('s') || st.st_size > 0) /* not empty */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
41 && (!FLAG('u') || st.st_mode & S_ISUID) /* set-user-id flag */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
42 && (!FLAG('w') || access(path, W_OK) == 0) /* writable */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
43 && (!FLAG('x') || access(path, X_OK) == 0)) != FLAG('v')) { /* executable */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
44 if (FLAG('q'))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
45 exit(0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
46 match = 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
47 puts(name);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
48 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
49 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
50
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
51 static void
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
52 usage(void)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
53 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
54 fprintf(stderr, "usage: %s [-abcdefghlpqrsuvwx] "
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
55 "[-n file] [-o file] [file...]\n", argv0);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
56 exit(2); /* like test(1) return > 1 on error */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
57 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
58
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
59 int
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
60 main(int argc, char *argv[])
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
61 {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
62 struct dirent *d;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
63 char path[PATH_MAX], *line = NULL, *file;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
64 size_t linesiz = 0;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
65 ssize_t n;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
66 DIR *dir;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
67 int r;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
68
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
69 ARGBEGIN {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
70 case 'n': /* newer than file */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
71 case 'o': /* older than file */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
72 file = EARGF(usage());
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
73 if (!(FLAG(ARGC()) = !stat(file, (ARGC() == 'n' ? &new : &old))))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
74 perror(file);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
75 break;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
76 default:
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
77 /* miscellaneous operators */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
78 if (strchr("abcdefghlpqrsuvwx", ARGC()))
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
79 FLAG(ARGC()) = 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
80 else
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
81 usage(); /* unknown flag */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
82 } ARGEND;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
83
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
84 if (!argc) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
85 /* read list from stdin */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
86 while ((n = getline(&line, &linesiz, stdin)) > 0) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
87 if (line[n - 1] == '\n')
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
88 line[n - 1] = '\0';
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
89 test(line, line);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
90 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
91 free(line);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
92 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
93 for (; argc; argc--, argv++) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
94 if (FLAG('l') && (dir = opendir(*argv))) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
95 /* test directory contents */
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
96 while ((d = readdir(dir))) {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
97 r = snprintf(path, sizeof path, "%s/%s",
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
98 *argv, d->d_name);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
99 if (r >= 0 && (size_t)r < sizeof path)
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
100 test(path, d->d_name);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
101 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
102 closedir(dir);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
103 } else {
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
104 test(*argv, *argv);
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
105 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
106 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
107 }
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
108 return match ? 0 : 1;
face7f4d84f7 Initial commit
Yasuri <yasuri@charliesmp.net>
parents:
diff changeset
109 }