Print this page
Latest round of fixes per RM and AL. Fix bugs found in man.c.
*** 26,35 ****
--- 26,36 ----
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Copyright 2012 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2014 Garrett D'Amore <garrett@damore.org>
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/param.h>
*** 174,193 ****
static void
sbuf_need(struct sbuf *sbuf, int nchars)
{
char *new_content;
size_t size, cntsize;
! /* Double the size of the allocation until the buffer is big enough */
! while (sbuf->end + nchars > sbuf->last) {
size = sbuf->last + 1 - sbuf->content;
! size *= 2;
cntsize = sbuf->end - sbuf->content;
! new_content = (char *)malloc(size);
! (void) memcpy(new_content, sbuf->content, cntsize);
! free(sbuf->content);
sbuf->content = new_content;
sbuf->end = new_content + cntsize;
sbuf->last = new_content + size - 1;
}
}
--- 175,202 ----
static void
sbuf_need(struct sbuf *sbuf, int nchars)
{
char *new_content;
size_t size, cntsize;
+ size_t grow = 128;
! while (grow < nchars) {
! grow += 128; /* we grow in chunks of 128 bytes */
! }
!
! /* Grow if the buffer isn't big enough */
! if (sbuf->end + nchars > sbuf->last) {
size = sbuf->last + 1 - sbuf->content;
! size += grow;
cntsize = sbuf->end - sbuf->content;
! if ((new_content = realloc(sbuf->content, size)) == NULL) {
! perror("realloc");
! if (tempfile[0] != '\0')
! (void) unlink(tempfile);
! exit(1);
! }
sbuf->content = new_content;
sbuf->end = new_content + cntsize;
sbuf->last = new_content + size - 1;
}
}
*** 257,278 ****
*/
static int
no_page_exists(char *dir, stringlist *names, char *suffix)
{
char path[MAXPATHLEN];
size_t i;
for (i = 0; i < names->sl_cur; i++) {
! (void) snprintf(path, MAXPATHLEN, "%s/%s.%s.gz",
! dir, names->sl_str[i], suffix);
! if (access(path, F_OK) < 0) {
! path[strlen(path) - 3] = '\0';
! if (access(path, F_OK) < 0)
! continue;
! }
return (0);
}
return (1);
}
/* ARGSUSED sig */
static void
--- 266,288 ----
*/
static int
no_page_exists(char *dir, stringlist *names, char *suffix)
{
char path[MAXPATHLEN];
+ char *suffixes[] = { "", ".gz", ".bz2", NULL };
size_t i;
+ int j;
for (i = 0; i < names->sl_cur; i++) {
! for (j = 0; suffixes[j] != NULL; j++) {
! (void) snprintf(path, MAXPATHLEN, "%s/%s.%s%s",
! dir, names->sl_str[i], suffix, suffixes[j]);
! if (access(path, F_OK) == 0) {
return (0);
}
+ }
+ }
return (1);
}
/* ARGSUSED sig */
static void