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 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 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 136 usage(void) 137 { 138 139 (void)fprintf(stderr, "usage: %s [-s] file ...\n", __progname); 140 exit(1); 141 } 142