whatis.c revision 1.5
11.5Sabhinav/* $NetBSD: whatis.c,v 1.5 2016/05/22 19:26:04 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.5Sabhinav__RCSID("$NetBSD: whatis.c,v 1.5 2016/05/22 19:26:04 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.1Sjoerg static const char sqlstr[] = "SELECT name, section, name_desc" 521.3Sjoerg " FROM mandb WHERE name MATCH ? AND name=?" 531.1Sjoerg " ORDER BY section, name"; 541.1Sjoerg sqlite3_stmt *stmt = NULL; 551.1Sjoerg int retval; 561.1Sjoerg 571.1Sjoerg if (sqlite3_prepare_v2(db, sqlstr, -1, &stmt, NULL) != SQLITE_OK) 581.1Sjoerg errx(EXIT_FAILURE, "Unable to query database"); 591.1Sjoerg if (sqlite3_bind_text(stmt, 1, cmd, -1, NULL) != SQLITE_OK) 601.1Sjoerg errx(EXIT_FAILURE, "Unable to query database"); 611.3Sjoerg if (sqlite3_bind_text(stmt, 2, cmd, -1, NULL) != SQLITE_OK) 621.3Sjoerg errx(EXIT_FAILURE, "Unable to query database"); 631.1Sjoerg retval = 1; 641.1Sjoerg while (sqlite3_step(stmt) == SQLITE_ROW) { 651.1Sjoerg printf("%s(%s) - %s\n", sqlite3_column_text(stmt, 0), 661.1Sjoerg sqlite3_column_text(stmt, 1), 671.1Sjoerg sqlite3_column_text(stmt, 2)); 681.1Sjoerg retval = 0; 691.1Sjoerg } 701.1Sjoerg sqlite3_finalize(stmt); 711.1Sjoerg if (retval) 721.1Sjoerg fprintf(stderr, "%s: not found\n", cmd); 731.1Sjoerg return retval; 741.1Sjoerg} 751.1Sjoerg 761.1Sjoergint 771.1Sjoergmain(int argc, char *argv[]) 781.1Sjoerg{ 791.1Sjoerg sqlite3 *db; 801.1Sjoerg int ch, retval; 811.5Sabhinav const char *manconf = MANCONF; 821.1Sjoerg 831.5Sabhinav while ((ch = getopt(argc, argv, "C:")) != -1) { 841.1Sjoerg switch (ch) { 851.5Sabhinav case 'C': 861.5Sabhinav manconf = optarg; 871.5Sabhinav break; 881.1Sjoerg default: 891.1Sjoerg usage(); 901.1Sjoerg } 911.1Sjoerg } 921.1Sjoerg argc -= optind; 931.1Sjoerg argv += optind; 941.1Sjoerg 951.1Sjoerg if (argc == 0) 961.1Sjoerg usage(); 971.1Sjoerg 981.5Sabhinav if ((db = init_db(MANDB_READONLY, manconf)) == NULL) 991.1Sjoerg exit(EXIT_FAILURE); 1001.1Sjoerg 1011.1Sjoerg retval = 0; 1021.1Sjoerg while (argc--) 1031.1Sjoerg retval |= whatis(db, *argv++); 1041.1Sjoerg 1051.1Sjoerg close_db(db); 1061.1Sjoerg return retval; 1071.1Sjoerg} 108