Return to BSD News archive
Path: sserve!manuel.anu.edu.au!munnari.oz.au!goanna!escargot!minyos.xx.rmit.oz.au!s902113
From: s902113@minyos.xx.rmit.oz.au (Luke Mewburn)
Newsgroups: comp.unix.bsd
Subject: Re: ->386bsd! man-pages.Z ?
Message-ID: <1dr6fkINN95s@escargot.xx.rmit.OZ.AU>
Date: 11 Nov 92 14:48:20 GMT
References: <1992Nov11.053352.29060@utkux1.utk.edu>
Organization: RMIT Computer Centre
Lines: 237
NNTP-Posting-Host: minyos.xx.rmit.oz.au
frank@martha.utcc.utk.edu (frank segner (phrank)) writes:
>hi folks !
>recently i made a du (-k) /usr/share/man... (just about 4 Mb ascii... ;-( )
>that reminded me of the time i ran isc, there it was !better! (manpage.0.Z)
>my 'zcat whatever.Z |less' would be fast enough...
>does someone have an idea where to find a decent replacement for the
>original man?
>if so -> let me know ; flames -> /dev/null ;-]
>so long
As an experiment, I hacked the man sources to do this. Unfortunately,
my hack is not the best, and can die when you do man -a intro (or
something with lots of manuals - I since found out that the normal
man command does the same thing - there is a patch available for this
latter bug but my hack doesn't include it.) I can post my diffs to the
net.
(Note, I admit my way is a kludge, but it works, albiet a little
slowly - you have to wait whilst it temporarily uncompresses _all_
manuals you ask for, cause I didn't hack the way it built up the list
of files to display)
PS: I just noticed - the diffs add some printfs I had as a leftover
from debugging... They can be easily found after you apply the patch -
just look for a printf() in col 0:)
-- diffs --
*** orig.man.c Tue Aug 18 01:40:10 1992
--- man.c Tue Aug 18 01:57:58 1992
***************
*** 48,53 ****
--- 48,54 ----
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
+ #include <unistd.h>
#include "pathnames.h"
extern int errno;
***************
*** 56,61 ****
--- 57,69 ----
char *command, *machine, *p_augment, *p_path, *pager, *progname;
extern char **arorder, *pathbuf;
+ #ifdef COMPRESSED
+ #define ZAKERREXIT { perror("man"); exit(1); }
+
+ char **tmpfilelist, tmpfilename[MAXPATHLEN + 1];
+ int tmpfilecnt,tmpindexpos;
+ #endif /* COMPRESSED */
+
main(argc, argv)
int argc;
register char **argv;
***************
*** 64,71 ****
--- 72,90 ----
extern int optind;
int ch, res;
char *section[2], *check_pager(), *getpath(), **getorder(), *tmp;
+ #ifdef COMPRESSED
+ void cleanup();
+
+ tmpfilecnt=0;
+ if (( tmpfilelist=calloc(argc,sizeof(char *))) == NULL)
+ ZAKERREXIT
+ atexit(cleanup);
+ (void) tmpnam(tmpfilename);
+ tmpindexpos=strlen(tmpfilename);
+ #endif /* COMPRESSED */
progname = "man";
+
while ((ch = getopt(argc, argv, "-acfhkM:m:P:w")) != EOF)
switch((char)ch) {
case 'a':
***************
*** 146,151 ****
--- 165,171 ----
}
for (; *argv; ++argv) {
+ printf("argv is :%s:\n",*argv);
if (p_augment)
res = manual(p_augment, *argv);
res = manual(p_path, *argv);
***************
*** 156,161 ****
--- 176,190 ----
exit(1);
}
+ #ifdef COMPRESSED
+ printf("command is :%s:\n",command);
+ /* wait for uncompressing children */
+ while ((res = wait(NULL)) != -1)
+ printf("child %d finished.\n",res);
+ if (errno != ECHILD)
+ ZAKERREXIT
+ #endif
+
/* use system(3) in case someone's pager is "pager arg1 arg2" */
if (command)
(void)system(command);
***************
*** 175,180 ****
--- 204,214 ----
register char *end;
char fname[MAXPATHLEN + 1];
+ #ifdef COMPRESSED
+ register int is_compressed,pid;
+ char zcatpath[MAXPATHLEN + 1];
+ #endif /* COMPRESSED */
+
for (res = 0;; path = end + 1) {
if (!*path) /* foo: */
break;
***************
*** 183,203 ****
continue;
*end = '\0';
}
(void)sprintf(fname, "%s/%s.0", path, name);
if (access(fname, R_OK)) {
(void)sprintf(fname, "%s/%s/%s.0", path, machine, name);
if (access(fname, R_OK))
continue;
}
if (f_where)
(void)printf("man: found in %s.\n", fname);
! else if (f_cat)
cat(fname);
else if (f_how)
how(fname);
else
add(fname);
if (!f_all)
return(1);
res = 1;
--- 217,276 ----
continue;
*end = '\0';
}
+ #ifdef COMPRESSED
+ is_compressed=0;
+ #endif /* COMPRESSED */
(void)sprintf(fname, "%s/%s.0", path, name);
if (access(fname, R_OK)) {
(void)sprintf(fname, "%s/%s/%s.0", path, machine, name);
if (access(fname, R_OK))
+ #ifdef COMPRESSED
+ {
+ (void)sprintf(fname, "%s/%s.0.Z", path, name);
+ if (access(fname, R_OK)) {
+ (void)sprintf(fname, "%s/%s/%s.0.Z", path, machine, name);
+ if (access(fname, R_OK))
+ continue;
+ }
+ }
+ is_compressed++;
+ #else
continue;
+ #endif /* COMPRESSED */
}
if (f_where)
(void)printf("man: found in %s.\n", fname);
! else
! #ifdef COMPRESSED
! {
! if (is_compressed)
! {
! sprintf(tmpfilename+tmpindexpos,"%.2d",tmpfilecnt);
! (void)fprintf(stderr,"Uncompressing %s to %s.\n",fname,tmpfilename);
! sprintf(zcatpath,"%s %s > %s",_PATH_ZCAT,fname,tmpfilename);
! if ((pid=fork()) == -1)
! ZAKERREXIT
! if (pid == 0)
! {
! printf("child is %d.\n",getpid());
! if (system(zcatpath))
! ZAKERREXIT
! _exit(0);
! }
! tmpfilelist[tmpfilecnt++] = strdup(tmpfilename);
! strcpy(fname, tmpfilename);
! }
! #endif /* COMPRESSED */
! if (f_cat)
cat(fname);
else if (f_how)
how(fname);
else
add(fname);
+ #ifdef COMPRESSED
+ } /* end the brace from elseif (f_cat). */
+ #endif /* COMPRESSED */
if (!f_all)
return(1);
res = 1;
***************
*** 370,372 ****
--- 443,462 ----
"usage: man [-ac] [-M path] [-m path] [section] title ...\n");
exit(1);
}
+
+ #ifdef COMPRESSED
+ void cleanup()
+ {
+ int lp;
+ for (lp=0;lp<tmpfilecnt;lp++)
+ {
+ if (tmpfilelist[lp] != NULL)
+ {
+ unlink(tmpfilelist[lp]);
+ if ((errno) && (errno != ENOENT))
+ perror("man");
+ }
+ }
+ _exit(0); /* for when used in sig handlers... */
+ }
+ #endif /* COMPRESSED */
> frank
>--
>frank@martha.utk.edu please don't spit on the floor ?!
--
Luke Mewburn [Zak]
s902113@minyos.xx.rmit.oz.au zak@rmit.edu.au
"Nobody dies on the Discworld, they just become dimensionally
disadvantaged." Terry Pratchett in alt.fan.pratchett