From: stux Date: Fri, 11 Jul 2014 15:59:23 +0000 (-0500) Subject: Import NetBSD which and whereis commands. X-Git-Tag: v3.3.0~131 X-Git-Url: http://zhaoyanbai.com/repos/%22http:/www.isc.org/icons/zlib_tech.html?a=commitdiff_plain;h=d24fd34cdf396cf9f2e212b219d2484c791864b2;p=minix.git Import NetBSD which and whereis commands. Change-Id: Ide31b4cc52c64cbd424437f649674a460fb0a754 --- diff --git a/commands/Makefile b/commands/Makefile index 2c499e647..282c78d81 100644 --- a/commands/Makefile +++ b/commands/Makefile @@ -29,7 +29,7 @@ SUBDIR= add_route arp ash at backup btrace \ telnetd term termcap tget time \ truncate udpstat umount \ unstack update uud uue version vol \ - whereis which writeisofs fetch \ + writeisofs fetch \ zdump zmodem pkgin_cd pkgin_all \ worldstone updateboot update_bootcfg \ atnormalize dosread fdisk loadfont \ diff --git a/commands/whereis/Makefile b/commands/whereis/Makefile deleted file mode 100644 index 3b7bd9539..000000000 --- a/commands/whereis/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -SCRIPTS= whereis.sh -MAN= - -.include diff --git a/commands/whereis/whereis.sh b/commands/whereis/whereis.sh deleted file mode 100644 index 2dfe0c52e..000000000 --- a/commands/whereis/whereis.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh -: List all system directories containing the argument -: Author: Terrence W. Holm -if test $# -ne 1; then - echo "Usage: whereis name" - exit 1 -fi - -path="/bin /lib /etc\ - /usr/bin /usr/lib\ - /usr/include /usr/include/sys" - -for dir in $path; do - for file in $dir/$1 $dir/$1.*; do - if test -f $file; then - echo $file - elif test -d $file; then - echo $file/ - fi - done - done - -exit 0 diff --git a/commands/which/Makefile b/commands/which/Makefile deleted file mode 100644 index 97778e66a..000000000 --- a/commands/which/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -PROG= which -MAN= - -.include diff --git a/commands/which/which.c b/commands/which/which.c deleted file mode 100644 index 7326a54f8..000000000 --- a/commands/which/which.c +++ /dev/null @@ -1,86 +0,0 @@ -/* which - search paths for executable */ - -#define DELIMITER ':' - -#include -#include -#include -#include -#include - -int main(int argc, char **argv); - -int main(ac, av) -int ac; -char **av; -{ - char *path, *cp; - char buf[400]; - char prog[400]; - char patbuf[512]; - int quit, none; - int excode = 0; - - if (ac < 2) { - fprintf(stderr, "Usage: %s cmd [cmd, ..]\n", *av); - exit(1); - } - av[ac] = 0; - for (av++; *av; av++) { - - quit = 0; - none = 1; - if ((path = getenv("PATH")) == NULL) { - fprintf(stderr, "Null path.\n"); - exit(0); - } - strcpy(patbuf, path); - path = patbuf; - cp = path; - - while (1) { - cp = strchr(path, DELIMITER); - if (cp == NULL) - quit++; - else - *cp = '\0'; - - if (strcmp(path, "") == 0 && quit == 0) { - sprintf(buf, "%s./%s", path, *av); - } else - sprintf(buf, "%s/%s", path, *av); - - /* Fprintf(stderr,"Trying %s, path %s\n",buf,path); */ - - path = ++cp; - - if (access(buf, 1) == 0) { - printf("%s\n", buf); - none = 0; - } - sprintf(prog, "%s.%s", buf, "prg"); - if (access(prog, 1) == 0) { - printf("%s\n", prog); - none = 0; - } - sprintf(prog, "%s.%s", buf, "ttp"); - if (access(prog, 1) == 0) { - printf("%s\n", prog); - none = 0; - } - sprintf(prog, "%s.%s", buf, "tos"); - if (access(prog, 1) == 0) { - printf("%s\n", prog); - none = 0; - } - if (quit) { - if (none) { - fprintf(stderr, "No %s in %s\n", *av, getenv("PATH")); - excode = 1; - } - break; - } - } - } - return(excode); -} diff --git a/man/man1/Makefile b/man/man1/Makefile index 855844015..d7eee4764 100644 --- a/man/man1/Makefile +++ b/man/man1/Makefile @@ -19,7 +19,7 @@ MAN= ash.1 at.1 \ synctree.1 sysenv.1 sz.1 telnet.1 template.1 \ term.1 termcap.1 tget.1 time.1 \ truncate.1 umount.1 \ - uud.1 uue.1 vol.1 whereis.1 which.1 \ + uud.1 uue.1 vol.1 \ yap.1 linkfarm.1 pkg_view.1 MLINKS += ash.1 sh.1 diff --git a/man/man1/whereis.1 b/man/man1/whereis.1 deleted file mode 100644 index bd9c8edef..000000000 --- a/man/man1/whereis.1 +++ /dev/null @@ -1,28 +0,0 @@ -.TH WHEREIS 1 -.SH NAME -whereis \- examine system directories for a given file -.SH SYNOPSIS -\fBwhereis \fIfile\fR -.br -.de FL -.TP -\\fB\\$1\\fR -\\$2 -.. -.de EX -.TP 20 -\\fB\\$1\\fR -# \\$2 -.. -.SH EXAMPLES -.TP 20 -.B whereis stat.h -# Prints: \fI/usr/include/sys/stat.h\fR -.SH DESCRIPTION -.PP -\fIWhereis\fR searches a fixed set of system -directories, \fI/bin\fR, \fI/lib\fR, \fI/usr/bin\fR, -and others, and prints all occurrences of the argument name in any of them. -.SH "SEE ALSO" -.BR man (1), -.BR which (1). diff --git a/man/man1/which.1 b/man/man1/which.1 deleted file mode 100644 index 7801afc99..000000000 --- a/man/man1/which.1 +++ /dev/null @@ -1,34 +0,0 @@ -.TH WHICH 1 -.SH NAME -which \- examine $PATH to see which file will be executed -.SH SYNOPSIS -\fBwhich \fIname\fR -.br -.de FL -.TP -\\fB\\$1\\fR -\\$2 -.. -.de EX -.TP 20 -\\fB\\$1\\fR -# \\$2 -.. -.SH EXAMPLES -.TP 20 -.B which a.out -# Tells which \fIa.out\fR will be executed -.SH DESCRIPTION -.PP -The $PATH shell variable controls the -\s-1MINIX 3\s-1 -search rules. -If a command \fIa.out\fR is given, the shell first tries to find an -executable file in the working directory. -If that fails, it looks in various system directories, such as -\fI/bin\fR and \fI/usr/bin\fR. -The\fR which\fR command makes the same search and gives the absolute -path of the program that will be chosen, followed by other occurrences -of the file name along the path. -.SH "SEE ALSO" -.BR man (1). diff --git a/usr.bin/Makefile b/usr.bin/Makefile index 377f04e60..5079b4539 100644 --- a/usr.bin/Makefile +++ b/usr.bin/Makefile @@ -30,7 +30,7 @@ SUBDIR= asa \ uniq units unvis unzip users \ uuidgen vis \ \ - wall wc what who whois \ + wall wc what whereis who whois \ write xargs xinstall xstr yes .if !defined(__MINIX) diff --git a/usr.bin/whereis/Makefile b/usr.bin/whereis/Makefile new file mode 100644 index 000000000..b90b83e13 --- /dev/null +++ b/usr.bin/whereis/Makefile @@ -0,0 +1,8 @@ +# $NetBSD: Makefile,v 1.6 2009/04/14 22:15:28 lukem Exp $ +# from: @(#)Makefile 8.1 (Berkeley) 6/6/93 + +PROG= whereis +MAN= whereis.1 which.1 +LINKS= ${BINDIR}/whereis ${BINDIR}/which + +.include diff --git a/usr.bin/whereis/whereis.1 b/usr.bin/whereis/whereis.1 new file mode 100644 index 000000000..ed7d0ae48 --- /dev/null +++ b/usr.bin/whereis/whereis.1 @@ -0,0 +1,77 @@ +.\" $NetBSD: whereis.1,v 1.14 2003/08/07 11:17:17 agc Exp $ +.\" +.\" Copyright (c) 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" 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. +.\" +.\" @(#)whereis.1 8.3 (Berkeley) 4/27/95 +.\" +.Dd April 3, 2003 +.Dt WHEREIS 1 +.Os +.Sh NAME +.Nm whereis +.Nd locate programs +.Sh SYNOPSIS +.Nm +.Op Fl p +.Ar program +.Op Ar program ... +.Sh DESCRIPTION +The +.Nm +utility checks the standard binary directories for the specified programs, +printing out the paths of any it finds. +.Pp +The default path searched is the string returned by the +.Xr sysctl 8 +utility for the +.Dq user.cs_path +string. +If the +.Op Fl p +option is specified, then the value of the environment +variable +.Ev PATH +is used instead. +.Sh EXIT STATUS +The +.Nm +utility exits 0 on success, 1 on general error, 2 if only some +programs were located and 3 if none were. +.Sh SEE ALSO +.Xr whatis 1 , +.Xr which 1 , +.Xr sysctl 8 +.Sh COMPATIBILITY +The historic flags and arguments for the +.Nm +utility are no longer available in this version. +.Sh HISTORY +The +.Nm +command appeared in +.Bx 3.0 . diff --git a/usr.bin/whereis/whereis.c b/usr.bin/whereis/whereis.c new file mode 100644 index 000000000..fd4036efe --- /dev/null +++ b/usr.bin/whereis/whereis.c @@ -0,0 +1,180 @@ +/* $NetBSD: whereis.c,v 1.21 2008/10/17 10:53:26 apb Exp $ */ + +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * 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. + */ + +#include +#ifndef lint +__COPYRIGHT("@(#) Copyright (c) 1993\ + The Regents of the University of California. All rights reserved."); +#endif /* not lint */ + +#ifndef lint +#if 0 +static char sccsid[] = "@(#)whereis.c 8.3 (Berkeley) 5/4/95"; +#endif +__RCSID("$NetBSD: whereis.c,v 1.21 2008/10/17 10:53:26 apb Exp $"); +#endif /* not lint */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +static void usage(void) __dead; + +int +main(int argc, char *argv[]) +{ + struct stat sb; + size_t len; +#ifdef __minix + int ch; +#else + int ch, mib[2]; +#endif /* def __minix */ + char *p, *std, path[MAXPATHLEN]; + const char *t; + int which = strcmp(getprogname(), "which") == 0; + int useenvpath = which, found = 0; + gid_t egid = getegid(); + uid_t euid = geteuid(); + + /* To make access(2) do what we want */ + if (setgid(egid) == -1) + err(1, "Can't set gid to %lu", (unsigned long)egid); + if (setuid(euid) == -1) + err(1, "Can't set uid to %lu", (unsigned long)euid); + + while ((ch = getopt(argc, argv, "ap")) != -1) + switch (ch) { + case 'a': + which = 0; + break; + case 'p': + useenvpath = 1; /* use environment for PATH */ + break; + + case '?': + default: + usage(); + } + argc -= optind; + argv += optind; + + if (argc == 0) + usage(); + + if (useenvpath) { + if ((std = getenv("PATH")) == NULL) + errx(1, "PATH environment variable is not set"); + } else { + /* Retrieve the standard path. */ +#ifdef __minix + /* + Note: This path is currently defined here and should probably be defined + here, in "ash" or in "sh". + To minimize code changes, the path has been hard coded into this file. + However, if this path needs to be used in other ported programs, please + move this define to and add the include to this file + and all files that use _PATH_USER_CS_PATH. + */ + #define _PATH_USER_CS_PATH "/usr/X11R7/sbin:/usr/local/sbin:/usr/pkg/sbin:/usr/sbin:/sbin:/usr/X11R7/bin:/usr/local/bin:/usr/pkg/bin:/usr/bin:/bin:/usr/games" + std = strdup(_PATH_USER_CS_PATH); +#else + mib[0] = CTL_USER; + mib[1] = USER_CS_PATH; + if (sysctl(mib, 2, NULL, &len, NULL, 0) == -1) + err(1, "sysctl: user.cs_path"); + if (len == 0) + errx(1, "sysctl: user.cs_path (zero length)"); + if ((std = malloc(len)) == NULL) + err(1, NULL); + if (sysctl(mib, 2, std, &len, NULL, 0) == -1) + err(1, "sysctl: user.cs_path"); +#endif /* def __minix */ + } + + /* For each path, for each program... */ + for (; *argv; ++argv) { + if (**argv == '/') { + if (stat(*argv, &sb) == -1) + continue; /* next argv */ + if (!S_ISREG(sb.st_mode)) + continue; /* next argv */ + if (access(*argv, X_OK) == -1) + continue; /* next argv */ + (void)printf("%s\n", *argv); + found++; + if (which) + continue; /* next argv */ + } else for (p = std; p; ) { + t = p; + if ((p = strchr(p, ':')) != NULL) { + *p = '\0'; + if (t == p) + t = "."; + } else + if (strlen(t) == 0) + t = "."; + (void)snprintf(path, sizeof(path), "%s/%s", t, *argv); + len = snprintf(path, sizeof(path), "%s/%s", t, *argv); + if (p) + *p++ = ':'; + if (len >= sizeof(path)) + continue; /* next p */ + if (stat(path, &sb) == -1) + continue; /* next p */ + if (!S_ISREG(sb.st_mode)) + continue; /* next p */ + if (access(path, X_OK) == -1) + continue; /* next p */ + (void)printf("%s\n", path); + found++; + if (which) + break; /* next argv */ + } + } + + return ((found == 0) ? 3 : ((found >= argc) ? 0 : 2)); +} + +static void +usage(void) +{ + + (void)fprintf(stderr, "Usage: %s [-ap] program [...]\n", getprogname()); + exit(1); +} diff --git a/usr.bin/whereis/which.1 b/usr.bin/whereis/which.1 new file mode 100644 index 000000000..b2d7c5db0 --- /dev/null +++ b/usr.bin/whereis/which.1 @@ -0,0 +1,67 @@ +.\" $NetBSD: which.1,v 1.2 2010/04/05 16:13:58 joerg Exp $ +.\" +.\" Copyright (c) 1980, 1991 Regents of the University of California. +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" 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. +.\" +.\" from: @(#)which.1 6.3 (Berkeley) 4/23/91 +.\" $NetBSD: which.1,v 1.2 2010/04/05 16:13:58 joerg Exp $ +.\" +.Dd April 23, 1991 +.Dt WHICH 1 +.Os +.Sh NAME +.Nm which +.Nd "locate a program file in the users $PATH environment variable" +.Sh SYNOPSIS +.Nm +.Op Fl a +.Ar name +.Op Ar ... +.Sh DESCRIPTION +.Nm +takes a list of names and looks for the files which would be +executed had these names been given as commands. +Each argument is searched for along the user's +.Ev PATH . +.Pp +If the +.Fl a +flag is given, +.Nm +will continue to search the +.Ev PATH +until all instances of a program file are found. +.Sh HISTORY +The +.Nm +command appeared in +.Bx 3.0 . +.Sh BUGS +This implementation does not expand +.Xr csh 1 +aliases, and is shell agnostic. +This is really a feature.