mirror of https://github.com/GnoConsortium/gno.git
- whereis now takes it's selection of directories from a configuration
file - added describe entry, rez fork - merged into GNO base build
This commit is contained in:
parent
2ad717bf06
commit
595a3dfaea
|
@ -0,0 +1,45 @@
|
|||
#
|
||||
# This makefile is intended for use with dmake(1) on Apple IIGS
|
||||
#
|
||||
# $Id: Makefile,v 1.1 1997/09/30 04:22:43 gdr Exp $
|
||||
#
|
||||
# Devin Reade, September 1997
|
||||
#
|
||||
|
||||
PROG = whereis
|
||||
|
||||
BINDIR = /usr/bin
|
||||
MANDIR = /usr/man
|
||||
ETCDIR = /etc
|
||||
|
||||
.INCLUDE: /src/gno/paths.mk
|
||||
.INCLUDE: /src/gno/binconst.mk
|
||||
|
||||
RELBIN = $(RELEASE_DIR)$(BINDIR)
|
||||
RELMAN = $(RELEASE_DIR)$(MANDIR)
|
||||
RELETC = $(RELEASE_DIR)$(ETCDIR)
|
||||
|
||||
RELINC = $(RELEASE_DIR)/usr/include
|
||||
RELLIB = $(RELEASE_DIR)/usr/lib
|
||||
|
||||
OBJS = $(SRCS:s/.c/.o/:f)
|
||||
|
||||
OPTIMIZE = 78
|
||||
STACK = 1024
|
||||
|
||||
# Use -D__STACK_CHECK__ to see stack usage
|
||||
DEFINES +=
|
||||
|
||||
INCLUDES += -I$(RELINC)
|
||||
CFLAGS += -r $(INCLUDES) -O$(OPTIMIZE) $(DEFINES) -s$(STACK)
|
||||
|
||||
LDLIBS += -l$(RELLIB)/lcontrib
|
||||
|
||||
.INCLUDE: /src/gno/binrules.mk
|
||||
|
||||
release: $(PROG) $(PROG).1 $(DESC) whereis.conf
|
||||
$(INSTALL) -d $(RELBIN) $(RELMAN)/man1 $(DESC_DIR) $(RELETC)
|
||||
$(INSTALL) $(PROG) $(RELBIN)
|
||||
$(INSTALL) $(PROG).1 $(RELMAN)/man1
|
||||
$(INSTALL) whereis.conf $(RELETC)
|
||||
$(DESCU) -o $(DESC_SRC) $(DESC_SRC) $(DESC)
|
|
@ -1,39 +0,0 @@
|
|||
# Makefile.mk generated by makedmake (Gno) v1.1.1 for Dennis Vadura's dmake
|
||||
|
||||
BINDIR = 17
|
||||
MANDIR = /usr/man
|
||||
|
||||
# development flags
|
||||
# DEFINES += -DDEBUG -DCASEFLAG
|
||||
# CFLAGS += -w -s1023 -G25 $(DEFINES)
|
||||
# LDFLAGS +=
|
||||
# LDLIBS = /usr/lib/stack.a
|
||||
|
||||
# distribution flags
|
||||
DEFINES += -DCASEFLAG
|
||||
CFLAGS += -w -s1023 -O $(DEFINES)
|
||||
LDFLAGS +=
|
||||
LDLIBS =
|
||||
|
||||
all:
|
||||
echo Targets ...
|
||||
echo
|
||||
echo dmake install ... to copy executable file to $(BINDIR) and manual
|
||||
echo page to $(MANDIR)
|
||||
echo
|
||||
echo dmake whereis ... to compile source code. This should not be
|
||||
echo necessary.
|
||||
|
||||
whereis : whereis.o
|
||||
$(CC) $(LDFLAGS) -o whereis whereis.o $(LDLIBS)
|
||||
|
||||
whereis.o : whereis.c
|
||||
$(CC) $(CFLAGS) -c whereis.c
|
||||
|
||||
install :
|
||||
-$(RM) /usr/bin/whereis
|
||||
-$(RM) 17/whereis
|
||||
/bin/cp -f whereis $(BINDIR)
|
||||
/bin/cp -f whereis.1 $(MANDIR)/man1
|
||||
|
||||
.SILENT: all
|
|
@ -1,5 +1,7 @@
|
|||
.\" @(#)whereis.1 1.17 90/02/15 SMI; from UCB 4.2
|
||||
.TH WHEREIS 1 "Commands and Applications" "2 January 1994" "Orca/Gno Version 1.1"
|
||||
.\"
|
||||
.\" $Id: whereis.1,v 1.2 1997/09/30 04:22:43 gdr Exp $
|
||||
.\"
|
||||
.TH WHEREIS 1 "25 September 1997" GNO "Commands and Applications"
|
||||
.SH NAME
|
||||
whereis \- locate the binary, source, and manual page files for a command
|
||||
.SH SYNOPSIS
|
||||
|
@ -13,6 +15,10 @@ whereis \- locate the binary, source, and manual page files for a command
|
|||
]
|
||||
\fIfilename\fP\|
|
||||
.SH DESCRIPTION
|
||||
This manual page documents
|
||||
.BR whereis
|
||||
version 1.0.3.
|
||||
.LP
|
||||
.B whereis
|
||||
locates source/binary and manuals sections for specified
|
||||
files.
|
||||
|
@ -26,36 +32,28 @@ Prefixes of
|
|||
resulting from use of source code control are also dealt with.
|
||||
.B whereis
|
||||
then attempts to locate the desired program in
|
||||
a list of standard places:
|
||||
.RS
|
||||
.nf
|
||||
/bin
|
||||
/usr/bin
|
||||
/usr/sbin
|
||||
/usr/games
|
||||
/usr/include
|
||||
/usr/hosts
|
||||
/usr/local
|
||||
/usr/local/bin
|
||||
/etc
|
||||
/man (disabled)
|
||||
/usr/man
|
||||
/usr/src/bin
|
||||
/usr/src/etc
|
||||
17/
|
||||
17/help
|
||||
.fi
|
||||
.RE
|
||||
a list of standard places, defined by the
|
||||
.BR /etc/whereis.conf
|
||||
configuration file. (The location of this file can be overridden with the
|
||||
.BR WHEREIS_CONF
|
||||
environment variable.)
|
||||
.SH OPTIONS
|
||||
.B \-b
|
||||
.IP \fB\-b\fR
|
||||
Search only for binaries.
|
||||
.LP
|
||||
.B \-c
|
||||
Make the search case\-insensitive.
|
||||
.LP
|
||||
.B \-f
|
||||
Terminate the last directory list and signals the start of file names,
|
||||
and
|
||||
.IP \fB\-c\fR
|
||||
Make the search case\-sensitive.
|
||||
.sp 1
|
||||
.BR NOTE :
|
||||
In
|
||||
.BR whereis
|
||||
versions 1.2 and earlier, this flag had the opposite effect. As of
|
||||
.BR whereis
|
||||
version 1.3, searches are case insensitive by default since that is more
|
||||
appropriate to the filesystems available to GS/OS.
|
||||
.sp 1
|
||||
This flag is GNO-specific.
|
||||
.IP \fB\-f\fR
|
||||
Terminates the last directory list and signals the start of file names. This
|
||||
.I must
|
||||
be used when any of the
|
||||
.BR \-B ,
|
||||
|
@ -63,38 +61,74 @@ be used when any of the
|
|||
or
|
||||
.B \-S
|
||||
options are used.
|
||||
.LP
|
||||
.B \-m
|
||||
.IP \fB\-m\fR
|
||||
Search only for manual sections.
|
||||
.LP
|
||||
.B \-s
|
||||
.IP \fB\-s\fR
|
||||
Search only for sources.
|
||||
.LP
|
||||
.B \-u
|
||||
.IP \fB\-u\fR
|
||||
Search for unusual entries. A file is said to be unusual if it does
|
||||
not have one entry of each requested type. Therefore
|
||||
.B "whereis -m -u *"
|
||||
asks for those files in the current
|
||||
directory which have no documentation.
|
||||
.LP
|
||||
.B \-B
|
||||
.IP \fB\-B\fR
|
||||
Change or otherwise limit the places where
|
||||
.B whereis
|
||||
searches for binaries.
|
||||
.LP
|
||||
.B \-M
|
||||
.IP \fB\-M\fR
|
||||
Change or otherwise limit the places where
|
||||
.B whereis
|
||||
searches for
|
||||
manual sections.
|
||||
.LP
|
||||
.B \-S
|
||||
.IP \fB\-S\fR
|
||||
Change or otherwise limit the places where
|
||||
.B whereis
|
||||
searches for sources.
|
||||
.LP
|
||||
.B \-V
|
||||
.IP \fB\-V\fR
|
||||
Print version information.
|
||||
.SH "CONFIGURATION FILE"
|
||||
The configuration file,
|
||||
.BR /etc/whereis.conf ,
|
||||
has three sections. Each section specifies a list of directories
|
||||
to search. One section is used for programs, another for documentation,
|
||||
and the last for sources.
|
||||
.LP
|
||||
Each section starts with the section identifier. The recognised identifiers
|
||||
are
|
||||
.BR bindirs ,
|
||||
.BR mandirs ,
|
||||
and
|
||||
.BR srcdirs .
|
||||
A colon (\fB:\fR) must follow each section identifier. Following the
|
||||
colon is a whitespace-delimited list of paths that
|
||||
.BR whereis
|
||||
will search (these may appear on separate lines). The list is terminated
|
||||
with the first semicolon (\fB;\fR) character.
|
||||
.LP
|
||||
The colon and semicolon characters must be delimited with whitespace; they
|
||||
must not be run together with pathnames or identifiers.
|
||||
.LP
|
||||
If the hash (\fB#\fR) character appears on a line, it and any following
|
||||
characters on that line are taken to be comments, as are blank lines.
|
||||
.LP
|
||||
The following is a sample of how the
|
||||
.BR whereis.conf
|
||||
may look.
|
||||
.RS
|
||||
.nf
|
||||
# Sample whereis.conf file.
|
||||
bindirs :
|
||||
/bin
|
||||
/usr/bin ;
|
||||
mandirs :
|
||||
/usr/man/man1
|
||||
/usr/local/man/man1
|
||||
;
|
||||
srcdirs :
|
||||
# none configured here
|
||||
;
|
||||
.fi
|
||||
.RE
|
||||
.SH EXAMPLE
|
||||
Find all files in
|
||||
.B /usr/bin
|
||||
|
@ -110,20 +144,24 @@ example% cd /usr/ucb
|
|||
example% whereis \-u \-M /usr/share/man/man1 \-S /usr/src/cmd \-f *
|
||||
.fi
|
||||
.RE
|
||||
.SH ENVIRONMENT
|
||||
.IP \fBWHEREIS_CONF\fR
|
||||
If this environment variable is set and non-empty, it is taken as the
|
||||
pathname of the configuration file, rather than using the default
|
||||
.BR /etc/whereis.conf .
|
||||
.SH ATTRIBUTIONS
|
||||
This command was ported from 4.2BSD by Devin Reade.
|
||||
.SH FILES
|
||||
.nf
|
||||
/usr/src/*
|
||||
/usr/{doc,man}/*
|
||||
/usr/{lib,bin,ucb,old,new,local}
|
||||
/etc
|
||||
.fi
|
||||
.SH SEE ALSO
|
||||
.BR chdir (2V)
|
||||
.IP \fB/etc/whereis.conf\fR
|
||||
The
|
||||
.BR whereis
|
||||
configuration file. It contains a list of directories to search for
|
||||
programs, documentation, and sources.
|
||||
.SH BUGS
|
||||
Since
|
||||
.B whereis
|
||||
uses
|
||||
.BR chdir (2V)
|
||||
.BR chdir (2)
|
||||
to run faster, pathnames given with the
|
||||
.BR \-M ,
|
||||
.BR \-S ,
|
||||
|
@ -131,3 +169,7 @@ or
|
|||
.B \-B
|
||||
must be full; that is, they must begin with a
|
||||
.BR / .
|
||||
.SH SEE ALSO
|
||||
.BR find (1),
|
||||
.BR locate (1),
|
||||
.BR chdir (2)
|
||||
|
|
|
@ -1,6 +1,3 @@
|
|||
#ifdef __CCFRONT__
|
||||
#include <14:pragma.h>
|
||||
#endif
|
||||
/*-
|
||||
* Copyright (c) 1980 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
|
@ -32,177 +29,53 @@
|
|||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: whereis.c,v 1.3 1997/09/30 04:22:43 gdr Exp $
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
#if !defined(lint) && !defined(__GNO__)
|
||||
char copyright[] =
|
||||
"@(#) Copyright (c) 1980 The Regents of the University of California.\n\
|
||||
All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)whereis.c 5.5 (Berkeley) 4/18/91";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <libc.h>
|
||||
#include <err.h>
|
||||
#include <assert.h>
|
||||
#include <gno/contrib.h>
|
||||
|
||||
#define LINEBUF_SIZE 128 /* max size of conf line */
|
||||
#define CONF_PATH "/etc/whereis.conf" /* default path */
|
||||
#define CONF_ENV "WHEREIS_CONF" /* name of environ variable */
|
||||
|
||||
#define PROWORD_BIN "bindirs" /* keyword in whereis.conf */
|
||||
#define PROWORD_MAN "mandirs" /* keyword in whereis.conf */
|
||||
#define PROWORD_SRC "srcdirs" /* keyword in whereis.conf */
|
||||
|
||||
/*
|
||||
* Pointers that will correspond to the GNO_* or ORCA_* structs, below
|
||||
* These string arrays will hold the paths that we want to check, as
|
||||
* defined in the whereis.conf file.
|
||||
*/
|
||||
|
||||
static char **bindirs;
|
||||
static char **mandirs;
|
||||
static char **srcdirs;
|
||||
LC_StringArray_t Sbindirs = NULL;
|
||||
LC_StringArray_t Smandirs = NULL;
|
||||
LC_StringArray_t Ssrcdirs = NULL;
|
||||
|
||||
/*
|
||||
* These are the directories to check when running under the Gno shell
|
||||
*/
|
||||
|
||||
static char *GNO_bindirs[] = {
|
||||
"/bin",
|
||||
"/usr/bin",
|
||||
"/usr/sbin",
|
||||
"/usr/games",
|
||||
"/usr/include",
|
||||
"/usr/hosts",
|
||||
"/usr/local",
|
||||
"/usr/local/bin",
|
||||
"17",
|
||||
"/etc",
|
||||
0
|
||||
};
|
||||
/* This needs to be redone - man pages live with sources */
|
||||
static char *GNO_mandirs[] = {
|
||||
|
||||
/*
|
||||
These are disabled since /man is not usually present; this eliminates
|
||||
a long series of accesses to the 3.5" drive.
|
||||
|
||||
"/man/man1",
|
||||
"/man/man2",
|
||||
"/man/man3",
|
||||
"/man/man4",
|
||||
"/man/man5",
|
||||
"/man/man6",
|
||||
"/man/man7",
|
||||
"/man/man8",
|
||||
"/man/cat1",
|
||||
"/man/cat2",
|
||||
"/man/cat3",
|
||||
"/man/cat4",
|
||||
"/man/cat5",
|
||||
"/man/cat6",
|
||||
"/man/cat7",
|
||||
"/man/cat8",
|
||||
*/
|
||||
|
||||
"/usr/man/cat1",
|
||||
"/usr/man/cat2",
|
||||
"/usr/man/cat3",
|
||||
"/usr/man/cat4",
|
||||
"/usr/man/cat5",
|
||||
"/usr/man/cat6",
|
||||
"/usr/man/cat7",
|
||||
"/usr/man/cat8",
|
||||
"/usr/man/man1",
|
||||
"/usr/man/man2",
|
||||
"/usr/man/man3",
|
||||
"/usr/man/man4",
|
||||
"/usr/man/man5",
|
||||
"/usr/man/man6",
|
||||
"/usr/man/man7",
|
||||
"/usr/man/man8",
|
||||
"17/help",
|
||||
0
|
||||
};
|
||||
static char *GNO_srcdirs[] = {
|
||||
"/usr/src/bin",
|
||||
"/usr/src/etc",
|
||||
/* still need libs */
|
||||
0
|
||||
};
|
||||
|
||||
/*
|
||||
* These are the directories to check when running under the Orca shell
|
||||
*/
|
||||
|
||||
static char *ORCA_bindirs[] = {
|
||||
"31/bin",
|
||||
"31/usr/bin",
|
||||
"31/usr/sbin",
|
||||
"31/usr/games",
|
||||
"31/usr/include",
|
||||
"31/usr/hosts",
|
||||
"31/usr/local",
|
||||
"31/usr/local/bin",
|
||||
"17",
|
||||
"31/etc",
|
||||
0
|
||||
};
|
||||
/* This needs to be redone - man pages live with sources */
|
||||
static char *ORCA_mandirs[] = {
|
||||
|
||||
/*
|
||||
These are disabled since /man is not usually present; this eliminates
|
||||
a long series of accesses to the 3.5" drive.
|
||||
|
||||
"31/man/man1",
|
||||
"31/man/man2",
|
||||
"31/man/man3",
|
||||
"31/man/man4",
|
||||
"31/man/man5",
|
||||
"31/man/man6",
|
||||
"31/man/man7",
|
||||
"31/man/man8",
|
||||
"31/man/cat1",
|
||||
"31/man/cat2",
|
||||
"31/man/cat3",
|
||||
"31/man/cat4",
|
||||
"31/man/cat5",
|
||||
"31/man/cat6",
|
||||
"31/man/cat7",
|
||||
"31/man/cat8",
|
||||
*/
|
||||
|
||||
"31/usr/man/cat1",
|
||||
"31/usr/man/cat2",
|
||||
"31/usr/man/cat3",
|
||||
"31/usr/man/cat4",
|
||||
"31/usr/man/cat5",
|
||||
"31/usr/man/cat6",
|
||||
"31/usr/man/cat7",
|
||||
"31/usr/man/cat8",
|
||||
"31/usr/man/man1",
|
||||
"31/usr/man/man2",
|
||||
"31/usr/man/man3",
|
||||
"31/usr/man/man4",
|
||||
"31/usr/man/man5",
|
||||
"31/usr/man/man6",
|
||||
"31/usr/man/man7",
|
||||
"31/usr/man/man8",
|
||||
"17/help",
|
||||
0
|
||||
};
|
||||
static char *ORCA_srcdirs[] = {
|
||||
"31/usr/src/bin",
|
||||
"31/usr/src/etc",
|
||||
/* still need libs */
|
||||
0
|
||||
};
|
||||
|
||||
|
||||
#ifdef CASEFLAG
|
||||
int cflag = 0;
|
||||
#endif
|
||||
/* pointers to the vectors in the above string arrays; legacy code */
|
||||
char **bindirs;
|
||||
char **mandirs;
|
||||
char **srcdirs;
|
||||
|
||||
int cflag = 1;
|
||||
char sflag = 1;
|
||||
char bflag = 1;
|
||||
char mflag = 1;
|
||||
|
@ -214,65 +87,120 @@ char **Mflag;
|
|||
int Mcnt;
|
||||
char uflag;
|
||||
|
||||
char *verstring = "whereis -- Apple IIgs Version 1.2";
|
||||
char *verstring = "whereis version 1.3";
|
||||
|
||||
void getlist (int *argcp, char ***argvp, char ***flagp, int *cntp);
|
||||
void zerof(void);
|
||||
void lookup (register char *cp);
|
||||
void looksrc (char *cp);
|
||||
void lookbin (char *cp);
|
||||
void lookman (char *cp);
|
||||
void findv (char **dirv, int dirc, char *cp);
|
||||
void find (char **dirs, char *cp);
|
||||
void findin (char *dir, char *cp);
|
||||
int itsit (register char *cp, register char *dp);
|
||||
void getlist (int *argcp, char ***argvp, char ***flagp, int *cntp);
|
||||
void zerof(void);
|
||||
void lookup (register char *cp);
|
||||
void findin (char *dir, char *cp);
|
||||
int itsit (register char *cp, register char *dp);
|
||||
void getDirectories (void);
|
||||
void addIdent (int ident, char *path);
|
||||
|
||||
#ifdef DEBUG
|
||||
void begin_stack_check(void);
|
||||
int end_stack_check(void);
|
||||
/*
|
||||
* If INLINE_FUNCS is defined, we use macro versions of some very
|
||||
* short routines. Unfortunately, ORCA/C v2.1.x doesn't have the
|
||||
* ability to do this itself.
|
||||
*/
|
||||
#define INLINE_FUNCS
|
||||
|
||||
#ifdef INLINE_FUNCS
|
||||
#define find(dirs, cp) \
|
||||
{ \
|
||||
char **ldirs = dirs; \
|
||||
while (*ldirs) { \
|
||||
findin(*ldirs++, cp); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define findv(dirv, dirc, cp) \
|
||||
{ \
|
||||
char **ldirv = dirv; \
|
||||
int ldirc = dirc; \
|
||||
while (ldirc > 0) { \
|
||||
findin(*ldirv++, cp); \
|
||||
dirc--; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define looksrc(cp) \
|
||||
{ \
|
||||
if (Sflag == 0) { \
|
||||
find(srcdirs, cp); \
|
||||
} else { \
|
||||
findv(Sflag, Scnt, cp); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define lookbin(cp) \
|
||||
{ \
|
||||
if (Bflag == 0) { \
|
||||
find(bindirs, cp); \
|
||||
} else { \
|
||||
findv(Bflag, Bcnt, cp); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define lookman(cp) \
|
||||
{ \
|
||||
if (Mflag == 0) { \
|
||||
find(mandirs, cp); \
|
||||
} else { \
|
||||
findv(Mflag, Mcnt, cp); \
|
||||
} \
|
||||
}
|
||||
|
||||
#else
|
||||
void looksrc (char *cp);
|
||||
void lookbin (char *cp);
|
||||
void lookman (char *cp);
|
||||
void find (char **dirs, char *cp);
|
||||
void findv (char **dirv, int dirc, char *cp);
|
||||
#endif
|
||||
|
||||
#if defined(__GNO__) && defined(__STACK_CHECK__)
|
||||
#include <gno/gno.h>
|
||||
static void
|
||||
stackResults(void) {
|
||||
fprintf(stderr, "stack usage:\t ===> %d bytes <===\n",
|
||||
_endStackCheck());
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* whereis name
|
||||
* look for source, documentation and binaries
|
||||
*/
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int
|
||||
main(int argc, char **argv) {
|
||||
|
||||
#ifdef DEBUG
|
||||
begin_stack_check();
|
||||
#ifdef __STACK_CHECK__
|
||||
_beginStackCheck();
|
||||
atexit(stackResults);
|
||||
#endif
|
||||
|
||||
/* quick usage check */
|
||||
argc--, argv++;
|
||||
if (argc == 0) {
|
||||
usage:
|
||||
|
||||
#ifdef CASEFLAG
|
||||
fprintf(stderr, "whereis [ -sbmucV ] [ -SBM dir ... -f ] name...\n");
|
||||
#else /* not CASEFLAG */
|
||||
fprintf(stderr, "whereis [ -sbmuV ] [ -SBM dir ... -f ] name...\n");
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
if (getenv("CHECKSTACK"))
|
||||
printf("Stack Usage: %d\n",end_stack_check());
|
||||
#endif
|
||||
|
||||
fprintf(stderr,
|
||||
"whereis [ -sbmucV ] [ -SBM dir ... -f ] name...\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* select which directory structures we're going to use */
|
||||
if (needsgno()) {
|
||||
bindirs = GNO_bindirs;
|
||||
mandirs = GNO_mandirs;
|
||||
srcdirs = GNO_srcdirs;
|
||||
} else {
|
||||
bindirs = ORCA_bindirs;
|
||||
mandirs = ORCA_mandirs;
|
||||
srcdirs = ORCA_srcdirs;
|
||||
}
|
||||
/* initialize string arrays */
|
||||
Sbindirs = LC_StringArrayNew();
|
||||
Smandirs = LC_StringArrayNew();
|
||||
Ssrcdirs = LC_StringArrayNew();
|
||||
|
||||
do
|
||||
/* get the list of directories where we will look */
|
||||
getDirectories();
|
||||
|
||||
bindirs = Sbindirs->lc_vec;
|
||||
mandirs = Smandirs->lc_vec;
|
||||
srcdirs = Ssrcdirs->lc_vec;
|
||||
|
||||
do {
|
||||
if (argv[0][0] == '-') {
|
||||
register char *cp = argv[0] + 1;
|
||||
while (*cp) switch (*cp++) {
|
||||
|
@ -311,30 +239,24 @@ usage:
|
|||
mflag++;
|
||||
continue;
|
||||
|
||||
#ifdef CASEFLAG
|
||||
case 'c':
|
||||
cflag++;
|
||||
continue;
|
||||
#endif /* not CASEFLAG */
|
||||
cflag = 0;
|
||||
continue;
|
||||
|
||||
case 'V':
|
||||
printf("%s\n",verstring);
|
||||
continue;
|
||||
printf("%s\n",verstring);
|
||||
continue;
|
||||
|
||||
default:
|
||||
goto usage;
|
||||
}
|
||||
argv++;
|
||||
} else
|
||||
} else {
|
||||
lookup(*argv++);
|
||||
while (--argc > 0);
|
||||
}
|
||||
} while (--argc > 0);
|
||||
|
||||
#ifdef DEBUG
|
||||
if (getenv("CHECKSTACK"))
|
||||
printf("Stack Usage: %d\n",end_stack_check());
|
||||
#endif
|
||||
|
||||
exit(0);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void getlist (int *argcp, char ***argvp, char ***flagp, int *cntp) {
|
||||
|
@ -407,6 +329,8 @@ again:
|
|||
printf("\n");
|
||||
}
|
||||
|
||||
#ifndef INLINE_FUNCS
|
||||
|
||||
void looksrc (char *cp) {
|
||||
if (Sflag == 0) {
|
||||
find(srcdirs, cp);
|
||||
|
@ -421,7 +345,7 @@ void lookbin (char *cp) {
|
|||
findv(Bflag, Bcnt, cp);
|
||||
}
|
||||
|
||||
void lookman (char *cp) {
|
||||
void lookman (char *cp) {
|
||||
if (Mflag == 0) {
|
||||
find(mandirs, cp);
|
||||
} else
|
||||
|
@ -429,8 +353,10 @@ void lookman (char *cp) {
|
|||
}
|
||||
|
||||
void findv (char **dirv, int dirc, char *cp) {
|
||||
while (dirc > 0)
|
||||
findin(*dirv++, cp), dirc--;
|
||||
while (dirc > 0) {
|
||||
findin(*dirv++, cp);
|
||||
dirc--;
|
||||
}
|
||||
}
|
||||
|
||||
void find (char **dirs, char *cp) {
|
||||
|
@ -438,6 +364,8 @@ void find (char **dirs, char *cp) {
|
|||
findin(*dirs++, cp);
|
||||
}
|
||||
|
||||
#endif /* ! INLINE_FUNCS */
|
||||
|
||||
void findin (char *dir, char *cp) {
|
||||
DIR *dirp;
|
||||
struct dirent *dp;
|
||||
|
@ -455,14 +383,12 @@ void findin (char *dir, char *cp) {
|
|||
closedir(dirp);
|
||||
}
|
||||
|
||||
|
||||
#ifdef CASEFLAG
|
||||
|
||||
int itsit (register char *cp, register char *dp) {
|
||||
register int i = strlen(dp);
|
||||
|
||||
if (cflag) {
|
||||
if ( (dp[0] == 's' || dp[0] == 'S') && dp[1] == '.' && itsit(cp, dp+2))
|
||||
if (cflag) {
|
||||
if ( (dp[0] == 's' || dp[0] == 'S')
|
||||
&& dp[1] == '.' && itsit(cp, dp+2))
|
||||
return (1);
|
||||
while (*cp && *dp && (tolower(*cp) == tolower(*dp)))
|
||||
cp++, dp++, i--;
|
||||
|
@ -471,12 +397,13 @@ int itsit (register char *cp, register char *dp) {
|
|||
while (isdigit(*dp))
|
||||
dp++;
|
||||
if (*cp == 0 && *dp++ == '.') {
|
||||
/* removed for GNO, because we want to look up compressed files also. */
|
||||
#ifndef __GNO__
|
||||
--i;
|
||||
/* removed for GNO/ME, cause we want to look up compressed files also. */
|
||||
/* while (i > 0 && *dp)
|
||||
while (i > 0 && *dp)
|
||||
if (--i, *dp++ == '.')
|
||||
return (*dp++ == 'C' && *dp++ == 0);
|
||||
*/
|
||||
#endif
|
||||
return (1);
|
||||
}
|
||||
} else {
|
||||
|
@ -489,40 +416,125 @@ int itsit (register char *cp, register char *dp) {
|
|||
while (isdigit(*dp))
|
||||
dp++;
|
||||
if (*cp == 0 && *dp++ == '.') {
|
||||
/* removed for GNO, because we want to look up compressed files also. */
|
||||
#ifndef __GNO__
|
||||
--i;
|
||||
/* removed for GNO/ME, cause we want to look up compressed files also. */
|
||||
/* while (i > 0 && *dp)
|
||||
while (i > 0 && *dp)
|
||||
if (--i, *dp++ == '.')
|
||||
return (*dp++ == 'C' && *dp++ == 0);
|
||||
*/
|
||||
#endif
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
#else /* not CASEFLAG */
|
||||
/*
|
||||
* addDirectories
|
||||
* Parse the configuration file and determine in what directories
|
||||
* we're supposed to be looking.
|
||||
*/
|
||||
|
||||
int itsit (register char *cp, register char *dp) {
|
||||
register int i = strlen(dp);
|
||||
char linebuf[LINEBUF_SIZE];
|
||||
|
||||
if (dp[0] == 's' && dp[1] == '.' && itsit(cp, dp+2))
|
||||
return (1);
|
||||
while (*cp && *dp && *cp == *dp)
|
||||
cp++, dp++, i--;
|
||||
if (*cp == 0 && *dp == 0)
|
||||
return (1);
|
||||
while (isdigit(*dp))
|
||||
dp++;
|
||||
if (*cp == 0 && *dp++ == '.') {
|
||||
--i;
|
||||
/* removed for GNO/ME, cause we want to look up compressed files also. */
|
||||
/* while (i > 0 && *dp)
|
||||
if (--i, *dp++ == '.')
|
||||
return (*dp++ == 'C' && *dp++ == 0);*/
|
||||
return (1);
|
||||
#define STATE_AT_FILE 1
|
||||
#define STATE_SAW_ID 2
|
||||
#define STATE_SAW_COLON 3
|
||||
#define STATE_SAW_PATHS 4
|
||||
|
||||
#define IDENT_BIN 1
|
||||
#define IDENT_MAN 2
|
||||
#define IDENT_SRC 3
|
||||
|
||||
void
|
||||
getDirectories (void) {
|
||||
char *confpath, *p;
|
||||
FILE *fp;
|
||||
int state, line, ident;
|
||||
|
||||
if (((confpath = getenv(CONF_ENV)) == NULL) ||
|
||||
(*confpath == '\0')) {
|
||||
confpath = CONF_PATH;
|
||||
}
|
||||
return (0);
|
||||
if ((fp = fopen(confpath, "r")) == NULL) {
|
||||
err(1, "couldn't open config file %s", confpath);
|
||||
}
|
||||
state = STATE_AT_FILE;
|
||||
line = 0;
|
||||
while (fgets (linebuf, LINEBUF_SIZE, fp) != NULL) {
|
||||
|
||||
/* increment the line count */
|
||||
line++;
|
||||
|
||||
/* delete any comments */
|
||||
if ((p = strchr(linebuf, '#')) != NULL) {
|
||||
*p = '\0';
|
||||
}
|
||||
|
||||
/* parse each word */
|
||||
if ((p = strtok(linebuf, " \t\r\n\v")) == NULL) {
|
||||
continue;
|
||||
}
|
||||
do {
|
||||
switch(state) {
|
||||
case STATE_AT_FILE:
|
||||
if (!strcmp(p, PROWORD_BIN)) {
|
||||
state = STATE_SAW_ID;
|
||||
ident = IDENT_BIN;
|
||||
} else if (!strcmp(p, PROWORD_MAN)) {
|
||||
state = STATE_SAW_ID;
|
||||
ident = IDENT_MAN;
|
||||
} else if (!strcmp(p, PROWORD_SRC)) {
|
||||
state = STATE_SAW_ID;
|
||||
ident = IDENT_SRC;
|
||||
} else {
|
||||
errx(1,
|
||||
"%s: line %d: identifier expected",
|
||||
confpath, line);
|
||||
}
|
||||
break;
|
||||
case STATE_SAW_ID:
|
||||
if ((*p != ':') || (*(p+1) != '\0')) {
|
||||
errx(1, "%s: line %d: expected ':'",
|
||||
confpath, line);
|
||||
}
|
||||
state = STATE_SAW_COLON;
|
||||
break;
|
||||
case STATE_SAW_COLON:
|
||||
if ((*p == ';') && (*(p+1) == '\0')) {
|
||||
state = STATE_AT_FILE;
|
||||
} else {
|
||||
addIdent(ident, p);
|
||||
}
|
||||
break;
|
||||
case STATE_SAW_PATHS:
|
||||
break;
|
||||
default: assert(0);
|
||||
}
|
||||
} while ((p = strtok(NULL, NULL)) != NULL);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
#endif
|
||||
/*
|
||||
* addIdent
|
||||
* Add an entry to the bindirs, mandirs, or srcdirs arrays, as
|
||||
* appropriate.
|
||||
*/
|
||||
void addIdent (int ident, char *path) {
|
||||
char ***dirptr;
|
||||
|
||||
switch(ident) {
|
||||
case IDENT_BIN:
|
||||
LC_StringArrayAdd(Sbindirs, path);
|
||||
break;
|
||||
case IDENT_MAN:
|
||||
LC_StringArrayAdd(Smandirs, path);
|
||||
break;
|
||||
case IDENT_SRC:
|
||||
LC_StringArrayAdd(Ssrcdirs, path);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
#
|
||||
# /etc/whereis.conf
|
||||
#
|
||||
# This file controls where whereis(1) will look for files. See the
|
||||
# whereis(1) man page for details.
|
||||
#
|
||||
# NOTES:
|
||||
# 1. The whitespace around the ':' and ';' characters is absolutely
|
||||
# essential.
|
||||
# 2. The maximum recognised line length is 128 characters.
|
||||
#
|
||||
# Devin Reade, September 1997
|
||||
#
|
||||
# $Id: whereis.conf,v 1.1 1997/09/30 04:22:43 gdr Exp $
|
||||
#
|
||||
|
||||
bindirs :
|
||||
/bin
|
||||
/usr/bin
|
||||
/usr/sbin
|
||||
/usr/games
|
||||
/usr/include
|
||||
/usr/hosts
|
||||
/usr/local
|
||||
/usr/local/bin
|
||||
17
|
||||
/etc
|
||||
;
|
||||
|
||||
mandirs :
|
||||
/usr/man/cat1
|
||||
/usr/man/cat2
|
||||
/usr/man/cat3
|
||||
/usr/man/cat4
|
||||
/usr/man/cat5
|
||||
/usr/man/cat6
|
||||
/usr/man/cat7
|
||||
/usr/man/cat8
|
||||
/usr/man/man1
|
||||
/usr/man/man2
|
||||
/usr/man/man3
|
||||
/usr/man/man4
|
||||
/usr/man/man5
|
||||
/usr/man/man6
|
||||
/usr/man/man7
|
||||
/usr/man/man8
|
||||
/usr/local/man/cat1 # Most will likely only use these four dirs
|
||||
/usr/local/man/cat8
|
||||
/usr/local/man/man1
|
||||
/usr/local/man/man8
|
||||
17/help # ORCA help files
|
||||
;
|
||||
|
||||
srcdirs :
|
||||
# /usr/src/bin
|
||||
# /usr/src/etc
|
||||
;
|
|
@ -0,0 +1,10 @@
|
|||
Name: whereis
|
||||
Version: v1.3 (25 Sep 97)
|
||||
Shell: GNO
|
||||
Author: Modified from BSD code by Devin Reade
|
||||
Contact: gdr@eddore.myrias.com
|
||||
Where: /usr/bin
|
||||
FTP: apple2.caltech.edu ground.isca.uiowa.edu trenco.myrias.com
|
||||
|
||||
whereis searches certain directories (/bin, /usr/bin, /usr/man, et cetera)
|
||||
and reports the location of source, executables, and man pages.
|
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
* $Id: whereis.rez,v 1.1 1997/09/30 04:22:43 gdr Exp $
|
||||
*/
|
||||
|
||||
#include "Types.Rez"
|
||||
|
||||
resource rVersion (0x1, purgeable3, nocrossbank) {
|
||||
|
||||
{ 1, 3, 0, /* version 1.3.0 */
|
||||
release, /* development|alpha|beta|final|release */
|
||||
0 /* non-final release number */
|
||||
},
|
||||
verUS,
|
||||
"whereis",
|
||||
"searches standard directories for a file\n"
|
||||
"Author: Devin Reade <gdr@myrias.com>"
|
||||
};
|
Loading…
Reference in New Issue