NetBSD Problem Report #51062

From www@NetBSD.org  Tue Apr 12 15:35:06 2016
Return-Path: <www@NetBSD.org>
Received: from mail.netbsd.org (mail.netbsd.org [199.233.217.200])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(Client CN "mail.netbsd.org", Issuer "Postmaster NetBSD.org" (verified OK))
	by mollari.NetBSD.org (Postfix) with ESMTPS id EED4C7A2AC
	for <gnats-bugs@gnats.NetBSD.org>; Tue, 12 Apr 2016 15:35:05 +0000 (UTC)
Message-Id: <20160412153504.14F2C7AA9A@mollari.NetBSD.org>
Date: Tue, 12 Apr 2016 15:35:04 +0000 (UTC)
From: er.abhinav.upadhyay@gmail.com
Reply-To: er.abhinav.upadhyay@gmail.com
To: gnats-bugs@NetBSD.org
Subject: Allow non numeric sections to be indexed and searched by apropos(1)
X-Send-Pr-Version: www-1.0

>Number:         51062
>Category:       bin
>Synopsis:       Allow non numeric sections to be indexed and searched by apropos(1)
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    bin-bug-people
>State:          closed
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Tue Apr 12 15:40:00 +0000 2016
>Closed-Date:    Wed Apr 13 12:16:33 +0000 2016
>Last-Modified:  Wed Apr 13 14:45:00 +0000 2016
>Originator:     Abhinav Upadhyay
>Release:        CURRENT
>Organization:
>Environment:
>Description:
Apropos(1) doesn't allow searching for man pages in non-numeric sections. Also, makemandb(8) indexes only the first character of the section number and drops everything else.


The attached patch fixes both the problems. It also includes changes for tickets bin/51038, bin/51039, and bin/51040.

I can probably send a smaller patch if there is no interest in the aforementioned patches :)
>How-To-Repeat:
apropos -s 9lua systm


>Fix:
Index: apropos-utils.c
===================================================================
RCS file: /cvsroot/src/usr.sbin/makemandb/apropos-utils.c,v
retrieving revision 1.22
diff -u -r1.22 apropos-utils.c
--- apropos-utils.c	31 Mar 2016 20:16:58 -0000	1.22
+++ apropos-utils.c	12 Apr 2016 15:31:27 -0000
@@ -300,18 +300,19 @@
  *  	In normal cases the function should return a handle to the db.
  */
 sqlite3 *
-init_db(int db_flag, const char *manconf)
+init_db(mandb_access_mode db_flag, const char *manconf)
 {
 	sqlite3 *db = NULL;
 	sqlite3_stmt *stmt;
 	struct stat sb;
 	int rc;
 	int create_db_flag = 0;
+	int access_mode;

 	char *dbpath = get_dbpath(manconf);
 	if (dbpath == NULL)
 		errx(EXIT_FAILURE, "_mandb entry not found in man.conf");
-	/* Check if the database exists or not */
+
 	if (!(stat(dbpath, &sb) == 0 && S_ISREG(sb.st_mode))) {
 		/* Database does not exist, check if DB_CREATE was specified, and set
 		 * flag to create the database schema
@@ -322,16 +323,23 @@
 			return NULL;
 		}
 		create_db_flag = 1;
+	} else {
+		/*
+		 * Database exists. Check if we have the permissions to read/write the files
+		 */
+		access_mode = db_flag == MANDB_CREATE || db_flag == MANDB_WRITE? R_OK | W_OK: R_OK;
+		if ((access(dbpath, access_mode)) != 0) {
+			warnx("Unable to access the database, please check permissions for %s", dbpath);
+			return NULL;
+		}
 	}

-	/* Now initialize the database connection */
 	sqlite3_initialize();
 	rc = sqlite3_open_v2(dbpath, &db, db_flag, NULL);

 	if (rc != SQLITE_OK) {
 		warnx("%s", sqlite3_errmsg(db));
-		sqlite3_shutdown();
-		return NULL;
+		goto error;
 	}

 	if (create_db_flag && create_db(db) < 0) {
@@ -379,8 +387,7 @@
 	return db;

 error:
-	sqlite3_close(db);
-	sqlite3_shutdown();
+	close_db(db);
 	return NULL;
 }

@@ -458,7 +465,7 @@
 }

 /*
- *  run_query --
+ *  run_query_internal --
  *  Performs the searches for the keywords entered by the user.
  *  The 2nd param: snippet_args is an array of strings providing values for the
  *  last three parameters to the snippet function of sqlite. (Look at the docs).
@@ -509,15 +516,20 @@
 	 * 2. I am using LIKE operator because '=' or IN operators do not seem to be
 	 * working with the compression option enabled.
 	 */
