whatis.c revision 1.8
11.8Sabhinav/* $NetBSD: whatis.c,v 1.8 2019/05/18 07:56:43 abhinav Exp $ */ 21.1Sjoerg/*- 31.1Sjoerg * Copyright (c) 2012 Joerg Sonnenberger <joerg@NetBSD.org> 41.1Sjoerg * All rights reserved. 51.1Sjoerg * 61.1Sjoerg * Redistribution and use in source and binary forms, with or without 71.1Sjoerg * modification, are permitted provided that the following conditions 81.1Sjoerg * are met: 91.1Sjoerg * 101.1Sjoerg * 1. Redistributions of source code must retain the above copyright 111.1Sjoerg * notice, this list of conditions and the following disclaimer. 121.1Sjoerg * 2. Redistributions in binary form must reproduce the above copyright 131.1Sjoerg * notice, this list of conditions and the following disclaimer in 141.1Sjoerg * the documentation and/or other materials provided with the 151.1Sjoerg * distribution. 161.1Sjoerg * 171.1Sjoerg * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 181.1Sjoerg * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 191.1Sjoerg * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 201.1Sjoerg * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 211.1Sjoerg * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 221.1Sjoerg * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 231.1Sjoerg * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 241.1Sjoerg * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 251.1Sjoerg * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 261.1Sjoerg * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 271.1Sjoerg * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 281.1Sjoerg * SUCH DAMAGE. 291.1Sjoerg */ 301.1Sjoerg 311.1Sjoerg#include <sys/cdefs.h> 321.8Sabhinav__RCSID("$NetBSD: whatis.c,v 1.8 2019/05/18 07:56:43 abhinav Exp $"); 331.1Sjoerg 341.1Sjoerg#include <err.h> 351.1Sjoerg#include <stdio.h> 361.1Sjoerg#include <stdlib.h> 371.1Sjoerg#include <unistd.h> 381.1Sjoerg 391.1Sjoerg#include "apropos-utils.h" 401.1Sjoerg 411.1Sjoerg__dead static void 421.1Sjoergusage(void) 431.1Sjoerg{ 441.5Sabhinav fprintf(stderr, "%s [-C path] ...\n", "whatis"); 451.1Sjoerg exit(EXIT_FAILURE); 461.1Sjoerg} 471.1Sjoerg 481.1Sjoergstatic int 491.1Sjoergwhatis(sqlite3 *db, const char *cmd) 501.1Sjoerg{ 511.8Sabhinav static const char sqlstr[] = "SELECT link AS name, section, name_desc" 521.8Sabhinav " FROM mandb_links WHERE link=? UNION SELECT name, section, name_desc" 531.8Sabhinav " FROM mandb WHERE name MATCH ? AND name=? ORDER BY section"; 541.1Sjoerg sqlite3_stmt *stmt = NULL; 551.1Sjoerg int retval; 561.8Sabhinav int i; 571.8Sabhinav if (sqlite3_prepare_v2(db, sqlstr, -1, &stmt, NULL) != SQLITE_OK) 581.8Sabhinav errx(EXIT_FAILURE, "%s", sqlite3_errmsg(db)); 591.8Sabhinav 601.8Sabhinav for (i = 0; i < 3; i++) { 611.8Sabhinav if (sqlite3_bind_text(stmt, i + 1, cmd, -1, NULL) != SQLITE_OK) 621.8Sabhinav errx(EXIT_FAILURE, "%s", sqlite3_errmsg(db)); 631.8Sabhinav } 641.1Sjoerg 651.1Sjoerg retval = 1; 661.1Sjoerg while (sqlite3_step(stmt) == SQLITE_ROW) { 671.1Sjoerg printf("%s(%s) - %s\n", sqlite3_column_text(stmt, 0), 681.1Sjoerg sqlite3_column_text(stmt, 1), 691.1Sjoerg sqlite3_column_text(stmt, 2)); 701.1Sjoerg retval = 0; 711.1Sjoerg } 721.1Sjoerg sqlite3_finalize(stmt); 731.1Sjoerg if (retval) 741.1Sjoerg fprintf(stderr, "%s: not found\n", cmd); 751.1Sjoerg return retval; 761.1Sjoerg} 771.1Sjoerg 781.1Sjoergint 791.1Sjoergmain(int argc, char *argv[]) 801.1Sjoerg{ 811.1Sjoerg sqlite3 *db; 821.1Sjoerg int ch, retval; 831.5Sabhinav const char *manconf = MANCONF; 841.1Sjoerg 851.5Sabhinav while ((ch = getopt(argc, argv, "C:")) != -1) { 861.1Sjoerg switch (ch) { 871.5Sabhinav case 'C': 881.5Sabhinav manconf = optarg; 891.5Sabhinav break; 901.1Sjoerg default: 911.1Sjoerg usage(); 921.1Sjoerg } 931.1Sjoerg } 941.1Sjoerg argc -= optind; 951.1Sjoerg argv += optind; 961.1Sjoerg 971.1Sjoerg if (argc == 0) 981.1Sjoerg usage(); 991.1Sjoerg 1001.5Sabhinav if ((db = init_db(MANDB_READONLY, manconf)) == NULL) 1011.1Sjoerg exit(EXIT_FAILURE); 1021.1Sjoerg 1031.1Sjoerg retval = 0; 1041.1Sjoerg while (argc--) 1051.1Sjoerg retval |= whatis(db, *argv++); 1061.1Sjoerg 1071.1Sjoerg close_db(db); 1081.1Sjoerg return retval; 1091.1Sjoerg} 110