1 /* $OpenBSD: what.c,v 1.17 2023/03/08 04:43:13 guenther Exp $ */
2 /* $NetBSD: what.c,v 1.4 1994/12/20 16:01:03 jtc Exp $ */
3
4 /*
5 * Copyright (c) 1980, 1988, 1993
6 * The Regents of the University of California. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the University nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33 #include <sys/types.h>
34 #include <sys/utsname.h>
35 #include <stdio.h>
36 #include <ctype.h>
37 #include <err.h>
38 #include <stdlib.h>
39 #include <string.h>
40 #include <unistd.h>
41
42 static void search(char *);
43 static void usage(void);
44
45 static int matches;
46 static int sflag;
47
48 extern char *__progname;
49
50 /*
51 * what
52 */
53 int
main(int argc,char * argv[])54 main(int argc, char *argv[])
55 {
56 struct utsname utsn;
57 char match[256];
58 int c;
59
60 if (pledge("stdio rpath", NULL) == -1)
61 err(1, "pledge");
62
63 matches = sflag = 0;
64 while ((c = getopt(argc, argv, "s")) != -1) {
65 switch (c) {
66 case 's':
67 sflag = 1;
68 break;
69 default:
70 usage();
71 }
72 }
73 argc -= optind;
74 argv += optind;
75
76 if (uname(&utsn) == -1)
77 err(1, "uname");
78 strlcpy(match, utsn.sysname, sizeof match);
79
80 if (argc < 1) {
81 usage();
82 } else do {
83 if (!freopen(*argv, "r", stdin)) {
84 perror(*argv);
85 exit(matches ? 0 : 1);
86 }
87 printf("%s:\n", *argv);
88 search(match);
89 } while(*++argv);
90 exit(matches ? 0 : 1);
91 }
92
93 static void
search(char * match)94 search(char *match)
95 {
96 int c;
97 int i;
98
99 while ((c = getchar()) != EOF) {
100 loop: if (c == '$') {
101 for (i = 0; match[i]; i++)
102 if ((c = getchar()) != match[i])
103 goto loop;
104 printf("\t$%s", match);
105 while (isprint(c = getchar())) {
106 putchar(c);
107 if (c == '$')
108 break;
109 }
110 putchar('\n');
111 matches++;
112 if (sflag)
113 break;
114 goto loop;
115 }
116 if (c != '@')
117 continue;
118 if ((c = getchar()) != '(')
119 goto loop;
120 if ((c = getchar()) != '#')
121 goto loop;
122 if ((c = getchar()) != ')')
123 goto loop;
124 putchar('\t');
125 while ((c = getchar()) != EOF && c && c != '"' &&
126 c != '>' && c != '\n' && c != '\\')
127 putchar(c);
128 putchar('\n');
129 matches++;
130 if (sflag)
131 break;
132 }
133 }
134
135 static void
usage(void)136 usage(void)
137 {
138
139 (void)fprintf(stderr, "usage: %s [-s] file ...\n", __progname);
140 exit(1);
141 }
142