+	char *sections_str = args->sec_nums;
+	char *temp;
+	if (sections_str) {
+		while (*sections_str) {
+			size_t len = strcspn(sections_str, " ");
+			char *sec = sections_str;
+			if (sections_str[len] == 0) {
+				sections_str += len;
+			} else {
+				sections_str[len] = 0;
+				sections_str += len + 1;
+			}
+			easprintf(&temp, "\'%s\',", sec);

-	if (args->sec_nums) {
-		char *temp;
-		int i;
-
-		for (i = 0; i < SECMAX; i++) {
-			if (args->sec_nums[i] == 0)
-				continue;
-			easprintf(&temp, " OR section = \'%d\'", i + 1);
 			if (section_clause) {
 				concat(&section_clause, temp);
 				free(temp);
@@ -529,9 +541,11 @@
 			/*
 			 * At least one section requested, add glue for query.
 			 */
+			size_t section_clause_len = strlen(section_clause);
+			if (section_clause[section_clause_len - 1] == ',')
+				section_clause[section_clause_len - 1] = 0;
 			temp = section_clause;
-			/* Skip " OR " before first term. */
-			easprintf(&section_clause, " AND (%s)", temp + 4);
+			easprintf(&section_clause, " AND section IN (%s)", temp);
 			free(temp);
 		}
 	}
Index: apropos-utils.h
===================================================================
RCS file: /cvsroot/src/usr.sbin/makemandb/apropos-utils.h,v
retrieving revision 1.9
diff -u -r1.9 apropos-utils.h
--- apropos-utils.h	2 Apr 2013 17:16:50 -0000	1.9
+++ apropos-utils.h	12 Apr 2016 15:31:27 -0000
@@ -36,12 +36,14 @@
 #include "sqlite3.h"

 #define MANCONF "/etc/man.conf"
-#define SECMAX 9

 /* Flags for opening the database */
-#define MANDB_READONLY SQLITE_OPEN_READONLY
-#define MANDB_WRITE SQLITE_OPEN_READWRITE
-#define MANDB_CREATE SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE
+typedef enum mandb_access_mode {
+	MANDB_READONLY = SQLITE_OPEN_READONLY,
+	MANDB_WRITE = SQLITE_OPEN_READWRITE,
+	MANDB_CREATE = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE
+} mandb_access_mode;
+

 #define APROPOS_SCHEMA_VERSION 20120507

@@ -71,7 +73,7 @@

 typedef struct query_args {
 	const char *search_str;		// user query
-	int *sec_nums;		// Section in which to do the search
+	char *sec_nums;		// Section in which to do the search
 	int nrec;			// number of records to fetch
 	int offset;		//From which position to start processing the records
 	int legacy;
@@ -92,7 +94,7 @@
 char *lower(char *);
 void concat(char **, const char *);
 void concat2(char **, const char *, size_t);
-sqlite3 *init_db(int, const char *);
+sqlite3 *init_db(mandb_access_mode, const char *);
 void close_db(sqlite3 *);
 char *get_dbpath(const char *);
 int run_query(sqlite3 *, query_format, query_args *);
Index: apropos.c
===================================================================
RCS file: /cvsroot/src/usr.sbin/makemandb/apropos.c,v
retrieving revision 1.18
diff -u -r1.18 apropos.c
--- apropos.c	31 Mar 2016 20:13:37 -0000	1.18
+++ apropos.c	12 Apr 2016 15:31:27 -0000
@@ -43,7 +43,7 @@
 #include "apropos-utils.h"

 typedef struct apropos_flags {
-	int sec_nums[SECMAX];
+	char *sec_nums;
 	int nresults;
 	int pager;
 	int no_context;
@@ -58,6 +58,8 @@
 	apropos_flags *aflags;
 } callback_data;

+static const unsigned int sections_args_length = 16;
+
 static char *remove_stopwords(const char *);
 static int query_callback(void *, const char * , const char *, const char *,
 	const char *, size_t);
@@ -69,6 +71,7 @@
 parseargs(int argc, char **argv, struct apropos_flags *aflags)
 {
 	int ch;
+	char sec[2] = {0};
 	while ((ch = getopt(argc, argv, "123456789Cchiln:PprS:s:")) != -1) {
 		switch (ch) {
 		case '1':
@@ -80,7 +83,13 @@
 		case '7':
 		case '8':
 		case '9':
-			aflags->sec_nums[ch - '1'] = 1;
+			/* Generate a space separated list of all the requested sections */
+			sec[0] = (char) ch ;
+			if (aflags->sec_nums == NULL) {
+				aflags->sec_nums = emalloc(sections_args_length);
+				memcpy(aflags->sec_nums, sec, 2);
+			} else
+				concat2(&aflags->sec_nums, sec, 1);
 			break;
 		case 'C':
 			aflags->no_context = 1;
@@ -115,10 +124,12 @@
 			aflags->machine = optarg;
 			break;
 		case 's':
-			ch = atoi(optarg);
-			if (ch < 1 || ch > 9)
-				errx(EXIT_FAILURE, "Invalid section");
-			aflags->sec_nums[ch - 1] = 1;
+			if (aflags->sec_nums == NULL) {
+				size_t arglen = strlen(optarg);
+				aflags->sec_nums = arglen > sections_args_length? emalloc(arglen + 1): emalloc(sections_args_length);
+				memcpy(aflags->sec_nums, optarg, arglen + 1);
+			} else
+				concat(&aflags->sec_nums, optarg);
 			break;
 		case '?':
 		default:
@@ -140,6 +151,7 @@
 	cbdata.out = stdout;		// the default output stream
 	cbdata.count = 0;
 	apropos_flags aflags;
+	aflags.sec_nums = NULL;
 	cbdata.aflags = &aflags;
 	sqlite3 *db;
 	setprogname(argv[0]);
@@ -169,12 +181,6 @@

 	parseargs(argc, argv, &aflags);

-	/*
-	 * If the user specifies a section number as an option, the
-	 * corresponding index element in sec_nums is set to the string
-	 * representing that section number.
-	 */
-
 	argc -= optind;
 	argv += optind;

@@ -232,6 +238,7 @@
 		fprintf(cbdata.out, "</table>\n</body>\n</html>\n");

 	free(query);
+	free(aflags.sec_nums);
 	close_db(db);
 	if (errmsg) {
 		warnx("%s", errmsg);
Index: makemandb.c
===================================================================
RCS file: /cvsroot/src/usr.sbin/makemandb/makemandb.c,v
retrieving revision 1.33
diff -u -r1.33 makemandb.c
--- makemandb.c	31 Mar 2016 20:17:58 -0000	1.33
+++ makemandb.c	12 Apr 2016 15:31:28 -0000
@@ -71,7 +71,7 @@
 	secbuff exit_status; // EXIT STATUS
 	secbuff diagnostics; // DIAGNOSTICS
 	secbuff errors; // ERRORS
-	char section[2];
+	char *section;

 	int xr_found; // To track whether a .Xr was seen when parsing a section

@@ -702,7 +702,7 @@
 	for (;;) {
 		r = archive_read_data(a, buf + off, *len - off);
 		if (r == ARCHIVE_OK) {
-			archive_read_close(a);
+			archive_read_finish(a);
 			*bufp = buf;
 			*len = off;
 			return 0;
@@ -718,7 +718,7 @@
 				if (mflags.verbosity)
 					warnx("File too large: %s", file);
 				free(buf);
-				archive_read_close(a);
+				archive_read_finish(a);
 				return -1;
 			}
 			buf = erealloc(buf, *len);
@@ -727,7 +727,7 @@

 archive_error:
 	warnx("Error while reading `%s': %s", file, archive_error_string(a));
-	archive_read_close(a);
+	archive_read_finish(a);
 	return -1;
 }

@@ -773,7 +773,7 @@
 	rc = sqlite3_prepare_v2(db, sqlstr, -1, &stmt, NULL);
 	if (rc != SQLITE_OK) {
 		if (mflags.verbosity)
-		warnx("%s", sqlite3_errmsg(db));
+			warnx("%s", sqlite3_errmsg(db));
 		close_db(db);
 		errx(EXIT_FAILURE, "Could not query file cache");
 	}
@@ -945,15 +945,15 @@
 	if (md) {
 		const struct mdoc_meta *md_meta = mdoc_meta(md);
 		if (md_meta->msec == NULL) {
-			rec->section[0] = '?';
+			easprintf(&rec->section, "%s", "?");
 		} else
-			rec->section[0] = md_meta->msec[0];
+			rec->section = estrdup(md_meta->msec);
 	} else if (m) {
 		const struct man_meta *m_meta = man_meta(m);
 		if (m_meta->msec == NULL)
-			rec->section[0] = '?';
+			easprintf(&rec->section, "%s", "?");
 		else
-			rec->section[0] = m_meta->msec[0];
+			rec->section = estrdup(m_meta->msec);
 	} else
 		return;

@@ -1574,7 +1574,7 @@
 		char *tmp;
 		rec->links = estrdup(rec->name);
 		free(rec->name);
-		int sz = strcspn(rec->links, " \0");
+		size_t sz = strcspn(rec->links, " \0");
 		rec->name = emalloc(sz + 1);
 		memcpy(rec->name, rec->links, sz);
 		if(rec->name[sz - 1] == ',')
@@ -1980,6 +1980,9 @@

 	free(rec->md5_hash);
 	rec->md5_hash = NULL;
+
+	free(rec->section);
+	rec->section = NULL;
 }

 /*

>Release-Note:

>Audit-Trail:
From: christos@zoulas.com (Christos Zoulas)
To: gnats-bugs@NetBSD.org, gnats-admin@netbsd.org, netbsd-bugs@netbsd.org
Cc: 
Subject: Re: bin/51062: Allow non numeric sections to be indexed and searched by apropos(1)
Date: Tue, 12 Apr 2016 21:45:21 -0400

 On Apr 12,  3:40pm, er.abhinav.upadhyay@gmail.com (er.abhinav.upadhyay@gmail.com) wrote:
 -- Subject: bin/51062: Allow non numeric sections to be indexed and searched 

 | >Number:         51062
 | >Category:       bin
 | >Synopsis:       Allow non numeric sections to be indexed and searched by apropos(1)
 | >Confidential:   no
 | >Severity:       non-critical
 | >Priority:       medium
 | >Responsible:    bin-bug-people
 | >State:          open
 | >Class:          sw-bug
 | >Submitter-Id:   net
 | >Arrival-Date:   Tue Apr 12 15:40:00 +0000 2016
 | >Originator:     Abhinav Upadhyay
 | >Release:        CURRENT
 | >Organization:
 | >Environment:
 | >Description:
 | Apropos(1) doesn't allow searching for man pages in non-numeric sections. Also, makemandb(8) indexes only the first character of the section number and drops everything else.
 | 
 | 
 | The attached patch fixes both the problems. It also includes changes for tickets bin/51038, bin/51039, and bin/51040.
 | 
 | I can probably send a smaller patch if there is no interest in the aforementioned patches :)
 | >How-To-Repeat:
 | apropos -s 9lua systm
 | 

 Please don't mix other patches together. Resubmit just the relevant change,

 christos

From: Abhinav Upadhyay <er.abhinav.upadhyay@gmail.com>
To: Christos Zoulas <christos@zoulas.com>
Cc: NetBSD GNATS <gnats-bugs@netbsd.org>, gnats-admin@netbsd.org, netbsd-bugs@netbsd.org
Subject: Re: bin/51062: Allow non numeric sections to be indexed and searched
 by apropos(1)
Date: Wed, 13 Apr 2016 11:55:55 +0530

 --001a113d1980ac3ad4053057d91c
 Content-Type: text/plain; charset=UTF-8

 On Wed, Apr 13, 2016 at 7:15 AM, Christos Zoulas <christos@zoulas.com> wrote:
 > On Apr 12,  3:40pm, er.abhinav.upadhyay@gmail.com (er.abhinav.upadhyay@gmail.com) wrote:
 > -- Subject: bin/51062: Allow non numeric sections to be indexed and searched
 >
 > | >Number:         51062
 > | >Category:       bin
 > | >Synopsis:       Allow non numeric sections to be indexed and searched by apropos(1)
 > | >Confidential:   no
 > | >Severity:       non-critical
 > | >Priority:       medium
 > | >Responsible:    bin-bug-people
 > | >State:          open
 > | >Class:          sw-bug
 > | >Submitter-Id:   net
 > | >Arrival-Date:   Tue Apr 12 15:40:00 +0000 2016
 > | >Originator:     Abhinav Upadhyay
 > | >Release:        CURRENT
 > | >Organization:
 > | >Environment:
 > | >Description:
 > | Apropos(1) doesn't allow searching for man pages in non-numeric sections. Also, makemandb(8) indexes only the first character of the section number and drops everything else.
 > |
 > |
 > | The attached patch fixes both the problems. It also includes changes for tickets bin/51038, bin/51039, and bin/51040.
 > |
 > | I can probably send a smaller patch if there is no interest in the aforementioned patches :)
 > | >How-To-Repeat:
 > | apropos -s 9lua systm
 > |
 >
 > Please don't mix other patches together. Resubmit just the relevant change,

 Hi Christos,

 Thanks for committing the other patches. I have updated the patch and
 attached with the email.

 --001a113d1980ac3ad4053057d91c
 Content-Type: text/x-patch; charset=US-ASCII; name="apropos_sections.patch"
 Content-Disposition: attachment; filename="apropos_sections.patch"
 Content-Transfer-Encoding: base64
 X-Attachment-Id: f_imyh2npm0

 SW5kZXg6IGFwcm9wb3MtdXRpbHMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3Zzcm9vdC9zcmMv
 dXNyLnNiaW4vbWFrZW1hbmRiL2Fwcm9wb3MtdXRpbHMuYyx2CnJldHJpZXZpbmcgcmV2aXNpb24g
 MS4yMwpkaWZmIC11IC1yMS4yMyBhcHJvcG9zLXV0aWxzLmMKLS0tIGFwcm9wb3MtdXRpbHMuYwkx
 MyBBcHIgMjAxNiAwMTozNzo1MCAtMDAwMAkxLjIzCisrKyBhcHJvcG9zLXV0aWxzLmMJMTMgQXBy
 IDIwMTYgMDY6MDI6MjAgLTAwMDAKQEAgLTQ3NCw3ICs0NzQsNyBAQAogfQogCiAvKgotICogIHJ1
 bl9xdWVyeSAtLQorICogIHJ1bl9xdWVyeV9pbnRlcm5hbCAtLQogICogIFBlcmZvcm1zIHRoZSBz
 ZWFyY2hlcyBmb3IgdGhlIGtleXdvcmRzIGVudGVyZWQgYnkgdGhlIHVzZXIuCiAgKiAgVGhlIDJu
 ZCBwYXJhbTogc25pcHBldF9hcmdzIGlzIGFuIGFycmF5IG9mIHN0cmluZ3MgcHJvdmlkaW5nIHZh
 bHVlcyBmb3IgdGhlCiAgKiAgbGFzdCB0aHJlZSBwYXJhbWV0ZXJzIHRvIHRoZSBzbmlwcGV0IGZ1
 bmN0aW9uIG9mIHNxbGl0ZS4gKExvb2sgYXQgdGhlIGRvY3MpLgpAQCAtNTI1LDE1ICs1MjUsMjAg
 QEAKIAkgKiAyLiBJIGFtIHVzaW5nIExJS0Ugb3BlcmF0b3IgYmVjYXVzZSAnPScgb3IgSU4gb3Bl
 cmF0b3JzIGRvIG5vdCBzZWVtIHRvIGJlCiAJICogd29ya2luZyB3aXRoIHRoZSBjb21wcmVzc2lv
 biBvcHRpb24gZW5hYmxlZC4KIAkgKi8KKwljaGFyICpzZWN0aW9uc19zdHIgPSBhcmdzLT5zZWNf
 bnVtczsKKwljaGFyICp0ZW1wOworCWlmIChzZWN0aW9uc19zdHIpIHsKKwkJd2hpbGUgKCpzZWN0
 aW9uc19zdHIpIHsKKwkJCXNpemVfdCBsZW4gPSBzdHJjc3BuKHNlY3Rpb25zX3N0ciwgIiAiKTsK
 KwkJCWNoYXIgKnNlYyA9IHNlY3Rpb25zX3N0cjsKKwkJCWlmIChzZWN0aW9uc19zdHJbbGVuXSA9
 PSAwKSB7CisJCQkJc2VjdGlvbnNfc3RyICs9IGxlbjsKKwkJCX0gZWxzZSB7CisJCQkJc2VjdGlv
 bnNfc3RyW2xlbl0gPSAwOworCQkJCXNlY3Rpb25zX3N0ciArPSBsZW4gKyAxOworCQkJfQorCQkJ
 ZWFzcHJpbnRmKCZ0ZW1wLCAiXCclc1wnLCIsIHNlYyk7CiAKLQlpZiAoYXJncy0+c2VjX251bXMp
 IHsKLQkJY2hhciAqdGVtcDsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IFNFQ01BWDsg
 aSsrKSB7Ci0JCQlpZiAoYXJncy0+c2VjX251bXNbaV0gPT0gMCkKLQkJCQljb250aW51ZTsKLQkJ
 CWVhc3ByaW50ZigmdGVtcCwgIiBPUiBzZWN0aW9uID0gXCclZFwnIiwgaSArIDEpOwogCQkJaWYg
 KHNlY3Rpb25fY2xhdXNlKSB7CiAJCQkJY29uY2F0KCZzZWN0aW9uX2NsYXVzZSwgdGVtcCk7CiAJ
 CQkJZnJlZSh0ZW1wKTsKQEAgLTU0NCwxMCArNTQ5LDEzIEBACiAJCWlmIChzZWN0aW9uX2NsYXVz
 ZSkgewogCQkJLyoKIAkJCSAqIEF0IGxlYXN0IG9uZSBzZWN0aW9uIHJlcXVlc3RlZCwgYWRkIGds
 dWUgZm9yIHF1ZXJ5LgorCQkJICogQmVmb3JlIGRvaW5nIHRoYXQsIHJlbW92ZSB0aGUgY29tbWEg
 YXQgdGhlIGVuZCBvZiBzZWN0aW9uX2NsYXVzZQogCQkJICovCisJCQlzaXplX3Qgc2VjdGlvbl9j
 bGF1c2VfbGVuID0gc3RybGVuKHNlY3Rpb25fY2xhdXNlKTsKKwkJCWlmIChzZWN0aW9uX2NsYXVz
 ZVtzZWN0aW9uX2NsYXVzZV9sZW4gLSAxXSA9PSAnLCcpCisJCQkJc2VjdGlvbl9jbGF1c2Vbc2Vj
 dGlvbl9jbGF1c2VfbGVuIC0gMV0gPSAwOwogCQkJdGVtcCA9IHNlY3Rpb25fY2xhdXNlOwotCQkJ
 LyogU2tpcCAiIE9SICIgYmVmb3JlIGZpcnN0IHRlcm0uICovCi0JCQllYXNwcmludGYoJnNlY3Rp
 b25fY2xhdXNlLCAiIEFORCAoJXMpIiwgdGVtcCArIDQpOworCQkJZWFzcHJpbnRmKCZzZWN0aW9u
 X2NsYXVzZSwgIiBBTkQgc2VjdGlvbiBJTiAoJXMpIiwgdGVtcCk7CiAJCQlmcmVlKHRlbXApOwog
 CQl9CiAJfQpJbmRleDogYXByb3Bvcy11dGlscy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9jdnNy
 b290L3NyYy91c3Iuc2Jpbi9tYWtlbWFuZGIvYXByb3Bvcy11dGlscy5oLHYKcmV0cmlldmluZyBy
 ZXZpc2lvbiAxLjEwCmRpZmYgLXUgLXIxLjEwIGFwcm9wb3MtdXRpbHMuaAotLS0gYXByb3Bvcy11
 dGlscy5oCTEzIEFwciAyMDE2IDAxOjM3OjUwIC0wMDAwCTEuMTAKKysrIGFwcm9wb3MtdXRpbHMu
 aAkxMyBBcHIgMjAxNiAwNjowMjoyMSAtMDAwMApAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUg
 InNxbGl0ZTMuaCIKIAogI2RlZmluZSBNQU5DT05GICIvZXRjL21hbi5jb25mIgotI2RlZmluZSBT
 RUNNQVggOQogCiAvKiBGbGFncyBmb3Igb3BlbmluZyB0aGUgZGF0YWJhc2UgKi8KIHR5cGVkZWYg
 ZW51bSBtYW5kYl9hY2Nlc3NfbW9kZSB7CkBAIC03NCw3ICs3Myw3IEBACiAKIHR5cGVkZWYgc3Ry
 dWN0IHF1ZXJ5X2FyZ3MgewogCWNvbnN0IGNoYXIgKnNlYXJjaF9zdHI7CQkvLyB1c2VyIHF1ZXJ5
 Ci0JaW50ICpzZWNfbnVtczsJCS8vIFNlY3Rpb24gaW4gd2hpY2ggdG8gZG8gdGhlIHNlYXJjaAor
 CWNoYXIgKnNlY19udW1zOwkJLy8gU2VjdGlvbiBpbiB3aGljaCB0byBkbyB0aGUgc2VhcmNoCiAJ
 aW50IG5yZWM7CQkJLy8gbnVtYmVyIG9mIHJlY29yZHMgdG8gZmV0Y2gKIAlpbnQgb2Zmc2V0OwkJ
 Ly9Gcm9tIHdoaWNoIHBvc2l0aW9uIHRvIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIHJlY29yZHMKIAlp
 bnQgbGVnYWN5OwpJbmRleDogYXByb3Bvcy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9jdnNyb290
 L3NyYy91c3Iuc2Jpbi9tYWtlbWFuZGIvYXByb3Bvcy5jLHYKcmV0cmlldmluZyByZXZpc2lvbiAx
 LjE4CmRpZmYgLXUgLXIxLjE4IGFwcm9wb3MuYwotLS0gYXByb3Bvcy5jCTMxIE1hciAyMDE2IDIw
 OjEzOjM3IC0wMDAwCTEuMTgKKysrIGFwcm9wb3MuYwkxMyBBcHIgMjAxNiAwNjowMjoyMSAtMDAw
 MApAQCAtNDMsNyArNDMsNyBAQAogI2luY2x1ZGUgImFwcm9wb3MtdXRpbHMuaCIKIAogdHlwZWRl
 ZiBzdHJ1Y3QgYXByb3Bvc19mbGFncyB7Ci0JaW50IHNlY19udW1zW1NFQ01BWF07CisJY2hhciAq
 c2VjX251bXM7CiAJaW50IG5yZXN1bHRzOwogCWludCBwYWdlcjsKIAlpbnQgbm9fY29udGV4dDsK
 QEAgLTU4LDYgKzU4LDggQEAKIAlhcHJvcG9zX2ZsYWdzICphZmxhZ3M7CiB9IGNhbGxiYWNrX2Rh
 dGE7CiAKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2VjdGlvbnNfYXJnc19sZW5ndGggPSAx
 NjsKKwogc3RhdGljIGNoYXIgKnJlbW92ZV9zdG9wd29yZHMoY29uc3QgY2hhciAqKTsKIHN0YXRp
 YyBpbnQgcXVlcnlfY2FsbGJhY2sodm9pZCAqLCBjb25zdCBjaGFyICogLCBjb25zdCBjaGFyICos
 IGNvbnN0IGNoYXIgKiwKIAljb25zdCBjaGFyICosIHNpemVfdCk7CkBAIC02OSw2ICs3MSw3IEBA
 CiBwYXJzZWFyZ3MoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3QgYXByb3Bvc19mbGFncyAq
 YWZsYWdzKQogewogCWludCBjaDsKKwljaGFyIHNlY1syXSA9IHswLCAwfTsKIAl3aGlsZSAoKGNo
 ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICIxMjM0NTY3ODlDY2hpbG46UHByUzpzOiIpKSAhPSAtMSkg
 ewogCQlzd2l0Y2ggKGNoKSB7CiAJCWNhc2UgJzEnOgpAQCAtODAsNyArODMsMTMgQEAKIAkJY2Fz
 ZSAnNyc6CiAJCWNhc2UgJzgnOgogCQljYXNlICc5JzoKLQkJCWFmbGFncy0+c2VjX251bXNbY2gg
 LSAnMSddID0gMTsKKwkJCS8qIEdlbmVyYXRlIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgYWxs
 IHRoZSByZXF1ZXN0ZWQgc2VjdGlvbnMgKi8KKwkJCXNlY1swXSA9IChjaGFyKSBjaCA7CisJCQlp
 ZiAoYWZsYWdzLT5zZWNfbnVtcyA9PSBOVUxMKSB7CisJCQkJYWZsYWdzLT5zZWNfbnVtcyA9IGVt
 YWxsb2Moc2VjdGlvbnNfYXJnc19sZW5ndGgpOworCQkJCW1lbWNweShhZmxhZ3MtPnNlY19udW1z
 LCBzZWMsIDIpOworCQkJfSBlbHNlCisJCQkJY29uY2F0MigmYWZsYWdzLT5zZWNfbnVtcywgc2Vj
 LCAxKTsKIAkJCWJyZWFrOwogCQljYXNlICdDJzoKIAkJCWFmbGFncy0+bm9fY29udGV4dCA9IDE7
 CkBAIC0xMTUsMTAgKzEyNCwxMiBAQAogCQkJYWZsYWdzLT5tYWNoaW5lID0gb3B0YXJnOwogCQkJ
 YnJlYWs7CiAJCWNhc2UgJ3MnOgotCQkJY2ggPSBhdG9pKG9wdGFyZyk7Ci0JCQlpZiAoY2ggPCAx
 IHx8IGNoID4gOSkKLQkJCQllcnJ4KEVYSVRfRkFJTFVSRSwgIkludmFsaWQgc2VjdGlvbiIpOwot
 CQkJYWZsYWdzLT5zZWNfbnVtc1tjaCAtIDFdID0gMTsKKwkJCWlmIChhZmxhZ3MtPnNlY19udW1z
 ID09IE5VTEwpIHsKKwkJCQlzaXplX3QgYXJnbGVuID0gc3RybGVuKG9wdGFyZyk7CisJCQkJYWZs
 YWdzLT5zZWNfbnVtcyA9IGFyZ2xlbiA+IHNlY3Rpb25zX2FyZ3NfbGVuZ3RoPyBlbWFsbG9jKGFy
 Z2xlbiArIDEpOiBlbWFsbG9jKHNlY3Rpb25zX2FyZ3NfbGVuZ3RoKTsKKwkJCQltZW1jcHkoYWZs
 YWdzLT5zZWNfbnVtcywgb3B0YXJnLCBhcmdsZW4gKyAxKTsKKwkJCX0gZWxzZQorCQkJCWNvbmNh
 dCgmYWZsYWdzLT5zZWNfbnVtcywgb3B0YXJnKTsKIAkJCWJyZWFrOwogCQljYXNlICc/JzoKIAkJ
 ZGVmYXVsdDoKQEAgLTE0MCw2ICsxNTEsNyBAQAogCWNiZGF0YS5vdXQgPSBzdGRvdXQ7CQkvLyB0
 aGUgZGVmYXVsdCBvdXRwdXQgc3RyZWFtCiAJY2JkYXRhLmNvdW50ID0gMDsKIAlhcHJvcG9zX2Zs
 YWdzIGFmbGFnczsKKwlhZmxhZ3Muc2VjX251bXMgPSBOVUxMOwogCWNiZGF0YS5hZmxhZ3MgPSAm
 YWZsYWdzOwogCXNxbGl0ZTMgKmRiOwogCXNldHByb2duYW1lKGFyZ3ZbMF0pOwpAQCAtMTY5LDEy
 ICsxODEsNiBAQAogCiAJcGFyc2VhcmdzKGFyZ2MsIGFyZ3YsICZhZmxhZ3MpOwogCi0JLyoKLQkg
 KiBJZiB0aGUgdXNlciBzcGVjaWZpZXMgYSBzZWN0aW9uIG51bWJlciBhcyBhbiBvcHRpb24sIHRo
 ZQotCSAqIGNvcnJlc3BvbmRpbmcgaW5kZXggZWxlbWVudCBpbiBzZWNfbnVtcyBpcyBzZXQgdG8g
 dGhlIHN0cmluZwotCSAqIHJlcHJlc2VudGluZyB0aGF0IHNlY3Rpb24gbnVtYmVyLgotCSAqLwot
 CiAJYXJnYyAtPSBvcHRpbmQ7CiAJYXJndiArPSBvcHRpbmQ7CiAKQEAgLTIzMiw2ICsyMzgsNyBA
 QAogCQlmcHJpbnRmKGNiZGF0YS5vdXQsICI8L3RhYmxlPlxuPC9ib2R5PlxuPC9odG1sPlxuIik7
 CiAKIAlmcmVlKHF1ZXJ5KTsKKwlmcmVlKGFmbGFncy5zZWNfbnVtcyk7CiAJY2xvc2VfZGIoZGIp
 OwogCWlmIChlcnJtc2cpIHsKIAkJd2FybngoIiVzIiwgZXJybXNnKTsKSW5kZXg6IG1ha2VtYW5k
 Yi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9jdnNyb290L3NyYy91c3Iuc2Jpbi9tYWtlbWFuZGIv
 bWFrZW1hbmRiLmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMzYKZGlmZiAtdSAtcjEuMzYgbWFr
 ZW1hbmRiLmMKLS0tIG1ha2VtYW5kYi5jCTEzIEFwciAyMDE2IDAxOjQxOjE4IC0wMDAwCTEuMzYK
 KysrIG1ha2VtYW5kYi5jCTEzIEFwciAyMDE2IDA2OjAyOjIyIC0wMDAwCkBAIC03MSw3ICs3MSw3
 IEBACiAJc2VjYnVmZiBleGl0X3N0YXR1czsgLy8gRVhJVCBTVEFUVVMKIAlzZWNidWZmIGRpYWdu
 b3N0aWNzOyAvLyBESUFHTk9TVElDUwogCXNlY2J1ZmYgZXJyb3JzOyAvLyBFUlJPUlMKLQljaGFy
 IHNlY3Rpb25bMl07CisJY2hhciAqc2VjdGlvbjsKIAogCWludCB4cl9mb3VuZDsgLy8gVG8gdHJh
 Y2sgd2hldGhlciBhIC5YciB3YXMgc2VlbiB3aGVuIHBhcnNpbmcgYSBzZWN0aW9uCiAKQEAgLTc3
 NCw3ICs3NzQsNyBAQAogCXJjID0gc3FsaXRlM19wcmVwYXJlX3YyKGRiLCBzcWxzdHIsIC0xLCAm
 c3RtdCwgTlVMTCk7CiAJaWYgKHJjICE9IFNRTElURV9PSykgewogCQlpZiAobWZsYWdzLnZlcmJv
 c2l0eSkKLQkJd2FybngoIiVzIiwgc3FsaXRlM19lcnJtc2coZGIpKTsKKwkJCXdhcm54KCIlcyIs
 IHNxbGl0ZTNfZXJybXNnKGRiKSk7CiAJCWNsb3NlX2RiKGRiKTsKIAkJZXJyeChFWElUX0ZBSUxV
 UkUsICJDb3VsZCBub3QgcXVlcnkgZmlsZSBjYWNoZSIpOwogCX0KQEAgLTk1NCwxNSArOTU0LDE1
 IEBACiAJaWYgKG1kKSB7CiAJCWNvbnN0IHN0cnVjdCBtZG9jX21ldGEgKm1kX21ldGEgPSBtZG9j
 X21ldGEobWQpOwogCQlpZiAobWRfbWV0YS0+bXNlYyA9PSBOVUxMKSB7Ci0JCQlyZWMtPnNlY3Rp
 b25bMF0gPSAnPyc7CisJCQllYXNwcmludGYoJnJlYy0+c2VjdGlvbiwgIiVzIiwgIj8iKTsKIAkJ
 fSBlbHNlCi0JCQlyZWMtPnNlY3Rpb25bMF0gPSBtZF9tZXRhLT5tc2VjWzBdOworCQkJcmVjLT5z
 ZWN0aW9uID0gZXN0cmR1cChtZF9tZXRhLT5tc2VjKTsKIAl9IGVsc2UgaWYgKG0pIHsKIAkJY29u
 c3Qgc3RydWN0IG1hbl9tZXRhICptX21ldGEgPSBtYW5fbWV0YShtKTsKIAkJaWYgKG1fbWV0YS0+
 bXNlYyA9PSBOVUxMKQotCQkJcmVjLT5zZWN0aW9uWzBdID0gJz8nOworCQkJZWFzcHJpbnRmKCZy
 ZWMtPnNlY3Rpb24sICIlcyIsICI/Iik7CiAJCWVsc2UKLQkJCXJlYy0+c2VjdGlvblswXSA9IG1f
 bWV0YS0+bXNlY1swXTsKKwkJCXJlYy0+c2VjdGlvbiA9IGVzdHJkdXAobV9tZXRhLT5tc2VjKTsK
 IAl9IGVsc2UKIAkJcmV0dXJuOwogCkBAIC0xNTgzLDcgKzE1ODMsNyBAQAogCQljaGFyICp0bXA7
 CiAJCXJlYy0+bGlua3MgPSBlc3RyZHVwKHJlYy0+bmFtZSk7CiAJCWZyZWUocmVjLT5uYW1lKTsK
 LQkJaW50IHN6ID0gc3RyY3NwbihyZWMtPmxpbmtzLCAiIFwwIik7CisJCXNpemVfdCBzeiA9IHN0
 cmNzcG4ocmVjLT5saW5rcywgIiBcMCIpOwogCQlyZWMtPm5hbWUgPSBlbWFsbG9jKHN6ICsgMSk7
 CiAJCW1lbWNweShyZWMtPm5hbWUsIHJlYy0+bGlua3MsIHN6KTsKIAkJaWYocmVjLT5uYW1lW3N6
 IC0gMV0gPT0gJywnKQpAQCAtMTk4OSw2ICsxOTg5LDkgQEAKIAogCWZyZWUocmVjLT5tZDVfaGFz
 aCk7CiAJcmVjLT5tZDVfaGFzaCA9IE5VTEw7CisKKwlmcmVlKHJlYy0+c2VjdGlvbik7CisJcmVj
 LT5zZWN0aW9uID0gTlVMTDsKIH0KIAogLyoK
 --001a113d1980ac3ad4053057d91c--

From: Abhinav Upadhyay <er.abhinav.upadhyay@gmail.com>
To: NetBSD GNATS <gnats-bugs@netbsd.org>
Cc: gnats-admin@netbsd.org, netbsd-bugs@netbsd.org
Subject: Re: bin/51062: Allow non numeric sections to be indexed and searched
 by apropos(1)
Date: Wed, 13 Apr 2016 12:21:18 +0530

 On Wed, Apr 13, 2016 at 12:00 PM, Abhinav Upadhyay
 <er.abhinav.upadhyay@gmail.com> wrote:
 > The following reply was made to PR bin/51062; it has been noted by GNATS.
 >
 > From: Abhinav Upadhyay <er.abhinav.upadhyay@gmail.com>
 > To: Christos Zoulas <christos@zoulas.com>
 > Cc: NetBSD GNATS <gnats-bugs@netbsd.org>, gnats-admin@netbsd.org, netbsd-bugs@netbsd.org
 > Subject: Re: bin/51062: Allow non numeric sections to be indexed and searched
 >  by apropos(1)
 > Date: Wed, 13 Apr 2016 11:55:55 +0530
 >
 >  --001a113d1980ac3ad4053057d91c
 >  Content-Type: text/plain; charset=UTF-8
 >
 >  On Wed, Apr 13, 2016 at 7:15 AM, Christos Zoulas <christos@zoulas.com> wrote:
 >  > On Apr 12,  3:40pm, er.abhinav.upadhyay@gmail.com (er.abhinav.upadhyay@gmail.com) wrote:
 >  > -- Subject: bin/51062: Allow non numeric sections to be indexed and searched
 >  >
 >  > | >Number:         51062
 >  > | >Category:       bin
 >  > | >Synopsis:       Allow non numeric sections to be indexed and searched by apropos(1)
 >  > | >Confidential:   no
 >  > | >Severity:       non-critical
 >  > | >Priority:       medium
 >  > | >Responsible:    bin-bug-people
 >  > | >State:          open
 >  > | >Class:          sw-bug
 >  > | >Submitter-Id:   net
 >  > | >Arrival-Date:   Tue Apr 12 15:40:00 +0000 2016
 >  > | >Originator:     Abhinav Upadhyay
 >  > | >Release:        CURRENT
 >  > | >Organization:
 >  > | >Environment:
 >  > | >Description:
 >  > | Apropos(1) doesn't allow searching for man pages in non-numeric sections. Also, makemandb(8) indexes only the first character of the section number and drops everything else.
 >  > |
 >  > |
 >  > | The attached patch fixes both the problems. It also includes changes for tickets bin/51038, bin/51039, and bin/51040.
 >  > |
 >  > | I can probably send a smaller patch if there is no interest in the aforementioned patches :)
 >  > | >How-To-Repeat:
 >  > | apropos -s 9lua systm
 >  > |
 >  >
 >  > Please don't mix other patches together. Resubmit just the relevant change,
 >
 >  Hi Christos,
 >
 >  Thanks for committing the other patches. I have updated the patch and
 >  attached with the email.
 >

 Looks like gmail messed up the patch in the attachment. Posting it inline:

 Index: apropos-utils.c
 ===================================================================
 RCS file: /cvsroot/src/usr.sbin/makemandb/apropos-utils.c,v
 retrieving revision 1.23
 diff -u -r1.23 apropos-utils.c
 --- apropos-utils.c    13 Apr 2016 01:37:50 -0000    1.23
 +++ apropos-utils.c    13 Apr 2016 06:02:20 -0000
 @@ -474,7 +474,7 @@
  }

  /*
 - *  run_query --
 + *  run_query_internal --
   *  Performs the searches for the keywords entered by the user.
   *  The 2nd param: snippet_args is an array of strings providing values for the
   *  last three parameters to the snippet function of sqlite. (Look at
 the docs).
 @@ -525,15 +525,20 @@
       * 2. I am using LIKE operator because '=' or IN operators do not
 seem to be
       * working with the compression option enabled.
       */
 +    char *sections_str = args->sec_nums;
 +    char *temp;
 +    if (sections_str) {
 +        while (*sections_str) {
 +            size_t len = strcspn(sections_str, " ");
 +            char *sec = sections_str;
 +            if (sections_str[len] == 0) {
 +                sections_str += len;
 +            } else {
 +                sections_str[len] = 0;
 +                sections_str += len + 1;
 +            }
 +            easprintf(&temp, "\'%s\',", sec);

 -    if (args->sec_nums) {
 -        char *temp;
 -        int i;
 -
 -        for (i = 0; i < SECMAX; i++) {
 -            if (args->sec_nums[i] == 0)
 -                continue;
 -            easprintf(&temp, " OR section = \'%d\'", i + 1);
              if (section_clause) {
                  concat(&section_clause, temp);
                  free(temp);
 @@ -544,10 +549,13 @@
          if (section_clause) {
              /*
               * At least one section requested, add glue for query.
 +             * Before doing that, remove the comma at the end of section_clause
               */
 +            size_t section_clause_len = strlen(section_clause);
 +            if (section_clause[section_clause_len - 1] == ',')
 +                section_clause[section_clause_len - 1] = 0;
              temp = section_clause;
 -            /* Skip " OR " before first term. */
 -            easprintf(&section_clause, " AND (%s)", temp + 4);
 +            easprintf(&section_clause, " AND section IN (%s)", temp);
              free(temp);
          }
      }
 Index: apropos-utils.h
 ===================================================================
 RCS file: /cvsroot/src/usr.sbin/makemandb/apropos-utils.h,v
 retrieving revision 1.10
 diff -u -r1.10 apropos-utils.h
 --- apropos-utils.h    13 Apr 2016 01:37:50 -0000    1.10
 +++ apropos-utils.h    13 Apr 2016 06:02:21 -0000
 @@ -36,7 +36,6 @@
  #include "sqlite3.h"

  #define MANCONF "/etc/man.conf"
 -#define SECMAX 9

  /* Flags for opening the database */
  typedef enum mandb_access_mode {
 @@ -74,7 +73,7 @@

  typedef struct query_args {
      const char *search_str;        // user query
 -    int *sec_nums;        // Section in which to do the search
 +    char *sec_nums;        // Section in which to do the search
      int nrec;            // number of records to fetch
      int offset;        //From which position to start processing the records
      int legacy;
 Index: apropos.c
 ===================================================================
 RCS file: /cvsroot/src/usr.sbin/makemandb/apropos.c,v
 retrieving revision 1.18
 diff -u -r1.18 apropos.c
 --- apropos.c    31 Mar 2016 20:13:37 -0000    1.18
 +++ apropos.c    13 Apr 2016 06:02:21 -0000
 @@ -43,7 +43,7 @@
  #include "apropos-utils.h"

  typedef struct apropos_flags {
 -    int sec_nums[SECMAX];
 +    char *sec_nums;
      int nresults;
      int pager;
      int no_context;
 @@ -58,6 +58,8 @@
      apropos_flags *aflags;
  } callback_data;

 +static const unsigned int sections_args_length = 16;
 +
  static char *remove_stopwords(const char *);
  static int query_callback(void *, const char * , const char *, const char *,
      const char *, size_t);
 @@ -69,6 +71,7 @@
  parseargs(int argc, char **argv, struct apropos_flags *aflags)
  {
      int ch;
 +    char sec[2] = {0, 0};
      while ((ch = getopt(argc, argv, "123456789Cchiln:PprS:s:")) != -1) {
          switch (ch) {
          case '1':
 @@ -80,7 +83,13 @@
          case '7':
          case '8':
          case '9':
 -            aflags->sec_nums[ch - '1'] = 1;
 +            /* Generate a space separated list of all the requested sections */
 +            sec[0] = (char) ch ;
 +            if (aflags->sec_nums == NULL) {
 +                aflags->sec_nums = emalloc(sections_args_length);
 +                memcpy(aflags->sec_nums, sec, 2);
 +            } else
 +                concat2(&aflags->sec_nums, sec, 1);
              break;
          case 'C':
              aflags->no_context = 1;
 @@ -115,10 +124,12 @@
              aflags->machine = optarg;
              break;
          case 's':
 -            ch = atoi(optarg);
 -            if (ch < 1 || ch > 9)
 -                errx(EXIT_FAILURE, "Invalid section");
 -            aflags->sec_nums[ch - 1] = 1;
 +            if (aflags->sec_nums == NULL) {
 +                size_t arglen = strlen(optarg);
 +                aflags->sec_nums = arglen > sections_args_length?
 emalloc(arglen + 1): emalloc(sections_args_length);
 +                memcpy(aflags->sec_nums, optarg, arglen + 1);
 +            } else
 +                concat(&aflags->sec_nums, optarg);
              break;
          case '?':
          default:
 @@ -140,6 +151,7 @@
      cbdata.out = stdout;        // the default output stream
      cbdata.count = 0;
      apropos_flags aflags;
 +    aflags.sec_nums = NULL;
      cbdata.aflags = &aflags;
      sqlite3 *db;
      setprogname(argv[0]);
 @@ -169,12 +181,6 @@

      parseargs(argc, argv, &aflags);

 -    /*
 -     * If the user specifies a section number as an option, the
 -     * corresponding index element in sec_nums is set to the string
 -     * representing that section number.
 -     */
 -
      argc -= optind;
      argv += optind;

 @@ -232,6 +238,7 @@
          fprintf(cbdata.out, "</table>\n</body>\n</html>\n");

      free(query);
 +    free(aflags.sec_nums);
      close_db(db);
      if (errmsg) {
          warnx("%s", errmsg);
 Index: makemandb.c
 ===================================================================
 RCS file: /cvsroot/src/usr.sbin/makemandb/makemandb.c,v
 retrieving revision 1.36
 diff -u -r1.36 makemandb.c
 --- makemandb.c    13 Apr 2016 01:41:18 -0000    1.36
 +++ makemandb.c    13 Apr 2016 06:02:22 -0000
 @@ -71,7 +71,7 @@
      secbuff exit_status; // EXIT STATUS
      secbuff diagnostics; // DIAGNOSTICS
      secbuff errors; // ERRORS
 -    char section[2];
 +    char *section;

      int xr_found; // To track whether a .Xr was seen when parsing a section

 @@ -774,7 +774,7 @@
      rc = sqlite3_prepare_v2(db, sqlstr, -1, &stmt, NULL);
      if (rc != SQLITE_OK) {
          if (mflags.verbosity)
 -        warnx("%s", sqlite3_errmsg(db));
 +            warnx("%s", sqlite3_errmsg(db));
          close_db(db);
          errx(EXIT_FAILURE, "Could not query file cache");
      }
 @@ -954,15 +954,15 @@
      if (md) {
          const struct mdoc_meta *md_meta = mdoc_meta(md);
          if (md_meta->msec == NULL) {
 -            rec->section[0] = '?';
 +            easprintf(&rec->section, "%s", "?");
          } else
 -            rec->section[0] = md_meta->msec[0];
 +            rec->section = estrdup(md_meta->msec);
      } else if (m) {
          const struct man_meta *m_meta = man_meta(m);
          if (m_meta->msec == NULL)
 -            rec->section[0] = '?';
 +            easprintf(&rec->section, "%s", "?");
          else
 -            rec->section[0] = m_meta->msec[0];
 +            rec->section = estrdup(m_meta->msec);
      } else
          return;

 @@ -1583,7 +1583,7 @@
          char *tmp;
          rec->links = estrdup(rec->name);
          free(rec->name);
 -        int sz = strcspn(rec->links, " \0");
 +        size_t sz = strcspn(rec->links, " \0");
          rec->name = emalloc(sz + 1);
          memcpy(rec->name, rec->links, sz);
          if(rec->name[sz - 1] == ',')
 @@ -1989,6 +1989,9 @@

      free(rec->md5_hash);
      rec->md5_hash = NULL;
 +
 +    free(rec->section);
 +    rec->section = NULL;
  }

  /*

From: "Christos Zoulas" <christos@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/51062 CVS commit: src/usr.sbin/makemandb
Date: Wed, 13 Apr 2016 07:48:29 -0400

 Module Name:	src
 Committed By:	christos
 Date:		Wed Apr 13 11:48:29 UTC 2016

 Modified Files:
 	src/usr.sbin/makemandb: apropos-utils.c apropos-utils.h apropos.c
 	    makemandb.c

 Log Message:
 PR/51062: Abhinav Upadhyay: Allow non numeric sections to be indexed and
 searched by apropos(1).
 Fold long lines.


 To generate a diff of this commit:
 cvs rdiff -u -r1.23 -r1.24 src/usr.sbin/makemandb/apropos-utils.c
 cvs rdiff -u -r1.10 -r1.11 src/usr.sbin/makemandb/apropos-utils.h
 cvs rdiff -u -r1.18 -r1.19 src/usr.sbin/makemandb/apropos.c
 cvs rdiff -u -r1.36 -r1.37 src/usr.sbin/makemandb/makemandb.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: christos@zoulas.com (Christos Zoulas)
To: Abhinav Upadhyay <er.abhinav.upadhyay@gmail.com>
Cc: NetBSD GNATS <gnats-bugs@netbsd.org>, gnats-admin@netbsd.org, 
	netbsd-bugs@netbsd.org
Subject: Re: bin/51062: Allow non numeric sections to be indexed and searched by apropos(1)
Date: Wed, 13 Apr 2016 07:50:10 -0400

 On Apr 13, 11:55am, er.abhinav.upadhyay@gmail.com (Abhinav Upadhyay) wrote:
 -- Subject: Re: bin/51062: Allow non numeric sections to be indexed and searc

 Applied, thanks!

 christos

From: Abhinav Upadhyay <er.abhinav.upadhyay@gmail.com>
To: Christos Zoulas <christos@zoulas.com>
Cc: NetBSD GNATS <gnats-bugs@netbsd.org>, gnats-admin@netbsd.org, netbsd-bugs@netbsd.org
Subject: Re: bin/51062: Allow non numeric sections to be indexed and searched
 by apropos(1)
Date: Wed, 13 Apr 2016 17:26:38 +0530

 On Wed, Apr 13, 2016 at 5:20 PM, Christos Zoulas <christos@zoulas.com> wrote:
 > On Apr 13, 11:55am, er.abhinav.upadhyay@gmail.com (Abhinav Upadhyay) wrote:
 > -- Subject: Re: bin/51062: Allow non numeric sections to be indexed and searc
 >
 > Applied, thanks!
 >

 Thanks Christos :)

 --
 Abhinav

State-Changed-From-To: open->closed
State-Changed-By: wiz@NetBSD.org
State-Changed-When: Wed, 13 Apr 2016 12:16:33 +0000
State-Changed-Why:
Committed by christos, thanks!


From: Abhinav Upadhyay <er.abhinav.upadhyay@gmail.com>
To: NetBSD GNATS <gnats-bugs@netbsd.org>
Cc: gnats-admin@netbsd.org, netbsd-bugs@netbsd.org, 
	Thomas Klausner <wiz@netbsd.org>
Subject: Re: bin/51062 (Allow non numeric sections to be indexed and searched
 by apropos(1))
Date: Wed, 13 Apr 2016 20:14:48 +0530

 On Wed, Apr 13, 2016 at 5:46 PM,  <wiz@netbsd.org> wrote:
 > Synopsis: Allow non numeric sections to be indexed and searched by apropos(1)
 >
 > State-Changed-From-To: open->closed
 > State-Changed-By: wiz@NetBSD.org
 > State-Changed-When: Wed, 13 Apr 2016 12:16:33 +0000
 > State-Changed-Why:
 > Committed by christos, thanks!

 I think bin/46081 can also be closed :)

 --
 Abhinav

>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2014 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.