You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
5.5 KiB
258 lines
5.5 KiB
diff -ur ../man-1.6g.orig/man2html/man2html.c ./man2html/man2html.c
|
|
--- ../man-1.6g.orig/man2html/man2html.c 2007-08-05 12:15:23.000000000 -0700
|
|
+++ ./man2html/man2html.c 2011-12-15 03:28:57.605162107 -0700
|
|
@@ -15,6 +15,7 @@
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
+#include <errno.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
@@ -55,6 +56,108 @@
|
|
|
|
static char charb[3];
|
|
|
|
+#ifdef GUNZIP
|
|
+/* from src/utils.c */
|
|
+static int
|
|
+is_shell_safe(const char *ss, int quoted) {
|
|
+ char *bad = " ;'\\\"<>|";
|
|
+ char *p;
|
|
+
|
|
+ if (quoted)
|
|
+ bad++; /* allow a space inside quotes */
|
|
+ for (p = bad; *p; p++)
|
|
+ if (strchr(ss, *p))
|
|
+ return 0;
|
|
+ return 1;
|
|
+}
|
|
+#endif
|
|
+
|
|
+/* reads the entire manpage into buffer *buf and returns number of chars read */
|
|
+static int
|
|
+read_manpage_into_buffer(char *path, char **buf) {
|
|
+ int compressed = 0;
|
|
+ FILE * f = NULL;
|
|
+ char * ext;
|
|
+ int l = 0;
|
|
+ struct stat stbuf;
|
|
+
|
|
+ *buf = NULL;
|
|
+ if (!path)
|
|
+ return -1;
|
|
+
|
|
+ if (!strcmp(path, "-"))
|
|
+ f = stdin;
|
|
+ else /* strcmp(path, "-") */
|
|
+ {
|
|
+ char * tmp = NULL;
|
|
+ char * command = NULL;
|
|
+ char * openpath = path;
|
|
+#ifdef GUNZIP
|
|
+
|
|
+ if (is_shell_safe(openpath, 1)) {
|
|
+ ext = strrchr(openpath, '.');
|
|
+ compressed = (ext && !strcmp(ext, ".gz"));
|
|
+
|
|
+ if (!compressed && stat(openpath, &stbuf)) {
|
|
+ tmp = (char*) xmalloc(strlen(path) + 4);
|
|
+ sprintf(tmp, "%s.gz", path);
|
|
+ if ((compressed = !stat(tmp, &stbuf)))
|
|
+ openpath = tmp;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (compressed) {
|
|
+ command = (char*) xmalloc(strlen(openpath) + sizeof(GUNZIP) + 4);
|
|
+ sprintf(command, GUNZIP " '%s'", openpath);
|
|
+ f = popen(command, "r");
|
|
+ } else
|
|
+#endif
|
|
+ f = fopen(openpath, "r");
|
|
+
|
|
+ if (tmp) free(tmp);
|
|
+ if (command) free(command);
|
|
+
|
|
+ if (!f)
|
|
+ return -1;
|
|
+
|
|
+ } /* strcmp(path, "-") */
|
|
+
|
|
+
|
|
+ /* Read entire file into buf[1..l] */
|
|
+#define XTRA 5
|
|
+ /* buf has 1 extra byte at the start, and XTRA extra bytes at the end */
|
|
+ if (compressed || f == stdin) {
|
|
+ int sz = 1024;
|
|
+ int ct = 1, tot = 0;
|
|
+ char *p = NULL;
|
|
+
|
|
+ clearerr(f);
|
|
+ while (ct > 0) {
|
|
+ tot += ct;
|
|
+ if (feof(f))
|
|
+ break;
|
|
+ sz = 2*sz+tot;
|
|
+ p = xrealloc(p, sz);
|
|
+ ct = fread(p+tot,1,sz-tot-XTRA,f);
|
|
+ }
|
|
+
|
|
+ *buf = p;
|
|
+ l = tot-1;
|
|
+ } else {
|
|
+ int ct;
|
|
+
|
|
+ l = 0;
|
|
+ if (fstat(fileno(f), &stbuf) != -1)
|
|
+ l = stbuf.st_size;
|
|
+ *buf = (char *) xmalloc((l+1+XTRA)*sizeof(char));
|
|
+ ct = fread(*buf+1,1,l,f);
|
|
+ if (ct < l)
|
|
+ l = ct;
|
|
+ }
|
|
+ fclose(f);
|
|
+ return l;
|
|
+}
|
|
+
|
|
static char *
|
|
expand_char(int nr)
|
|
{
|
|
@@ -1817,8 +1920,6 @@
|
|
break;
|
|
case V('s','o'):
|
|
{
|
|
- FILE *f;
|
|
- struct stat stbuf;
|
|
int l; char *buf;
|
|
char *name = NULL;
|
|
|
|
@@ -1826,21 +1927,21 @@
|
|
c += j; /* skip .so part and whitespace */
|
|
if (*c == '/') {
|
|
h = c;
|
|
- } else { /* .so man3/cpow.3 -> ../man3/cpow.3 */
|
|
- h = c-3;
|
|
- h[0] = '.';
|
|
- h[1] = '.';
|
|
- h[2] = '/';
|
|
- }
|
|
+ } else { /* .so man3/cpow.3 -> ../man3/cpow.3 */
|
|
+/* h = c-3;
|
|
+ h[0] = '.';
|
|
+ h[1] = '.';
|
|
+ h[2] = '/';
|
|
+*/
|
|
+ h = c;
|
|
+ }
|
|
+
|
|
while (*c != '\n') c++;
|
|
while (c[-1] == ' ') c--;
|
|
while (*c != '\n') *c++ = 0;
|
|
*c = 0;
|
|
scan_troff(h,1, &name);
|
|
if (name[3] == '/') h=name+3; else h=name;
|
|
- l = 0;
|
|
- if (stat(h, &stbuf)!=-1) l=stbuf.st_size;
|
|
- buf = (char*) xmalloc((l+4)*sizeof(char));
|
|
#if NOCGI
|
|
if (!out_length) {
|
|
char *t,*s;
|
|
@@ -1857,7 +1958,7 @@
|
|
#endif
|
|
{
|
|
/* this works alright, except for section 3 */
|
|
- if (!l || !(f = fopen(h,"r"))) {
|
|
+ if ((l = read_manpage_into_buffer(h, &buf)) < 0) {
|
|
fprintf(stderr,
|
|
"man2html: unable to open or read file %s\n", h);
|
|
out_html("<BLOCKQUOTE>"
|
|
@@ -1865,13 +1966,11 @@
|
|
out_html(h);
|
|
out_html("</BLOCKQUOTE>\n");
|
|
} else {
|
|
- i=fread(buf+1,1,l,f);
|
|
- fclose(f);
|
|
buf[0]=buf[l]='\n';
|
|
buf[l+1]=buf[l+2]=0;
|
|
scan_troff(buf+1,0,NULL);
|
|
+ if (buf) free(buf);
|
|
}
|
|
- if (buf) free(buf);
|
|
}
|
|
*c++='\n';
|
|
break;
|
|
@@ -3073,6 +3172,8 @@
|
|
}
|
|
}
|
|
|
|
+
|
|
+
|
|
/*
|
|
* Call: man2html [-l] [filename]
|
|
*
|
|
@@ -3083,8 +3184,6 @@
|
|
*/
|
|
int
|
|
main(int argc, char **argv) {
|
|
- FILE *f;
|
|
- struct stat stbuf;
|
|
int l, c;
|
|
char *buf, *filename, *fnam = NULL;
|
|
|
|
@@ -3146,50 +3245,16 @@
|
|
|
|
/* Open input file */
|
|
if (!fnam || !strcmp(fnam, "-")) {
|
|
- f = stdin;
|
|
+ fnam = "-";
|
|
fname = "(stdin)";
|
|
} else {
|
|
/* do a chdir() first, to get .so expansion right */
|
|
goto_dir(fnam, &directory, &fnam);
|
|
-
|
|
- f = fopen(fnam, "r");
|
|
- if (f == NULL)
|
|
- error_page("File not found", "Could not open %s\n", filename);
|
|
- fname = fnam;
|
|
}
|
|
|
|
- /* Read entire file into buf[1..l] */
|
|
-#define XTRA 5
|
|
- /* buf has 1 extra byte at the start, and XTRA extra bytes at the end */
|
|
- if (f == stdin) {
|
|
- int sz = 1024;
|
|
- int ct = 1, tot = 0;
|
|
- char *p = NULL;
|
|
-
|
|
- clearerr(stdin);
|
|
- while (ct > 0) {
|
|
- tot += ct;
|
|
- if (feof(stdin))
|
|
- break;
|
|
- sz = 2*sz+tot;
|
|
- p = xrealloc(p, sz);
|
|
- ct = fread(p+tot,1,sz-tot-XTRA,stdin);
|
|
- }
|
|
-
|
|
- buf = p;
|
|
- l = tot-1;
|
|
- } else {
|
|
- int ct;
|
|
-
|
|
- l = 0;
|
|
- if (fstat(fileno(f), &stbuf) != -1)
|
|
- l = stbuf.st_size;
|
|
- buf = (char *) xmalloc((l+1+XTRA)*sizeof(char));
|
|
- ct = fread(buf+1,1,l,f);
|
|
- if (ct < l)
|
|
- l = ct;
|
|
- fclose(f);
|
|
- }
|
|
+ l = read_manpage_into_buffer(fnam, &buf);
|
|
+ if (l < 0)
|
|
+ error_page("File not found", "Could not open %s\n", fname);
|
|
|
|
buf[0] = '\n';
|
|
buf[l+1] = '\n';
|