diff options
Diffstat (limited to 'usr/src/lib/libcmd')
91 files changed, 0 insertions, 18332 deletions
diff --git a/usr/src/lib/libcmd/Makefile b/usr/src/lib/libcmd/Makefile deleted file mode 100644 index f958be9ad9..0000000000 --- a/usr/src/lib/libcmd/Makefile +++ /dev/null @@ -1,63 +0,0 @@ -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License (the "License"). -# You may not use this file except in compliance with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# - -# -# Copyright 2008 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# - - -SHELL=/usr/bin/ksh93 - -include ../Makefile.lib - -SUBDIRS = $(MACH) -$(BUILD64)SUBDIRS += $(MACH64) - -all := TARGET= all -clean := TARGET= clean -clobber := TARGET= clobber -install := TARGET= install -_msg := TARGET= _msg - -.KEEP_STATE: - -all clean clobber install _msg: $(SUBDIRS) - -HDRS= \ - cmd.h \ - cmdext.h - -HDRDIR32= $(MACH)/include/ast -HDRDIR64= $(MACH64)/include/ast -include ../Makefile.asthdr - -install_h: $(ROOTHDRS) - -# We don't check these header files because they're owned by AT&T/AST -check: - -$(SUBDIRS): FRC - @cd $@; pwd; $(MAKE) $(TARGET) - -FRC: - -include ../Makefile.targ diff --git a/usr/src/lib/libcmd/Makefile.com b/usr/src/lib/libcmd/Makefile.com deleted file mode 100644 index 4382f40764..0000000000 --- a/usr/src/lib/libcmd/Makefile.com +++ /dev/null @@ -1,151 +0,0 @@ -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License (the "License"). -# You may not use this file except in compliance with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# - -# -# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. -# -# Copyright (c) 2018, Joyent, Inc. - - -SHELL=/usr/bin/ksh93 - -LIBRARY = libcmd.a -VERS = .1 -OBJECTS = \ - basename.o \ - cat.o \ - chgrp.o \ - cksum.o \ - chmod.o \ - chown.o \ - cmdinit.o \ - cmp.o \ - comm.o \ - cp.o \ - cut.o \ - date.o \ - dirname.o \ - expr.o \ - grep.o \ - fds.o \ - fmt.o \ - fold.o \ - fts_fix.o \ - getconf.o \ - head.o \ - id.o \ - join.o \ - ln.o \ - logname.o \ - md5sum.o \ - mkdir.o \ - mkfifo.o \ - mktemp.o \ - mv.o \ - paste.o \ - pathchk.o \ - pids.o \ - readlink.o \ - rev.o \ - revlib.o \ - rm.o \ - rmdir.o \ - stty.o \ - sum.o \ - sync.o \ - tail.o \ - tee.o \ - tty.o \ - uname.o \ - uniq.o \ - vmstate.o \ - wc.o \ - wclib.o - -include ../../Makefile.astmsg - -include ../../Makefile.lib - -# mapfile-vers does not live with the sources in in common/ to make -# automated code updates easier. -MAPFILES= ../mapfile-vers - -# Set common AST build flags (e.g. C99/XPG6, needed to support the math stuff) -include ../../../Makefile.ast - -LIBS = $(DYNLIB) - -LDLIBS += \ - -lsum \ - -last \ - -lsocket \ - -lnsl \ - -lc - -SRCDIR = ../common - -# We use "=" here since using $(CPPFLAGS.master) is very tricky in our -# case - it MUST come as the last element but future changes in -D options -# may then cause silent breakage in the AST sources because the last -D -# option specified overrides previous -D options so we prefer the current -# way to explicitly list each single flag. -# Notes: -# - "-D_BLD_DLL" comes from ${mam_cc_DLL} in Mamfile -CPPFLAGS = \ - $(DTEXTDOM) $(DTS_ERRNO) \ - -I../common \ - -Isrc/lib/libcmd \ - -I$(ROOT)/usr/include/ast \ - -I$(ROOT)/usr/include \ - -D_BLD_cmd \ - -D_PACKAGE_ast \ - -D_BLD_DLL \ - '-DERROR_CATALOG="libcmd"' \ - '-DUSAGE_LICENSE=\ - "[-author?Glenn Fowler <gsf@research.att.com>]"\ - "[-author?David Korn <dgk@research.att.com>]"\ - "[-copyright?Copyright (c) 1992-2010 AT&T Intellectual Property]"\ - "[-license?http://www.opensource.org/licenses/cpl1.0.txt]"\ - "[--catalog?libcmd]"' - -CFLAGS += \ - $(ASTCFLAGS) -CFLAGS64 += \ - $(ASTCFLAGS64) - -CERRWARN += -_gcc=-Wno-unused-value -CERRWARN += -_gcc=-Wno-parentheses -CERRWARN += $(CNOWARN_UNINIT) -CERRWARN += -_gcc=-Wno-unused-variable -CERRWARN += -_gcc=-Wno-implicit-function-declaration - -# not linted -SMATCH=off - -pics/cut.o := CERRWARN += -erroff=E_END_OF_LOOP_CODE_NOT_REACHED -pics/sync.o := CERRWARN += -erroff=E_END_OF_LOOP_CODE_NOT_REACHED -pics/vmstate.o := CERRWARN += -erroff=E_NO_IMPLICIT_DECL_ALLOWED - -.KEEP_STATE: - -all: $(LIBS) - -include ../../Makefile.targ diff --git a/usr/src/lib/libcmd/THIRDPARTYLICENSE b/usr/src/lib/libcmd/THIRDPARTYLICENSE deleted file mode 100644 index 50c6364c06..0000000000 --- a/usr/src/lib/libcmd/THIRDPARTYLICENSE +++ /dev/null @@ -1,245 +0,0 @@ -+------------------------------------------------------------------------------+ -| This license covers all software that refers to the URL | -| http://www.opensource.org/licenses/cpl1.0.txt | -+------------------------------------------------------------------------------+ - -Common Public License Version 1.0 - - THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON - PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF - THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - - 1. DEFINITIONS - - "Contribution" means: - - a) in the case of the initial Contributor, the initial code and - documentation distributed under this Agreement, and - - b) in the case of each subsequent Contributor: - - i) changes to the Program, and - - ii) additions to the Program; - - where such changes and/or additions to the Program originate from - and are distributed by that particular Contributor. A Contribution - 'originates' from a Contributor if it was added to the Program by - such Contributor itself or anyone acting on such Contributor's - behalf. Contributions do not include additions to the Program - which: (i) are separate modules of software distributed in - conjunction with the Program under their own license agreement, and - (ii) are not derivative works of the Program. - - "Contributor" means any person or entity that distributes the Program. - - "Licensed Patents " mean patent claims licensable by a Contributor - which are necessarily infringed by the use or sale of its Contribution - alone or when combined with the Program. - - "Program" means the Contributions distributed in accordance with this - Agreement. - - "Recipient" means anyone who receives the Program under this - Agreement, including all Contributors. - - 2. GRANT OF RIGHTS - - a) Subject to the terms of this Agreement, each Contributor hereby - grants Recipient a non-exclusive, worldwide, royalty-free copyright - license to reproduce, prepare derivative works of, publicly - display, publicly perform, distribute and sublicense the - Contribution of such Contributor, if any, and such derivative - works, in source code and object code form. - - b) Subject to the terms of this Agreement, each Contributor hereby - grants Recipient a non-exclusive, worldwide, royalty-free patent - license under Licensed Patents to make, use, sell, offer to sell, - import and otherwise transfer the Contribution of such Contributor, - if any, in source code and object code form. This patent license - shall apply to the combination of the Contribution and the Program - if, at the time the Contribution is added by the Contributor, such - addition of the Contribution causes such combination to be covered - by the Licensed Patents. The patent license shall not apply to any - other combinations which include the Contribution. No hardware per - se is licensed hereunder. - - c) Recipient understands that although each Contributor grants the - licenses to its Contributions set forth herein, no assurances are - provided by any Contributor that the Program does not infringe the - patent or other intellectual property rights of any other entity. - Each Contributor disclaims any liability to Recipient for claims - brought by any other entity based on infringement of intellectual - property rights or otherwise. As a condition to exercising the - rights and licenses granted hereunder, each Recipient hereby - assumes sole responsibility to secure any other intellectual - property rights needed, if any. For example, if a third party - patent license is required to allow Recipient to distribute the - Program, it is Recipient's responsibility to acquire that license - before distributing the Program. - - d) Each Contributor represents that to its knowledge it has - sufficient copyright rights in its Contribution, if any, to grant - the copyright license set forth in this Agreement. - - 3. REQUIREMENTS - - A Contributor may choose to distribute the Program in object code form - under its own license agreement, provided that: - - a) it complies with the terms and conditions of this Agreement; and - - b) its license agreement: - - i) effectively disclaims on behalf of all Contributors all - warranties and conditions, express and implied, including - warranties or conditions of title and non-infringement, and implied - warranties or conditions of merchantability and fitness for a - particular purpose; - - ii) effectively excludes on behalf of all Contributors all - liability for damages, including direct, indirect, special, - incidental and consequential damages, such as lost profits; - - iii) states that any provisions which differ from this Agreement - are offered by that Contributor alone and not by any other party; - and - - iv) states that source code for the Program is available from such - Contributor, and informs licensees how to obtain it in a reasonable - manner on or through a medium customarily used for software - exchange. - - When the Program is made available in source code form: - - a) it must be made available under this Agreement; and - - b) a copy of this Agreement must be included with each copy of the - Program. - - Contributors may not remove or alter any copyright notices contained - within the Program. - - Each Contributor must identify itself as the originator of its - Contribution, if any, in a manner that reasonably allows subsequent - Recipients to identify the originator of the Contribution. - - 4. COMMERCIAL DISTRIBUTION - - Commercial distributors of software may accept certain - responsibilities with respect to end users, business partners and the - like. While this license is intended to facilitate the commercial use - of the Program, the Contributor who includes the Program in a - commercial product offering should do so in a manner which does not - create potential liability for other Contributors. Therefore, if a - Contributor includes the Program in a commercial product offering, - such Contributor ("Commercial Contributor") hereby agrees to defend - and indemnify every other Contributor ("Indemnified Contributor") - against any losses, damages and costs (collectively "Losses") arising - from claims, lawsuits and other legal actions brought by a third party - against the Indemnified Contributor to the extent caused by the acts - or omissions of such Commercial Contributor in connection with its - distribution of the Program in a commercial product offering. The - obligations in this section do not apply to any claims or Losses - relating to any actual or alleged intellectual property infringement. - In order to qualify, an Indemnified Contributor must: a) promptly - notify the Commercial Contributor in writing of such claim, and b) - allow the Commercial Contributor to control, and cooperate with the - Commercial Contributor in, the defense and any related settlement - negotiations. The Indemnified Contributor may participate in any such - claim at its own expense. - - For example, a Contributor might include the Program in a commercial - product offering, Product X. That Contributor is then a Commercial - Contributor. If that Commercial Contributor then makes performance - claims, or offers warranties related to Product X, those performance - claims and warranties are such Commercial Contributor's responsibility - alone. Under this section, the Commercial Contributor would have to - defend claims against the other Contributors related to those - performance claims and warranties, and if a court requires any other - Contributor to pay any damages as a result, the Commercial Contributor - must pay those damages. - - 5. NO WARRANTY - - EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS - PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY - WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY - OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely - responsible for determining the appropriateness of using and - distributing the Program and assumes all risks associated with its - exercise of rights under this Agreement, including but not limited to - the risks and costs of program errors, compliance with applicable - laws, damage to or loss of data, programs or equipment, and - unavailability or interruption of operations. - - 6. DISCLAIMER OF LIABILITY - - EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR - ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING - WITHOUT LIMITATION LOST PROFITS), 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 OR - DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED - HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - - 7. GENERAL - - If any provision of this Agreement is invalid or unenforceable under - applicable law, it shall not affect the validity or enforceability of - the remainder of the terms of this Agreement, and without further - action by the parties hereto, such provision shall be reformed to the - minimum extent necessary to make such provision valid and enforceable. - - If Recipient institutes patent litigation against a Contributor with - respect to a patent applicable to software (including a cross-claim or - counterclaim in a lawsuit), then any patent licenses granted by that - Contributor to such Recipient under this Agreement shall terminate as - of the date such litigation is filed. In addition, if Recipient - institutes patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Program - itself (excluding combinations of the Program with other software or - hardware) infringes such Recipient's patent(s), then such Recipient's - rights granted under Section 2(b) shall terminate as of the date such - litigation is filed. - - All Recipient's rights under this Agreement shall terminate if it - fails to comply with any of the material terms or conditions of this - Agreement and does not cure such failure in a reasonable period of - time after becoming aware of such noncompliance. If all Recipient's - rights under this Agreement terminate, Recipient agrees to cease use - and distribution of the Program as soon as reasonably practicable. - However, Recipient's obligations under this Agreement and any licenses - granted by Recipient relating to the Program shall continue and - survive. - - Everyone is permitted to copy and distribute copies of this Agreement, - but in order to avoid inconsistency the Agreement is copyrighted and - may only be modified in the following manner. The Agreement Steward - reserves the right to publish new versions (including revisions) of - this Agreement from time to time. No one other than the Agreement - Steward has the right to modify this Agreement. IBM is the initial - Agreement Steward. IBM may assign the responsibility to serve as the - Agreement Steward to a suitable separate entity. Each new version of - the Agreement will be given a distinguishing version number. The - Program (including Contributions) may always be distributed subject to - the version of the Agreement under which it was received. In addition, - after a new version of the Agreement is published, Contributor may - elect to distribute the Program (including its Contributions) under - the new version. Except as expressly stated in Sections 2(a) and 2(b) - above, Recipient receives no rights or licenses to the intellectual - property of any Contributor under this Agreement, whether expressly, - by implication, estoppel or otherwise. All rights in the Program not - expressly granted under this Agreement are reserved. - - This Agreement is governed by the laws of the State of New York and - the intellectual property laws of the United States of America. No - party to this Agreement will bring a legal action under this Agreement - more than one year after the cause of action arose. Each party waives - its rights to a jury trial in any resulting litigation. - -Copyright (c) 2004 by the Open Source Initiative -This is a copy of the license posted on 2004-10-06 at: - http://www.opensource.org/licenses/cpl diff --git a/usr/src/lib/libcmd/THIRDPARTYLICENSE.descrip b/usr/src/lib/libcmd/THIRDPARTYLICENSE.descrip deleted file mode 100644 index 59afe46fa5..0000000000 --- a/usr/src/lib/libcmd/THIRDPARTYLICENSE.descrip +++ /dev/null @@ -1 +0,0 @@ -AT&T ADVANCED SOFTWARE TECHNOLOGY COMMAND LIBRARY (LIBCMD) diff --git a/usr/src/lib/libcmd/amd64/Makefile b/usr/src/lib/libcmd/amd64/Makefile deleted file mode 100644 index d7a4359e60..0000000000 --- a/usr/src/lib/libcmd/amd64/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright 2004 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# -# ident "%Z%%M% %I% %E% SMI" -# - -include ../Makefile.com -include ../../Makefile.lib.64 - -all: $(LIBS) - -install: all $(ROOTLIBS64) $(ROOTLINKS64) diff --git a/usr/src/lib/libcmd/amd64/include/ast/cmd.h b/usr/src/lib/libcmd/amd64/include/ast/cmd.h deleted file mode 100644 index e064222a77..0000000000 --- a/usr/src/lib/libcmd/amd64/include/ast/cmd.h +++ /dev/null @@ -1,174 +0,0 @@ - -/* : : generated by proto : : */ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ - -/* - * AT&T Research - * - * builtin cmd definitions - */ - -#ifndef _CMD_H -#if !defined(__PROTO__) -#include <prototyped.h> -#endif -#if !defined(__LINKAGE__) -#define __LINKAGE__ /* 2004-08-11 transition */ -#endif - -#define _CMD_H - -#include <ast.h> -#include <error.h> -#include <stak.h> -#include <shcmd.h> - -#define cmdinit _cmd_init - -#define ERROR_CALLBACK ERROR_SET - -#if _BLD_cmd && defined(__EXPORT__) -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ __EXPORT__ -#endif - -#include <cmdext.h> - -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ - -#if defined(CMD_BUILTIN) && !defined(CMD_STANDALONE) -#define CMD_STANDALONE CMD_BUILTIN -#endif - -#ifdef CMD_STANDALONE - -#define CMD_CONTEXT(c) ((Shbltin_t*)0) - -#if CMD_DYNAMIC - -#include <dlldefs.h> - -#else - -extern __MANGLE__ int CMD_STANDALONE __PROTO__((int, char**, __V_*)); - -#endif - -#ifndef CMD_BUILTIN - -/* - * command initialization - */ - -static int -cmdinit __PARAM__((int argc, register char** argv, __V_* context, const char* catalog, int flags), (argc, argv, context, catalog, flags)) __OTORP__(int argc; register char** argv; __V_* context; const char* catalog; int flags;){ - register char* cp; - register char* pp; - - if (cp = strrchr(argv[0], '/')) - cp++; - else - cp = argv[0]; - if (pp = strrchr(cp, '_')) - cp = pp + 1; - error_info.id = cp; - if (!error_info.catalog) - error_info.catalog = (char*)catalog; - opt_info.index = 0; - if (context) - error_info.flags |= flags & ~(ERROR_CALLBACK|ERROR_NOTIFY); - return 0; -} - -#endif - -int -main __PARAM__((int argc, char** argv), (argc, argv)) __OTORP__(int argc; char** argv;){ -#if CMD_DYNAMIC - register char* s; - register char* t; - __V_* dll; - Shbltin_f fun; - char buf[64]; - - if (s = strrchr(argv[0], '/')) - s++; - else if (!(s = argv[0])) - return 127; - if ((t = strrchr(s, '_')) && *++t) - s = t; - buf[0] = '_'; - buf[1] = 'b'; - buf[2] = '_'; - strncpy(buf + 3, s, sizeof(buf) - 4); - buf[sizeof(buf) - 1] = 0; - if (t = strchr(buf, '.')) - *t = 0; - for (;;) - { - if (dll = dlopen(NiL, RTLD_LAZY)) - { - if (fun = (Shbltin_f)dlsym(dll, buf + 1)) - break; - if (fun = (Shbltin_f)dlsym(dll, buf)) - break; - } - if (dll = dllplug(NiL, "cmd", NiL, RTLD_LAZY, NiL, 0)) - { - if (fun = (Shbltin_f)dlsym(dll, buf + 1)) - break; - if (fun = (Shbltin_f)dlsym(dll, buf)) - break; - } - return 127; - } - return (*fun)(argc, argv, NiL); -#else - return CMD_STANDALONE(argc, argv, NiL); -#endif -} - -#else - -#undef cmdinit -#ifdef _MSC_VER -#define CMD_CONTEXT(p) ((Shbltin_t*)(p)) -#define cmdinit(a,b,c,d,e) do{if(_cmd_init(a,b,c,d,e))return -1;}while(0) -#else -#define CMD_CONTEXT(p) (((p)&&((Shbltin_t*)(p))->version>=20071012&&((Shbltin_t*)(p))->version<20350101)?((Shbltin_t*)(p)):0) -#define cmdinit(a,b,c,d,e) do{if((c)&&!CMD_CONTEXT(c))c=0;if(_cmd_init(a,b,c,d,e))return -1;}while(0) -#endif - -#if _BLD_cmd && defined(__EXPORT__) -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ __EXPORT__ -#endif - -extern __MANGLE__ int _cmd_init __PROTO__((int, char**, __V_*, const char*, int)); - -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ - -#endif - -#endif diff --git a/usr/src/lib/libcmd/amd64/include/ast/cmdext.h b/usr/src/lib/libcmd/amd64/include/ast/cmdext.h deleted file mode 100644 index 978322e2d3..0000000000 --- a/usr/src/lib/libcmd/amd64/include/ast/cmdext.h +++ /dev/null @@ -1,77 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ - -/* : : generated by proto : : */ - -#if !defined(__PROTO__) -#include <prototyped.h> -#endif -#if !defined(__LINKAGE__) -#define __LINKAGE__ /* 2004-08-11 transition */ -#endif -extern __MANGLE__ int b_basename __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cat __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_chgrp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_chmod __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_chown __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cksum __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cmp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_comm __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cut __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_date __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_dirname __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_egrep __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_expr __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fds __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fgrep __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fmt __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fold __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_getconf __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_grep __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_head __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_id __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_join __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_ln __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_logname __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_md5sum __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mkdir __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mkfifo __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mktemp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mv __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_paste __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_pathchk __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_pids __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_rev __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_readlink __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_rm __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_rmdir __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_stty __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_sum __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_sync __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_tail __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_tee __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_tty __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_uname __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_uniq __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_vmstate __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_wc __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_xgrep __PROTO__((int, char**, __V_*)); diff --git a/usr/src/lib/libcmd/amd64/src/lib/libcmd/FEATURE/ids b/usr/src/lib/libcmd/amd64/src/lib/libcmd/FEATURE/ids deleted file mode 100644 index 5c25aaedd2..0000000000 --- a/usr/src/lib/libcmd/amd64/src/lib/libcmd/FEATURE/ids +++ /dev/null @@ -1,15 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_i386_64bit/src/lib/libcmd/features/ids by iffe version 2009-12-04 : : */ -#ifndef _def_ids_cmd -#define _def_ids_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_i386_64bit/arch/sol11.i386/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _lib_endgrent 1 /* endgrent() in default lib(s) */ -#define _lib_getgrent 1 /* getgrent() in default lib(s) */ -#define _lib_setgrent 1 /* setgrent() in default lib(s) */ -#define _sys_fss 1 /* #include <sys/fss.h> ok */ -#if !_lib_fsid && _mac_fsid -#define _lib_fsid 1 -#endif - -#endif diff --git a/usr/src/lib/libcmd/amd64/src/lib/libcmd/FEATURE/sockets b/usr/src/lib/libcmd/amd64/src/lib/libcmd/FEATURE/sockets deleted file mode 100644 index 701f83e584..0000000000 --- a/usr/src/lib/libcmd/amd64/src/lib/libcmd/FEATURE/sockets +++ /dev/null @@ -1,13 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_i386_64bit/src/lib/libcmd/features/sockets by iffe version 2009-12-04 : : */ -#ifndef _def_sockets_cmd -#define _def_sockets_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_i386_64bit/arch/sol11.i386/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _sys_socket 1 /* #include <sys/socket.h> ok */ -#define _hdr_arpa_inet 1 /* #include <arpa/inet.h> ok */ -#define _hdr_netinet_in 1 /* #include <netinet/in.h> ok */ -#define _lib_getsockname 1 /* getsockname() in default lib(s) */ -#define _lib_getsockopt 1 /* getsockopt() in default lib(s) */ -#define _lib_inet_ntoa 1 /* inet_ntoa() in default lib(s) */ -#endif diff --git a/usr/src/lib/libcmd/amd64/src/lib/libcmd/FEATURE/symlink b/usr/src/lib/libcmd/amd64/src/lib/libcmd/FEATURE/symlink deleted file mode 100644 index 50a4f770a0..0000000000 --- a/usr/src/lib/libcmd/amd64/src/lib/libcmd/FEATURE/symlink +++ /dev/null @@ -1,8 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_i386_64bit/src/lib/libcmd/features/symlink by iffe version 2009-12-04 : : */ -#ifndef _def_symlink_cmd -#define _def_symlink_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_i386_64bit/arch/sol11.i386/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _lib_lchown 1 /* lchown implemented */ -#endif diff --git a/usr/src/lib/libcmd/amd64/src/lib/libcmd/FEATURE/utsname b/usr/src/lib/libcmd/amd64/src/lib/libcmd/FEATURE/utsname deleted file mode 100644 index 60fae23d03..0000000000 --- a/usr/src/lib/libcmd/amd64/src/lib/libcmd/FEATURE/utsname +++ /dev/null @@ -1,16 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_i386_64bit/src/lib/libcmd/features/utsname by iffe version 2009-12-04 : : */ -#ifndef _def_utsname_cmd -#define _def_utsname_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_i386_64bit/arch/sol11.i386/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _lib_getdomainname 1 /* getdomainname() in default lib(s) */ -#define _lib_gethostid 1 /* gethostid() in default lib(s) */ -#define _lib_gethostname 1 /* gethostname() in default lib(s) */ -#define _lib_sethostname 1 /* sethostname() in default lib(s) */ -#define _lib_syscall 1 /* syscall() in default lib(s) */ -#define _lib_uname 1 /* uname() in default lib(s) */ -#define _sys_utsname 1 /* #include <sys/utsname.h> ok */ -#define _sys_syscall 1 /* #include <sys/syscall.h> ok */ -#define _sys_systeminfo 1 /* #include <sys/systeminfo.h> ok */ -#endif diff --git a/usr/src/lib/libcmd/common/RELEASE b/usr/src/lib/libcmd/common/RELEASE deleted file mode 100644 index fba77c1c29..0000000000 --- a/usr/src/lib/libcmd/common/RELEASE +++ /dev/null @@ -1,298 +0,0 @@ -10-03-07 tail.c: sfsync(sfstdout) after all -f done, fix -f partial line -10-03-05 mktemp.c: add --regress=seed for testing -10-03-05 vmstate.c: add -10-01-26 tail.c: -f sleep(1) only if no progress from last round of checks -10-01-20 fts_fix.[ch]: use <fts_fix.h> instead of <fts.h> (see fts_fix.c) -10-01-20 cp.c: free(state) if called from old shell -09-12-10 join.c: <wctype.h> for iswspace()! -09-12-04 cmd.h: fix CMD_DYNAMIC logic -09-12-04 cut.c: handle -d mb -09-12-03 mkdir.c: add --verbose -09-11-30 cat.c,date.c,cksum.c: drop setlocale() call already done by optget() -09-11-30 join.c: handle -t mb -09-11-28 wclib.c: { -w -L } mb independent of -m -09-11-28 paste.c: handle -d mb -09-11-28 uniq.c: handle -s mb -09-11-28 cksum.c: FTS_SEEDOTDIR by default -09-09-09 fds.c: add --unit=fd -09-08-25 tail.c: initialize Tail_t.fifo=0 !! -09-08-15 tail.c: fix fifo logic -09-08-11 wc.c: add setlocale(LC_CTYPE,"C") cleanup, add utf8 optimzations -09-08-10 uniq.c: replace -c 1..9999 sfsprintf() with inline conversion -09-08-01 join.c: fix empty field null pointer deref -09-07-23 pathchk.c: add -P,--path and -a,--all -09-07-02 chgrp.c,chmod.c,cksum.c: fts_flags() default only if not --recursive -09-06-19 cmd.h,cmdinit.c: add ERROR_CALLBACK for ERROR_NOTIFY main() callback -09-06-19 mktemp.c: --unsafe now checks and prints path but does create -09-06-19 tee.c: add ERROR_CALLBACK for tee_cleanup() sfio discipline pop -09-06-18 rm.c: handle interrupts during interactive query -09-06-18 cp.c: handle interrupts during interactive query -09-05-25 tail.c: fix old style option logic to handle --invalid-long-option -09-05-24 tail.c: -r == +1r -09-05-01 mktemp.c: handle foo/prefix, add -p dir and -u -09-03-31 cat.c: handle --no* options -09-03-15 tail.c: fix --timeout termination logic -09-03-03 tee.c: clean up sfio disciplines on error -09-03-03 cat.c: fix -v|-e|-n|-B interaction bugs -09-02-14 tail.c: fix VSC failures -09-02-14 join.c: fix VSC failure -09-02-02 uniq.c: document -number == -fnumber, +number == -snumber -09-02-02 tail.c: fix usage[] for negative offsets, add sun -b -09-02-02 mktemp.c: add -09-02-02 features/utsname: UWIN _UNAME_os_DEFAULT => UWIN -09-01-31 dirname.c: add experimental { -f -r -x } for pathpath(3) -09-01-05 cmp.c: fix EOF diagnostic to conform to posix -09-01-03 mkfifo.c: fix --mode=mode logic -08-12-07 date.c: add %[_][EO]K for [space pad] [full|long] iso docs -08-11-10 stty.c: check for -t grouping so -tostop != -t -ostop -08-10-15 rm.c: handle 'rm -f x x' => exit 0 -08-09-08 stty.c: #ifdef guard TAB[012] -- freebsd: damn the posix, full speed ahead -08-06-17 shcmd.h: move to libast -08-04-24 uniq.c: add optget() 'n' option for -1 => -f1 -08-04-24 getconf.c: clarify diffs between "name - value" and "name = value" -08-04-01 cut.c: add write error check -08-04-01 paste.c: fix --noserial stream vector access bug -08-04-01 pids.c: add ls/ps style --format=format -08-04-01 stty.c: fix off2 unitialized reference -08-03-28 chgrp.c: add --before=file -08-03-14 pids.c: add -08-03-11 chgrp.c: fix -m to use uid:gid as lookup key -08-02-11 Makefile: add -lmd possibly required by sumlib.o -- hack alert -08-01-30 expr.c: fix <=0 type that broke substr * 1 * -- wow -07-12-13 cp.c: fix builtin state reinitialization -07-11-29 rev.c: honor multibyte locales -07-11-27 cp.c: open non-existent destination with O_EXCL -07-11-27 stty.c: add -t,--terminal-group to list tty pgrp -07-11-27 cksum.c: --silent -s => -S, -s == -x sys5 for gnu compatibility -07-11-11 tee.c: drop ancient bsd compatibility "-" operand => SIGINT -07-10-29 cksum.c: add SUM_LEGACY for -r -07-10-12 cp.c: plug usage string memory leak by using per-builtin state -07-09-21 cksum.c: add sumprint() default scale arg, --scale, --bsd for solaris -07-09-10 chmod.c: add --show,-n -07-07-27 wclib.c: bias <wchar.h> checks for modern unix -07-07-17 cat.c: fix --squeeze-blank to reduce multiple blank lines to *one* -07-05-20 cmd.h: handle msvc's balk at if(0)0=0; -07-05-20 cksum.c: #include <modex.h> -07-05-11 cmd.h: add _CMD_CONTEXT_OK() to verify >= 20070511 context -07-05-09 fds.c: handle ipv6 sockets -07-05-09 cmd.h: <shbltin.h> : cmdquit() => sh_checksig(context) -07-04-25 mkdir.c: force (S_ISVTX|S_ISUID|S_ISGID) after mkdir(2) -07-04-24 procrun.c: add -last intercept => sh_run() and whence -q -07-04-19 uname.c: name operands first checked for CS_NAME, then NAME -07-03-28 date.c: add --unelapsed=scale, -U: fmtelapsed() => strelapsed() -07-03-25 wclib.h: iswspace() requires <wctype.h>! -07-03-11 tty.c: add sysV --line-number, -l -07-02-26 Makefile: sumlib.o: direct extract from +lsum (vcodex someday) -07-02-24 Makefile: tweak cmdext.h action for --mam bootstrap -07-02-09 Makefile: { cmdext.h cmdlist.h } depend on *.c list! -07-02-09 Makefile: +lsum to bring in static -lsum (no dynamic right now) -07-02-07 cksum.c: move from src/cmd/std with ftwalk => fts -07-02-07 getconf.c: handle /bin == /usr/bin in defer logic -07-01-26 chmod.c: don't FTS_FOLLOW if !FTS_PHYSICAL -07-01-23 cut.c: Cut_t variable dimension list[] must be last member -07-01-22 uname.c: fix -h typo that clobbered astconf() state -- ouch -07-01-02 fmt.c: fix buffer splice off by one bug -- what else -06-11-23 cmd.h: because of proto cmdinit cannot be a function like macro -06-11-21 cp.c: fix 06-10-31 const dot[] readonly assignment -06-11-15 cp.c: fix 06-10-31 ln -s enoent bug -06-11-11 getconf.c: let astconf() handle "undefined" vs. "" -06-11-11 getconf.c: fix deferred getconf path search -06-11-11 fmt.c: handle two char { \t \n } in --usage ouput -06-10-31 global edit to eliminate most non-const static data0 -06-10-31 use <cmd.h> for all b_*() implementations; drop <cmdlib.h> -06-10-31 cmd.h: add CMD_ prefix to { BUILTIN DYNAMIC STANDALONE } -06-10-31 join.c: tone down /tmp usage vi SFSK_DISCARD -06-10-31 cp.c,rm.c: update to <fts.h> to accomodate non-static data -06-10-29 date.c: "...%H%..." => "...%H" "%..." to avoid SCCS conflict -06-10-26 fds.c: handle sctp -06-10-18 tail.c: fix invalid suffix infinite loop -06-10-11 chgrp.c,cp.c: add sfstruse() error checks -06-10-10 tee.c: add --linebuffer, -l -06-10-06 getconf.c: preserve native getconf(1) known variable behavior -06-10-04 sync.c: add (thanks to Roland Mainz) -06-10-04 getconf.c: add -v specification => run native getconf(1) -06-09-28 stty.c: static setmode() => set() for darwin.i386 -06-09-27 head.c: handle -1c => -c1 -06-09-19 pathchk.c: pathconf() => astconf() -06-09-11 tail.c: handle compatibility corner cases -06-09-08 date.c: add output write error diagnostic -06-09-04 tail.c: fix initial position for -n0, no args => no -f -06-08-28 uniq.c: add -D,--all-repeated -06-08-25 wc.c,wclib.c: add -L,--longest-line,WC_LONGEST -06-08-24 wc.c,wclib.c: implement -m and WC_MBYTE -06-08-24 rmdir.c: -sp applies to every message, add gnu -e -06-08-23 rmdir.c: add solaris --suppress, -s -06-08-23 mkdir.c: don't add 0300 to -p final dir mode -06-07-17 cut.c: handle last line with no newline -06-07-17 cut.c: --output-delimiter == --line-delimiter -06-06-25 chmod.c: mask -c output with S_IPERM -06-05-09 uname.c: add -o; change -a to match linux -06-05-03 date.c: add --last -L to list last of multiple time args -06-02-14 tail.c: fix -f bug that lost fast stream data -06-02-11 getconf.c: exit 1 if name invalid -- duh -06-01-28 cp.c,rm.c: fix astquery() 'q' to return and not exit() -05-08-11 fmt.c: fix -o to handle raw --usage strings -05-05-17 cat.c,head.c: disable EPIPE error messages -05-04-14 chgrp.c: -f means all non-syntax error messages -05-04-11 fds.c: add from old internal open(1) -05-04-09 cmdext.h,cmdlist.h: generate from source -- about time -05-03-24 features/symlink: verify { lchmod lchown } implementations -05-03-07 date.c: add --listzones to list the time zone table -05-02-14 chmod.c: add --reference=file -05-01-11 cat.c: restore output stream to binary mode on exit -04-12-15 cp.c: add --preserve high resolution time support -04-12-08 date.c: add high resolution time support -04-12-01 cmp.c: fix %6I*ld => %6I*d -- doh - fmt.c: handle "\n\n operands \n\n" - head.c: handle -cN -nN, N > 4Gb -04-11-22 cmp.c: handle >2G chars/lines -04-11-18 fold.c: add --prepend=text, --append=text -04-10-31 tail.c: use SF_LOCKR macro -04-10-28 tail.c: use strtol() for old stype [+-]number[suffix] -- doh -04-10-22 cp.c: check rename() errno==ENOENT to retain destination -04-10-11 fmt.c: fix -o,--optget sublist bugs - tail.c: use strton() for number conversion -04-10-08 pathchk.c: add empty path and -p - first component char -04-10-01 fmt.c: add -o,--optget concatenated usage string format - stty.c: context is ERROR_INTERCATIVE - rm.c: restore 3d before exit -04-09-24 pathchk.c: fix docs -04-09-14 date.c: add %| and %& --parse docs -04-08-27 cp.c: add FTW_DC check -- duh -04-08-01 fmt.c: handle last char != '\n' -04-07-22 date.c,uname.c: access() => eaccess() -04-07-01 fmt.c: handle large input lines -- ouch -04-06-11 id.c: fix -r to output something! -04-05-27 expr.c: fix `:' op subexpression output -04-04-15 chmod.c: follow symlink for relative mode -04-04-12 Makefile: add STDCHMOD (for osf.alpha) -04-03-19 tail.c: handle -f sfreserve() large chunk failure -04-02-29 cp.c: decouple -f and -i for standard CONFORMANCE - cp.c: mv now attempts rename() before remove()+rename() - date.c: -f format or +format disables system clock set -04-02-14 cp.c: add -F --fsync to call fsync(2) for each copied file -04-01-05 head.c: -s now uses opt_info.number for >2Gb skip -03-09-18 tail.c: add --log -03-09-11 rm.c: add --unconditional -03-08-11 fold.c: add --delimiter=c to break at c -03-07-28 features/time: change settimeofday() test to 2nd arg of (void*)0 - expr.c: add {match,substr,index,length,quote} -03-07-15 fmt.c: fix trailing space bug -03-06-20 uname.c: fix -p constant string overwrite -03-06-04 stty.c: add undef to control assignment docs -03-05-31 uname.c: add -f and sysinfo()/confstr() compatibility via astconf() -03-05-27 rm.c: fix inappropriate "/.." append path overflow - cut.c: snarf from dgk -03-05-18 rm.c: check st_nlink to verify progress w.r.t. ftwalk/fts -03-05-15 join.c: fix stealth -v2 bug (thanks ahs) -03-05-04 wc.c: drop trailing space for `wc -l < file' -03-03-21 date.c: add %Q/recent/distant/ docs -03-02-19 date.c: fix %+|!flag docs -02-11-14 update for cmdinit() 4th arg and ERROR_NOTIFY for interrupt cleanup -02-10-02 date.c: tmform() => tmfmt() -02-09-30 date.c,uname.c: change execv() calls to procrun(): exec|exit => bad -02-09-06 wclib.c: fix 1 char-at-a-time miscount bug -02-08-19 chgrp.c: convert to use <cdt.h> -02-07-23 join.c: fix comm snarf typo -02-04-05 date.c: add %u -02-01-24 stty.c: ifdef a few more macros for uts (yes, its still running) -01-12-14 date.c: clarify %z doc -01-10-31 mkdir.c: mkdir() on existing dir could fail with errno!=EEXIST - uname.c: add execve() loop check for unknown options -01-10-29 tail.c: SF_SHARE on only if not reading through EOF -01-10-11 getconf.c: fix usage typos -01-09-11 cp.c,cmd.h: handle . in argv[0] - cp.c: add O_BINARY to all open() calls -01-09-06 tail: input streams must be SF_SHARE -- duh -01-07-16 stty: fix cntl() macro for CC_NATIVE!=CC_ASCII -01-05-31 date: fix /bin/date fallback logic - stty: fix a few mismatched flags, -a and -g option logic - stty: tone down sane to modify current settings rather than from zero -01-05-01 uname: -i => -h, add sol.sun4 -i, add sgi -R, punt to /usr/bin/uname -01-04-17 date,rm: add -01-03-07 cp: fix readonly string mod on "." -01-01-23 cp: `cp foo' => `cp foo .' only for CONFORMANCE!=standard -00-12-01 cut: multibyte support -00-10-31 mkdir: handle races by checking EEXIST -00-09-20 cp: copy argv to stack before modifying in place -00-05-18 add setlocale(LC_ALL,"") -00-04-30 join: drop weird opt_info.argv reference -00-03-17 expr: add == operator -- duh - cp,ln,mv: delay pathcanon() on destination to verify `cp a b/.' - getconf: use astgetconf for proper message control - ERROR_translate: dictionary update -00-03-08 tail: handle multiple -f files -00-03-07 fmt: add -00-03-07 dirname: handle PATH_LEADING_SLASHES as documented - tail: accept + options -00-02-14 chmod: --ignore-umask to ignore umask(2) in symbolic expressions - chmod,chgrp,cp: use FTS_NOSEEDOTDIR for correct path construction - cat: fix -n (was ignored, wow) -00-01-27 getconf: add "-a" and "-v spec" for sol7.* compatibility -99-09-09 join: fix -j1 vs. -j 1, add --ignorecase -99-06-22 paste: defualt delim in writable string -99-06-16 cat: fix --dos-ouput typo -99-06-11 cp: tighten chown() diagnostics -99-06-08 expr: nothing for NULL string bug fix -99-05-21 paste: fix missing newline columnize bug -99-05-20 mv: do not check for `mv foo foo' since rename() handles it -99-05-01 cmp,comm,cp/mv/ln,expr,fold,getconf,head: long options - join,logname,paste,pathchk,tail,tee: long options -99-04-10 uname: long options, stdize -a - chmod,head,tail,rev: long options - cut: long options, pass regression test 02 -99-04-07 cat: long options, fix O_TEXT modes -99-01-11 tail: fix +n - join: another ggs/psm bug - join: all 1 and/or 2 to be unseekable -99-01-01 cp: fix -p - chmod: drop -l option because of clash with l (lock) mode -98-12-25 cat: add -T to sfopen(,,"rt") -98-11-11 chgrp,chmod: cannot open file stream => not found - join: fix another ggs/psm bug; thanks guys -98-10-20 cp: fix cp -rp to update dir times too -98-09-22 join: fix ggs null field bug -98-08-11 join: fix last regression test bug -98-05-29 join: add jp->common to handle boundary conditions -98-03-11 cat,cp,rev,tee: fix sfmove() error checks -98-03-01 join: fix bug that emitted records more than once after eof - cp: fix sfmove() error check -98-02-14 cp: -R physical, -[HLP], -r getconf(PATH_RESOLVE) -98-01-11 cp: check sfclose() return value -98-01-07 chown,chgrp,chmod: use fts for -R - mkdir: fix -p default mode -97-12-07 mkdir: fix umask() reset -97-11-11 chown,chgrp: proper interpretation of -h,-l for lchown() - chown,chgrp: only chown() if uid or gid change -97-10-31 mkdir: do umask right -97-08-11 cmdinit: clear opt_info.index to allow multiple calls - cp,ln,mv: add -97-07-17 join: fix a few more -a bugs -97-05-31 expr: optget() only if CONFORMANCE==standard -97-04-01 join: fix a few bugs that make it work! -96-12-25 head: sfset(sfstdin,SF_SHARE,1) - Makefile: add -last to cmd lib list - drop function __IMPORT__ -96-08-11 tail: check for truncated file and rewind for -f -96-04-08 update <cmd.h> -96-02-29 uname: -a like std, -l for everything - id: add -a (default) -96-02-14 wc: speed up inner loop newline breakout -96-01-30 unused var cleanup -96-01-01 AT&T Research now - pathchk: handle getcwd(0,0) error - expr: switch to <regex.h> -95-11-11 add expr.c - fix cut exit code and -s optimization -95-10-11 add extern b_* to cmd.h - add void* context 3rd arg to b_main() -95-05-09 add getconf - cat -u avoids mmap - add chown|chgrp -m uid|gid map file - add chown|chgrp -P for systems with lchown(2) - chown|chgrp -P => lstat() too! - chmod|chown|chgrp -HLP -95-04-01 version 1.2 - add rmdir -95-02-14 fix mkdir -p symlink bug - fix mkdir '/' skip bug that went one too far diff --git a/usr/src/lib/libcmd/common/basename.c b/usr/src/lib/libcmd/common/basename.c deleted file mode 100644 index 74da190ce8..0000000000 --- a/usr/src/lib/libcmd/common/basename.c +++ /dev/null @@ -1,116 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * AT&T Bell Laboratories - * - * namebase pathname [suffix] - * - * print the namebase of a pathname - */ - -static const char usage[] = -"[-?\n@(#)$Id: basename (AT&T Research) 1999-04-10 $\n]" -USAGE_LICENSE -"[+NAME?basename - strip directory and suffix from filenames]" -"[+DESCRIPTION?\bbasename\b removes all leading directory components " - "from the file name defined by \astring\a. If the file name " - "defined by \astring\a has a suffix that ends in \asuffix\a, " - "it is removed as well.]" -"[+?If \astring\a consists solely of \b/\b characters the output will " - "be a single \b/\b unless \bPATH_LEADING_SLASHES\b returned by " - "\bgetconf\b(1) is \b1\b and \astring\a consists of multiple " - "\b/\b characters in which case \b//\b will be output. " - "Otherwise, trailing \b/\b characters are removed, and if " - "there are any remaining \b/\b characters in \astring\a, " - "all characters up to and including the last \b/\b are removed. " - "Finally, if \asuffix\a is specified, and is identical the end " - "of \astring\a, these characters are removed. The characters " - "not removed from \astring\a will be written to standard output.]" -"\n" -"\n string [suffix]\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?Successful Completion.]" - "[+>0?An error occurred.]" -"}" -"[+SEE ALSO?\bdirname\b(1), \bgetconf\b(1), \bbasename\b(3)]" -; - - -#include <cmd.h> - -static void namebase(Sfio_t *outfile, register char *pathname, char *suffix) -{ - register char *first, *last; - register int n=0; - for(first=last=pathname; *last; last++); - /* back over trailing '/' */ - if(last>first) - while(*--last=='/' && last > first); - if(last==first && *last=='/') - { - /* all '/' or "" */ - if(*first=='/') - if(*++last=='/') /* keep leading // */ - last++; - } - else - { - for(first=last++;first>pathname && *first!='/';first--); - if(*first=='/') - first++; - /* check for trailing suffix */ - if(suffix && (n=strlen(suffix)) && n<(last-first)) - { - if(memcmp(last-n,suffix,n)==0) - last -=n; - } - } - if(last>first) - sfwrite(outfile,first,last-first); - sfputc(outfile,'\n'); -} - -int -b_basename(int argc,register char *argv[], void* context) -{ - register int n; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - while (n = optget(argv, usage)) switch (n) - { - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - argv += opt_info.index; - argc -= opt_info.index; - if(error_info.errors || argc < 1 || argc > 2) - error(ERROR_usage(2), "%s", optusage(NiL)); - namebase(sfstdout,argv[0],argv[1]); - return(0); -} - diff --git a/usr/src/lib/libcmd/common/cat.c b/usr/src/lib/libcmd/common/cat.c deleted file mode 100644 index dbec90c1da..0000000000 --- a/usr/src/lib/libcmd/common/cat.c +++ /dev/null @@ -1,557 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * Glenn Fowler - * AT&T Bell Laboratories - * - * cat - */ - -#include <cmd.h> -#include <fcntl.h> - -static const char usage[] = -"[-?\n@(#)$Id: cat (AT&T Research) 2009-03-31 $\n]" -USAGE_LICENSE -"[+NAME?cat - concatenate files]" -"[+DESCRIPTION?\bcat\b copies each \afile\a in sequence to the standard" -" output. If no \afile\a is given, or if the \afile\a is \b-\b," -" \bcat\b copies from standard input starting at the current location.]" - -"[b:number-nonblank?Number lines as with \b-n\b but omit line numbers from" -" blank lines.]" -"[d:dos-input?Input files are opened in \atext\amode which removes carriage" -" returns in front of new-lines on some systems.]" -"[e?Equivalent to \b-vE\b.]" -"[n:number?Causes a line number to be inserted at the beginning of each line.]" -"[s?Equivalent to \b-S\b for \aatt\a universe and \b-B\b otherwise.]" -"[t?Equivalent to \b-vT\b.]" -"[u:unbuffer?The output is not delayed by buffering.]" -"[v:show-nonprinting?Causes non-printing characters (whith the exception of" -" tabs, new-lines, and form-feeds) to be output as printable charater" -" sequences. ASCII control characters are printed as \b^\b\an\a," -" where \an\a is the corresponding ASCII character in the range" -" octal 100-137. The DEL character (octal 0177) is copied" -" as \b^?\b. Other non-printable characters are copied as \bM-\b\ax\a" -" where \ax\a is the ASCII character specified by the low-order seven" -" bits. Multibyte characters in the current locale are treated as" -" printable characters.]" -"[A:show-all?Equivalent to \b-vET\b.]" -"[B:squeeze-blank?Multiple adjacent new-line characters are replace by one" -" new-line.]" -"[D:dos-output?Output files are opened in \atext\amode which inserts carriage" -" returns in front of new-lines on some systems.]" -"[E:show-ends?Causes a \b$\b to be inserted before each new-line.]" -"[R:regress?Regression test defaults: \b-v\b buffer size 4.]" -"[S:silent?\bcat\b is silent about non-existent files.]" -"[T:show-blank?Causes tabs to be copied as \b^I\b and formfeeds as \b^L\b.]" - -"\n" -"\n[file ...]\n" -"\n" - -"[+SEE ALSO?\bcp\b(1), \bgetconf\b(1), \bpr\b(1)]" -; - -#define RUBOUT 0177 - -/* control flags */ -#define B_FLAG (1<<0) -#define E_FLAG (1<<1) -#define F_FLAG (1<<2) -#define N_FLAG (1<<3) -#define S_FLAG (1<<4) -#define T_FLAG (1<<5) -#define U_FLAG (1<<6) -#define V_FLAG (1<<7) -#define D_FLAG (1<<8) -#define d_FLAG (1<<9) - -/* character types */ -#define T_ERROR 1 -#define T_EOF 2 -#define T_ENDBUF 3 -#define T_NEWLINE 4 -#define T_CONTROL 5 -#define T_EIGHTBIT 6 -#define T_CNTL8BIT 7 - -#define printof(c) ((c)^0100) - -typedef void* (*Reserve_f)(Sfio_t*, ssize_t, int); - -#ifndef sfvalue -#define sfvalue(f) ((f)->_val) -#endif - -static void* -regress(Sfio_t* sp, ssize_t n, int f) -{ - void* r; - - if (!(r = sfreserve(sp, 4, f))) - r = sfreserve(sp, n, f); - else if (sfvalue(sp) > 4) - sfvalue(sp) = 4; - return r; -} - -/* - * called for any special output processing - */ - -static int -vcat(register char* states, Sfio_t* ip, Sfio_t* op, Reserve_f reserve, int flags) -{ - register unsigned char* cp; - register unsigned char* pp; - unsigned char* cur; - unsigned char* end; - unsigned char* buf; - unsigned char* nxt; - register int n; - register int line; - register int raw; - int last; - int c; - int m; - int any; - int header; - - unsigned char meta[4]; - unsigned char tmp[32]; - - meta[0] = 'M'; - meta[1] = '-'; - last = -1; - *(cp = buf = end = tmp) = 0; - any = 0; - header = flags & (B_FLAG|N_FLAG); - line = 1; - states[0] = T_ENDBUF; - raw = !mbwide(); - for (;;) - { - cur = cp; - if (raw) - while (!(n = states[*cp++])); - else - for (;;) - { - while (!(n = states[*cp++])); - if (n < T_CONTROL) - break; - if ((m = mbsize(pp = cp - 1)) > 1) - cp += m - 1; - else - { - if (m <= 0) - { - if (cur == pp) - { - if (last > 0) - { - *end = last; - last = -1; - c = end - pp + 1; - if ((m = mbsize(pp)) == c) - { - any = 1; - if (header) - { - header = 0; - sfprintf(op, "%6d\t", line); - } - sfwrite(op, cur, m); - *(cp = cur = end) = 0; - } - else - { - memcpy(tmp, pp, c); - if (!(nxt = (unsigned char*)(*reserve)(ip, SF_UNBOUND, 0))) - { - states[0] = sfvalue(ip) ? T_ERROR : T_EOF; - *(cp = end = tmp + sizeof(tmp) - 1) = 0; - last = -1; - } - else if ((n = sfvalue(ip)) <= 0) - { - states[0] = n ? T_ERROR : T_EOF; - *(cp = end = tmp + sizeof(tmp) - 1) = 0; - last = -1; - } - else - { - cp = buf = nxt; - end = buf + n - 1; - last = *end; - *end = 0; - } - mb: - if ((n = end - cp + 1) >= (sizeof(tmp) - c)) - n = sizeof(tmp) - c - 1; - memcpy(tmp + c, cp, n); - if ((m = mbsize(tmp)) >= c) - { - any = 1; - if (header) - { - header = 0; - sfprintf(op, "%6d\t", line); - } - sfwrite(op, tmp, m); - cur = cp += m - c; - } - } - continue; - } - } - else - { - cp = pp + 1; - n = 0; - } - } - break; - } - } - c = *--cp; - if ((m = cp - cur) || n >= T_CONTROL) - { - flush: - any = 1; - if (header) - { - header = 0; - sfprintf(op, "%6d\t", line); - } - if (m) - sfwrite(op, cur, m); - } - special: - switch (n) - { - case T_ERROR: - if (cp != end) - { - n = T_CONTROL; - goto flush; - } - return -1; - case T_EOF: - if (cp != end) - { - n = T_CONTROL; - goto flush; - } - return 0; - case T_ENDBUF: - if (cp != end) - { - n = T_CONTROL; - goto flush; - } - c = last; - if (!(nxt = (unsigned char*)(*reserve)(ip, SF_UNBOUND, 0))) - { - *(cp = end = tmp) = 0; - states[0] = sfvalue(ip) ? T_ERROR : T_EOF; - last = -1; - } - else if ((m = sfvalue(ip)) <= 0) - { - *(cp = end = tmp) = 0; - states[0] = m ? T_ERROR : T_EOF; - last = -1; - } - else - { - buf = nxt; - end = buf + m - 1; - last = *end; - *end = 0; - cp = buf; - } - if (c >= 0) - { - if (!(n = states[c])) - { - *(cur = tmp) = c; - m = 1; - goto flush; - } - if (raw || n < T_CONTROL) - { - cp--; - goto special; - } - tmp[0] = c; - c = 1; - goto mb; - } - break; - case T_CONTROL: - do - { - sfputc(op, '^'); - sfputc(op, printof(c)); - } while (states[c = *++cp] == T_CONTROL); - break; - case T_CNTL8BIT: - meta[2] = '^'; - do - { - n = c & ~0200; - meta[3] = printof(n); - sfwrite(op, (char*)meta, 4); - } while (states[c = *++cp] == T_CNTL8BIT && raw); - break; - case T_EIGHTBIT: - do - { - meta[2] = c & ~0200; - sfwrite(op, (char*)meta, 3); - } while (states[c = *++cp] == T_EIGHTBIT && raw); - break; - case T_NEWLINE: - if (header && !(flags & B_FLAG)) - sfprintf(op, "%6d\t", line); - if (flags & E_FLAG) - sfputc(op, '$'); - sfputc(op, '\n'); - if (!header || !(flags & B_FLAG)) - line++; - header = !(flags & S_FLAG); - for (;;) - { - if ((n = states[*++cp]) == T_ENDBUF) - { - if (cp != end || last != '\n') - break; - if (!(nxt = (unsigned char*)(*reserve)(ip, SF_UNBOUND, 0))) - { - states[0] = sfvalue(ip) ? T_ERROR : T_EOF; - cp = end = tmp; - *cp-- = 0; - last = -1; - } - else if ((n = sfvalue(ip)) <= 0) - { - states[0] = n ? T_ERROR : T_EOF; - cp = end = tmp; - *cp-- = 0; - last = -1; - } - else - { - buf = nxt; - end = buf + n - 1; - last = *end; - *end = 0; - cp = buf - 1; - } - } - else if (n != T_NEWLINE) - break; - if (!(flags & S_FLAG) || any || header) - { - any = 0; - header = 0; - if ((flags & (B_FLAG|N_FLAG)) == N_FLAG) - sfprintf(op, "%6d\t", line); - if (flags & E_FLAG) - sfputc(op, '$'); - sfputc(op, '\n'); - } - if (!(flags & B_FLAG)) - line++; - } - header = flags & (B_FLAG|N_FLAG); - break; - } - } -} - -int -b_cat(int argc, char** argv, void* context) -{ - register int n; - register int flags = 0; - register char* cp; - register Sfio_t* fp; - char* mode; - Reserve_f reserve = sfreserve; - int att; - int dovcat = 0; - char states[UCHAR_MAX+1]; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - att = !strcmp(astconf("UNIVERSE", NiL, NiL), "att"); - mode = "r"; - for (;;) - { - n = 0; - switch (optget(argv, usage)) - { - case 'A': - n = T_FLAG|E_FLAG|V_FLAG; - break; - case 'B': - n = S_FLAG; - break; - case 'b': - n = B_FLAG; - break; - case 'd': - mode = opt_info.num ? "rt" : "r"; - continue; - case 'D': - n = d_FLAG; - break; - case 'E': - n = E_FLAG; - break; - case 'e': - n = E_FLAG|V_FLAG; - break; - case 'n': - n = N_FLAG; - break; - case 'R': - reserve = opt_info.num ? regress : sfreserve; - continue; - case 's': - n = att ? F_FLAG : S_FLAG; - break; - case 'S': - n = F_FLAG; - break; - case 'T': - n = T_FLAG; - break; - case 't': - n = T_FLAG|V_FLAG; - break; - case 'u': - n = U_FLAG; - break; - case 'v': - n = V_FLAG; - break; - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - if (!n) - break; - if (opt_info.num) - flags |= n; - else - flags &= ~n; - } - argv += opt_info.index; - if (error_info.errors) - error(ERROR_usage(2), "%s", optusage(NiL)); - memset(states, 0, sizeof(states)); - if (flags&V_FLAG) - { - memset(states, T_CONTROL, ' '); - states[RUBOUT] = T_CONTROL; - memset(states+0200, T_EIGHTBIT, 0200); - memset(states+0200, T_CNTL8BIT, ' '); - states[RUBOUT|0200] = T_CNTL8BIT; - states['\n'] = 0; - } - if (flags&T_FLAG) - states['\t'] = T_CONTROL; - states[0] = T_ENDBUF; - if (att) - { - if (flags&V_FLAG) - { - states['\n'|0200] = T_EIGHTBIT; - if (!(flags&T_FLAG)) - { - states['\t'] = states['\f'] = 0; - states['\t'|0200] = states['\f'|0200] = T_EIGHTBIT; - } - } - } - else if (flags) - { - if (!(flags&T_FLAG)) - states['\t'] = 0; - } - if (flags&(V_FLAG|T_FLAG|N_FLAG|E_FLAG|B_FLAG|S_FLAG)) - { - states['\n'] = T_NEWLINE; - dovcat = 1; - } - if (flags&d_FLAG) - sfopen(sfstdout, NiL, "wt"); - if (cp = *argv) - argv++; - do - { - if (!cp || streq(cp, "-")) - { - fp = sfstdin; - if (flags&D_FLAG) - sfopen(fp, NiL, mode); - } - else if (!(fp = sfopen(NiL, cp, mode))) - { - if (!(flags&F_FLAG)) - error(ERROR_system(0), "%s: cannot open", cp); - error_info.errors = 1; - continue; - } - if (flags&U_FLAG) - sfsetbuf(fp, (void*)fp, -1); - if (dovcat) - n = vcat(states, fp, sfstdout, reserve, flags); - else if (sfmove(fp, sfstdout, SF_UNBOUND, -1) >= 0 && sfeof(fp)) - n = 0; - else - n = -1; - if (fp != sfstdin) - sfclose(fp); - if (n < 0 && errno != EPIPE) - { - if (cp) - error(ERROR_system(0), "%s: read error", cp); - else - error(ERROR_system(0), "read error"); - } - if (sferror(sfstdout)) - break; - } while (cp = *argv++); - if (sfsync(sfstdout)) - error(ERROR_system(0), "write error"); - if (flags&d_FLAG) - sfopen(sfstdout, NiL, "w"); - return error_info.errors; -} diff --git a/usr/src/lib/libcmd/common/chgrp.c b/usr/src/lib/libcmd/common/chgrp.c deleted file mode 100644 index 5272171787..0000000000 --- a/usr/src/lib/libcmd/common/chgrp.c +++ /dev/null @@ -1,479 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * Glenn Fowler - * AT&T Research - * - * chgrp+chown - */ - -static const char usage_1[] = -"[-?@(#)$Id: chgrp (AT&T Research) 2009-07-02 $\n]" -USAGE_LICENSE -; - -static const char usage_grp_1[] = -"[+NAME?chgrp - change the group ownership of files]" -"[+DESCRIPTION?\bchgrp\b changes the group ownership of each file" -" to \agroup\a, which can be either a group name or a numeric" -" group id. The user ownership of each file may also be changed to" -" \auser\a by prepending \auser\a\b:\b to the group name.]" -; - -static const char usage_own_1[] = -"[+NAME?chown - change the ownership of files]" -"[+DESCRIPTION?\bchown\b changes the ownership of each file" -" to \auser\a, which can be either a user name or a numeric" -" user id. The group ownership of each file may also be changed to" -" \auser\a by appending \b:\b\agroup\a to the user name.]" -; - -static const char usage_2[] = -"[b:before?Only change files with \bctime\b before (less than) the " - "\bmtime\b of \afile\a.]:[file]" -"[c:changes?Describe only files whose ownership actually changes.]" -"[f:quiet|silent?Do not report files whose ownership fails to change.]" -"[l|h:symlink?Change the ownership of the symbolic links on systems that " - "support this.]" -"[m:map?The first operand is interpreted as a file that contains a map " - "of space separated \afrom_uid:from_gid to_uid:to_gid\a pairs. The " - "\auid\a or \agid\a part of each pair may be omitted to mean any \auid\a " - "or \agid\a. Ownership of files matching the \afrom\a part of any pair " - "is changed to the corresponding \ato\a part of the pair. The matching " - "for each file operand is in the order \auid\a:\agid\a, \auid\a:, " - ":\agid\a. For a given file, once a \auid\a or \agid\a mapping is " - "determined it is not overridden by any subsequent match. Unmatched " - "files are silently ignored.]" -"[n:show?Show actions but don't execute.]" -"[r:reference?Omit the explicit ownership operand and use the ownership " - "of \afile\a instead.]:[file]" -"[u:unmapped?Print a diagnostic for each file for which either the " - "\auid\a or \agid\a or both were not mapped.]" -"[v:verbose?Describe changed permissions of all files.]" -"[H:metaphysical?Follow symbolic links for command arguments; otherwise " - "don't follow symbolic links when traversing directories.]" -"[L:logical|follow?Follow symbolic links when traversing directories.]" -"[P:physical|nofollow?Don't follow symbolic links when traversing " - "directories.]" -"[R:recursive?Recursively change ownership of directories and their " - "contents.]" -"[X:test?Canonicalize output for testing.]" - -"\n" -"\n" -; - -static const char usage_3[] = -" file ...\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?All files changed successfully.]" - "[+>0?Unable to change ownership of one or more files.]" -"}" -"[+SEE ALSO?\bchmod\b(1), \btw\b(1), \bgetconf\b(1), \bls\b(1)]" -; - -#if defined(__STDPP__directive) && defined(__STDPP__hide) -__STDPP__directive pragma pp:hide lchown -#else -#define lchown ______lchown -#endif - -#include <cmd.h> -#include <cdt.h> -#include <ls.h> -#include <ctype.h> -#include <fts_fix.h> - -#include "FEATURE/symlink" - -#if defined(__STDPP__directive) && defined(__STDPP__hide) -__STDPP__directive pragma pp:nohide lchown -#else -#undef lchown -#endif - -typedef struct Key_s /* uid/gid key */ -{ - int uid; /* uid */ - int gid; /* gid */ -} Key_t; - -typedef struct Map_s /* uid/gid map */ -{ - Dtlink_t link; /* dictionary link */ - Key_t key; /* key */ - Key_t to; /* map to these */ -} Map_t; - -#define NOID (-1) - -#define OPT_CHOWN (1<<0) /* chown */ -#define OPT_FORCE (1<<1) /* ignore errors */ -#define OPT_GID (1<<2) /* have gid */ -#define OPT_LCHOWN (1<<3) /* lchown */ -#define OPT_SHOW (1<<4) /* show but don't do */ -#define OPT_TEST (1<<5) /* canonicalize output */ -#define OPT_UID (1<<6) /* have uid */ -#define OPT_UNMAPPED (1<<7) /* unmapped file diagnostic */ -#define OPT_VERBOSE (1<<8) /* have uid */ - -extern int lchown(const char*, uid_t, gid_t); - -#if !_lib_lchown - -#ifndef ENOSYS -#define ENOSYS EINVAL -#endif - -int -lchown(const char* path, uid_t uid, gid_t gid) -{ - return ENOSYS; -} - -#endif /* _lib_chown */ - -/* - * parse uid and gid from s - */ - -static void -getids(register char* s, char** e, Key_t* key, int options) -{ - register char* t; - register int n; - char* z; - char buf[64]; - - key->uid = key->gid = NOID; - while (isspace(*s)) - s++; - for (t = s; (n = *t) && n != ':' && n != '.' && !isspace(n); t++); - if (n) - { - options |= OPT_CHOWN; - if ((n = t++ - s) >= sizeof(buf)) - n = sizeof(buf) - 1; - *((s = (char*)memcpy(buf, s, n)) + n) = 0; - } - if (options & OPT_CHOWN) - { - if (*s) - { - if ((n = struid(s)) == NOID) - { - n = (int)strtol(s, &z, 0); - if (*z) - error(ERROR_exit(1), "%s: unknown user", s); - } - key->uid = n; - } - for (s = t; (n = *t) && !isspace(n); t++); - if (n) - { - if ((n = t++ - s) >= sizeof(buf)) - n = sizeof(buf) - 1; - *((s = (char*)memcpy(buf, s, n)) + n) = 0; - } - } - if (*s) - { - if ((n = strgid(s)) == NOID) - { - n = (int)strtol(s, &z, 0); - if (*z) - error(ERROR_exit(1), "%s: unknown group", s); - } - key->gid = n; - } - if (e) - *e = t; -} - -int -b_chgrp(int argc, char** argv, void* context) -{ - register int options = 0; - register char* s; - register Map_t* m; - register FTS* fts; - register FTSENT*ent; - register int i; - Dt_t* map = 0; - int logical = 1; - int flags; - int uid; - int gid; - char* op; - char* usage; - char* t; - Sfio_t* sp; - unsigned long before; - Dtdisc_t mapdisc; - Key_t keys[3]; - Key_t key; - struct stat st; - int (*chownf)(const char*, uid_t, gid_t); - - cmdinit(argc, argv, context, ERROR_CATALOG, ERROR_NOTIFY); - flags = fts_flags() | FTS_TOP | FTS_NOPOSTORDER | FTS_NOSEEDOTDIR; - before = ~0; - if (!(sp = sfstropen())) - error(ERROR_SYSTEM|3, "out of space"); - sfputr(sp, usage_1, -1); - if (error_info.id[2] == 'g') - sfputr(sp, usage_grp_1, -1); - else - { - sfputr(sp, usage_own_1, -1); - options |= OPT_CHOWN; - } - sfputr(sp, usage_2, -1); - if (options & OPT_CHOWN) - sfputr(sp, ERROR_translate(0, 0, 0, "[owner[:group]]"), -1); - else - sfputr(sp, ERROR_translate(0, 0, 0, "[[owner:]group]"), -1); - sfputr(sp, usage_3, -1); - if (!(usage = sfstruse(sp))) - error(ERROR_SYSTEM|3, "out of space"); - for (;;) - { - switch (optget(argv, usage)) - { - case 'b': - if (stat(opt_info.arg, &st)) - error(ERROR_exit(1), "%s: cannot stat", opt_info.arg); - before = st.st_mtime; - continue; - case 'c': - case 'v': - options |= OPT_VERBOSE; - continue; - case 'f': - options |= OPT_FORCE; - continue; - case 'l': - options |= OPT_LCHOWN; - continue; - case 'm': - memset(&mapdisc, 0, sizeof(mapdisc)); - mapdisc.key = offsetof(Map_t, key); - mapdisc.size = sizeof(Key_t); - if (!(map = dtopen(&mapdisc, Dthash))) - error(ERROR_exit(1), "out of space [id map]"); - continue; - case 'n': - options |= OPT_SHOW; - continue; - case 'r': - if (stat(opt_info.arg, &st)) - error(ERROR_exit(1), "%s: cannot stat", opt_info.arg); - uid = st.st_uid; - gid = st.st_gid; - options |= OPT_UID|OPT_GID; - continue; - case 'u': - options |= OPT_UNMAPPED; - continue; - case 'H': - flags |= FTS_META|FTS_PHYSICAL; - logical = 0; - continue; - case 'L': - flags &= ~(FTS_META|FTS_PHYSICAL); - logical = 0; - continue; - case 'P': - flags &= ~FTS_META; - flags |= FTS_PHYSICAL; - logical = 0; - continue; - case 'R': - flags &= ~FTS_TOP; - logical = 0; - continue; - case 'X': - options |= OPT_TEST; - continue; - case ':': - error(2, "%s", opt_info.arg); - continue; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - break; - } - argv += opt_info.index; - argc -= opt_info.index; - if (error_info.errors || argc < 2) - error(ERROR_usage(2), "%s", optusage(NiL)); - s = *argv; - if (logical) - flags &= ~(FTS_META|FTS_PHYSICAL); - if (map) - { - if (streq(s, "-")) - sp = sfstdin; - else if (!(sp = sfopen(NiL, s, "r"))) - error(ERROR_exit(1), "%s: cannot read", s); - while (s = sfgetr(sp, '\n', 1)) - { - getids(s, &t, &key, options); - if (!(m = (Map_t*)dtmatch(map, &key))) - { - if (!(m = (Map_t*)stakalloc(sizeof(Map_t)))) - error(ERROR_exit(1), "out of space [id dictionary]"); - m->key = key; - m->to.uid = m->to.gid = NOID; - dtinsert(map, m); - } - getids(t, NiL, &m->to, options); - } - if (sp != sfstdin) - sfclose(sp); - keys[1].gid = keys[2].uid = NOID; - } - else if (!(options & (OPT_UID|OPT_GID))) - { - getids(s, NiL, &key, options); - if ((uid = key.uid) != NOID) - options |= OPT_UID; - if ((gid = key.gid) != NOID) - options |= OPT_GID; - } - switch (options & (OPT_UID|OPT_GID)) - { - case OPT_UID: - s = ERROR_translate(0, 0, 0, " owner"); - break; - case OPT_GID: - s = ERROR_translate(0, 0, 0, " group"); - break; - case OPT_UID|OPT_GID: - s = ERROR_translate(0, 0, 0, " owner and group"); - break; - default: - s = ""; - break; - } - if (!(fts = fts_open(argv + 1, flags, NiL))) - error(ERROR_system(1), "%s: not found", argv[1]); - while (!sh_checksig(context) && (ent = fts_read(fts))) - switch (ent->fts_info) - { - case FTS_F: - case FTS_D: - case FTS_SL: - case FTS_SLNONE: - anyway: - if ((unsigned long)ent->fts_statp->st_ctime >= before) - break; - if (map) - { - options &= ~(OPT_UID|OPT_GID); - uid = gid = NOID; - keys[0].uid = keys[1].uid = ent->fts_statp->st_uid; - keys[0].gid = keys[2].gid = ent->fts_statp->st_gid; - i = 0; - do - { - if (m = (Map_t*)dtmatch(map, &keys[i])) - { - if (uid == NOID && m->to.uid != NOID) - { - uid = m->to.uid; - options |= OPT_UID; - } - if (gid == NOID && m->to.gid != NOID) - { - gid = m->to.gid; - options |= OPT_GID; - } - } - } while (++i < elementsof(keys) && (uid == NOID || gid == NOID)); - } - else - { - if (!(options & OPT_UID)) - uid = ent->fts_statp->st_uid; - if (!(options & OPT_GID)) - gid = ent->fts_statp->st_gid; - } - if ((options & OPT_UNMAPPED) && (uid == NOID || gid == NOID)) - { - if (uid == NOID && gid == NOID) - error(ERROR_warn(0), "%s: uid and gid not mapped", ent->fts_path); - else if (uid == NOID) - error(ERROR_warn(0), "%s: uid not mapped", ent->fts_path); - else - error(ERROR_warn(0), "%s: gid not mapped", ent->fts_path); - } - if (uid != ent->fts_statp->st_uid && uid != NOID || gid != ent->fts_statp->st_gid && gid != NOID) - { - if ((ent->fts_info & FTS_SL) && (flags & FTS_PHYSICAL) && (options & OPT_LCHOWN)) - { - op = "lchown"; - chownf = lchown; - } - else - { - op = "chown"; - chownf = chown; - } - if (options & (OPT_SHOW|OPT_VERBOSE)) - { - if (options & OPT_TEST) - { - ent->fts_statp->st_uid = 0; - ent->fts_statp->st_gid = 0; - } - sfprintf(sfstdout, "%s uid:%05d->%05d gid:%05d->%05d %s\n", op, ent->fts_statp->st_uid, uid, ent->fts_statp->st_gid, gid, ent->fts_path); - } - if (!(options & OPT_SHOW) && (*chownf)(ent->fts_accpath, uid, gid) && !(options & OPT_FORCE)) - error(ERROR_system(0), "%s: cannot change%s", ent->fts_accpath, s); - } - break; - case FTS_DC: - if (!(options & OPT_FORCE)) - error(ERROR_warn(0), "%s: directory causes cycle", ent->fts_accpath); - break; - case FTS_DNR: - if (!(options & OPT_FORCE)) - error(ERROR_system(0), "%s: cannot read directory", ent->fts_accpath); - goto anyway; - case FTS_DNX: - if (!(options & OPT_FORCE)) - error(ERROR_system(0), "%s: cannot search directory", ent->fts_accpath); - goto anyway; - case FTS_NS: - if (!(options & OPT_FORCE)) - error(ERROR_system(0), "%s: not found", ent->fts_accpath); - break; - } - fts_close(fts); - if (map) - dtclose(map); - return error_info.errors != 0; -} diff --git a/usr/src/lib/libcmd/common/chmod.c b/usr/src/lib/libcmd/common/chmod.c deleted file mode 100644 index 7bfcf09dc8..0000000000 --- a/usr/src/lib/libcmd/common/chmod.c +++ /dev/null @@ -1,308 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * Glenn Fowler - * AT&T Research - * - * chmod - */ - -static const char usage[] = -"[-?\n@(#)$Id: chmod (AT&T Research) 2009-07-02 $\n]" -USAGE_LICENSE -"[+NAME?chmod - change the access permissions of files]" -"[+DESCRIPTION?\bchmod\b changes the permission of each file " - "according to mode, which can be either a symbolic representation " - "of changes to make, or an octal number representing the bit " - "pattern for the new permissions.]" -"[+?Symbolic mode strings consist of one or more comma separated list " - "of operations that can be perfomed on the mode. Each operation is of " - "the form \auser\a \aop\a \aperm\a where \auser\a is zero or more of " - "the following letters:]{" - "[+u?User permission bits.]" - "[+g?Group permission bits.]" - "[+o?Other permission bits.]" - "[+a?All permission bits. This is the default if none are specified.]" - "}" -"[+?The \aperm\a portion consists of zero or more of the following letters:]{" - "[+r?Read permission.]" - "[+s?Setuid when \bu\b is selected for \awho\a and setgid when \bg\b " - "is selected for \awho\a.]" - "[+w?Write permission.]" - "[+x?Execute permission for files, search permission for directories.]" - "[+X?Same as \bx\b except that it is ignored for files that do not " - "already have at least one \bx\b bit set.]" - "[+l?Exclusive lock bit on systems that support it. Group execute " - "must be off.]" - "[+t?Sticky bit on systems that support it.]" - "}" -"[+?The \aop\a portion consists of one or more of the following characters:]{" - "[++?Cause the permission selected to be added to the existing " - "permissions. | is equivalent to +.]" - "[+-?Cause the permission selected to be removed to the existing " - "permissions.]" - "[+=?Cause the permission to be set to the given permissions.]" - "[+&?Cause the permission selected to be \aand\aed with the existing " - "permissions.]" - "[+^?Cause the permission selected to be propagated to more " - "restrictive groups.]" - "}" -"[+?Symbolic modes with the \auser\a portion omitted are subject to " - "\bumask\b(2) settings unless the \b=\b \aop\a or the " - "\b--ignore-umask\b option is specified.]" -"[+?A numeric mode is from one to four octal digits (0-7), " - "derived by adding up the bits with values 4, 2, and 1. " - "Any omitted digits are assumed to be leading zeros. The " - "first digit selects the set user ID (4) and set group ID " - "(2) and save text image (1) attributes. The second digit " - "selects permissions for the user who owns the file: read " - "(4), write (2), and execute (1); the third selects permissions" - "for other users in the file's group, with the same values; " - "and the fourth for other users not in the file's group, with " - "the same values.]" - -"[+?For symbolic links, by default, \bchmod\b changes the mode on the file " - "referenced by the symbolic link, not on the symbolic link itself. " - "The \b-h\b options can be specified to change the mode of the link. " - "When traversing directories with \b-R\b, \bchmod\b either follows " - "symbolic links or does not follow symbolic links, based on the " - "options \b-H\b, \b-L\b, and \b-P\b. The configuration parameter " - "\bPATH_RESOLVE\b determines the default behavior if none of these " - "options is specified.]" - -"[+?When the \b-c\b or \b-v\b options are specified, change notifications " - "are written to standard output using the format, " - "\b%s: mode changed to %0.4o (%s)\b, with arguments of the " - "pathname, the numeric mode, and the resulting permission bits as " - "would be displayed by the \bls\b command.]" - -"[+?For backwards compatibility, if an invalid option is given that is a valid " - "symbolic mode specification, \bchmod\b treats this as a mode " - "specification rather than as an option specification.]" - -"[H:metaphysical?Follow symbolic links for command arguments; otherwise don't " - "follow symbolic links when traversing directories.]" -"[L:logical|follow?Follow symbolic links when traversing directories.]" -"[P:physical|nofollow?Don't follow symbolic links when traversing directories.]" -"[R:recursive?Change the mode for files in subdirectories recursively.]" -"[c:changes?Describe only files whose permission actually change.]" -"[f:quiet|silent?Do not report files whose permissioins fail to change.]" -"[h:symlink?Change the mode of the symbolic links on systems that " - "support this.]" -"[i:ignore-umask?Ignore the \bumask\b(2) value in symbolic mode " - "expressions. This is probably how you expect \bchmod\b to work.]" -"[n:show?Show actions but do not change any file modes.]" -"[F:reference?Omit the \amode\a operand and use the mode of \afile\a " - "instead.]:[file]" -"[v:verbose?Describe changed permissions of all files.]" -"\n" -"\nmode file ...\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?All files changed successfully.]" - "[+>0?Unable to change mode of one or more files.]" -"}" -"[+SEE ALSO?\bchgrp\b(1), \bchown\b(1), \btw\b(1), \bgetconf\b(1), \bls\b(1), " - "\bumask\b(2)]" -; - - -#if defined(__STDPP__directive) && defined(__STDPP__hide) -__STDPP__directive pragma pp:hide lchmod -#else -#define lchmod ______lchmod -#endif - -#include <cmd.h> -#include <ls.h> -#include <fts_fix.h> - -#include "FEATURE/symlink" - -#if defined(__STDPP__directive) && defined(__STDPP__hide) -__STDPP__directive pragma pp:nohide lchmod -#else -#undef lchmod -#endif - -extern int lchmod(const char*, mode_t); - -int -b_chmod(int argc, char** argv, void* context) -{ - register int mode; - register int force = 0; - register int flags; - register char* amode = 0; - register FTS* fts; - register FTSENT*ent; - char* last; - int (*chmodf)(const char*, mode_t); - int logical = 1; - int notify = 0; - int ignore = 0; - int show = 0; -#if _lib_lchmod - int chlink = 0; -#endif - struct stat st; - - cmdinit(argc, argv, context, ERROR_CATALOG, ERROR_NOTIFY); - flags = fts_flags() | FTS_TOP | FTS_NOPOSTORDER | FTS_NOSEEDOTDIR; - - /* - * NOTE: we diverge from the normal optget boilerplate - * to allow `chmod -x etc' to fall through - */ - - for (;;) - { - switch (optget(argv, usage)) - { - case 'c': - notify = 1; - continue; - case 'f': - force = 1; - continue; - case 'h': -#if _lib_lchmod - chlink = 1; -#endif - continue; - case 'i': - ignore = 1; - continue; - case 'n': - show = 1; - continue; - case 'v': - notify = 2; - continue; - case 'F': - if (stat(opt_info.arg, &st)) - error(ERROR_exit(1), "%s: cannot stat", opt_info.arg); - mode = st.st_mode; - amode = ""; - continue; - case 'H': - flags |= FTS_META|FTS_PHYSICAL; - logical = 0; - continue; - case 'L': - flags &= ~(FTS_META|FTS_PHYSICAL); - logical = 0; - continue; - case 'P': - flags &= ~FTS_META; - flags |= FTS_PHYSICAL; - logical = 0; - continue; - case 'R': - flags &= ~FTS_TOP; - logical = 0; - continue; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - break; - } - argv += opt_info.index; - if (error_info.errors || !*argv || !amode && !*(argv + 1)) - error(ERROR_usage(2), "%s", optusage(NiL)); - if (logical) - flags &= ~(FTS_META|FTS_PHYSICAL); - if (ignore) - ignore = umask(0); - if (amode) - amode = 0; - else - { - amode = *argv++; - mode = strperm(amode, &last, 0); - if (*last) - { - if (ignore) - umask(ignore); - error(ERROR_exit(1), "%s: invalid mode", amode); - } - } - chmodf = -#if _lib_lchmod - chlink ? lchmod : -#endif - chmod; - if (!(fts = fts_open(argv, flags, NiL))) - { - if (ignore) - umask(ignore); - error(ERROR_system(1), "%s: not found", *argv); - } - while (!sh_checksig(context) && (ent = fts_read(fts))) - switch (ent->fts_info) - { - case FTS_SL: - if (chmodf == chmod) - { - if (!(flags & FTS_PHYSICAL) || (flags & FTS_META) && ent->fts_level == 1) - fts_set(NiL, ent, FTS_FOLLOW); - break; - } - /*FALLTHROUGH*/ - case FTS_F: - case FTS_D: - case FTS_SLNONE: - anyway: - if (amode) - mode = strperm(amode, &last, ent->fts_statp->st_mode); - if (show || (*chmodf)(ent->fts_accpath, mode) >= 0) - { - if (notify == 2 || notify == 1 && (mode&S_IPERM) != (ent->fts_statp->st_mode&S_IPERM)) - sfprintf(sfstdout, "%s: mode changed to %0.4o (%s)\n", ent->fts_path, mode, fmtmode(mode, 1)+1); - } - else if (!force) - error(ERROR_system(0), "%s: cannot change mode", ent->fts_accpath); - break; - case FTS_DC: - if (!force) - error(ERROR_warn(0), "%s: directory causes cycle", ent->fts_accpath); - break; - case FTS_DNR: - if (!force) - error(ERROR_system(0), "%s: cannot read directory", ent->fts_accpath); - goto anyway; - case FTS_DNX: - if (!force) - error(ERROR_system(0), "%s: cannot search directory", ent->fts_accpath); - goto anyway; - case FTS_NS: - if (!force) - error(ERROR_system(0), "%s: not found", ent->fts_accpath); - break; - } - fts_close(fts); - if (ignore) - umask(ignore); - return error_info.errors != 0; -} diff --git a/usr/src/lib/libcmd/common/chown.c b/usr/src/lib/libcmd/common/chown.c deleted file mode 100644 index 4e0bea0a7b..0000000000 --- a/usr/src/lib/libcmd/common/chown.c +++ /dev/null @@ -1,39 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * Glenn Fowler - * AT&T Research - * - * chown - */ - -static const char id[] = "\n@(#)$Id: chown (AT&T Research) 1997-11-11 $\0\n"; - -#include <cmd.h> - -int -b_chown(int argc, char** argv, void* context) -{ - NoP(id[0]); - return b_chgrp(argc, argv, context); -} diff --git a/usr/src/lib/libcmd/common/cksum.c b/usr/src/lib/libcmd/common/cksum.c deleted file mode 100644 index c42e865b09..0000000000 --- a/usr/src/lib/libcmd/common/cksum.c +++ /dev/null @@ -1,632 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * Glenn Fowler - * AT&T Research - * - * sum -- list file checksum and size - */ - -static const char usage[] = -"[-?\n@(#)$Id: sum (AT&T Research) 2009-11-28 $\n]" -USAGE_LICENSE -"[+NAME?cksum,md5sum,sum - print file checksum and block count]" -"[+DESCRIPTION?\bsum\b lists the checksum, and for most methods the block" -" count, for each file argument. The standard input is read if there are" -" no \afile\a arguments. \bgetconf UNIVERSE\b determines the default" -" \bsum\b method: \batt\b for the \batt\b universe, \bbsd\b otherwise." -" The default for the other commands is the command name itself. The" -" \batt\b method is a true sum, all others are order dependent.]" -"[+?Method names consist of a leading identifier and 0 or more options" -" separated by -.]" -"[+?\bgetconf PATH_RESOLVE\b determines how symbolic links are handled. This" -" can be explicitly overridden by the \b--logical\b, \b--metaphysical\b," -" and \b--physical\b options below. \bPATH_RESOLVE\b can be one of:]{" -" [+logical?Follow all symbolic links.]" -" [+metaphysical?Follow command argument symbolic links," -" otherwise don't follow.]" -" [+physical?Don't follow symbolic links.]" -"}" - -"[a:all?List the checksum for all files. Use with \b--total\b to list both" -" individual and total checksums and block counts.]" -"[b:binary?Read files in binary mode. This is the default.]" -"[B:scale?Block count scale (bytes per block) override for methods that" -" include size in the output. The default is method specific.]#[scale]" -"[c:check?Each \afile\a is interpreted as the output from a previous \bsum\b." -" If \b--header\b or \b--permissions\b was specified in the previous" -" \bsum\b then the checksum method is automatically determined," -" otherwise \b--method\b must be specified. The listed checksum is" -" compared with the current value and a warning is issued for each file" -" that does not match. If \afile\a was generated by \b--permissions\b" -" then the file mode, user and group are also checked. Empty lines," -" lines starting with \b#<space>\b, or the line \b#\b are ignored. Lines" -" containing no blanks are interpreted as [no]]\aname\a[=\avalue\a]]" -" options:]{" -" [+method=name?Checksum method to apply to subsequent lines.]" -" [+permissions?Subsequent lines were generated with" -" \b--permissions\b.]" -"}" -"[h:header?Print the checksum method as the first output line. Used with" -" \b--check\b and \b--permissions\b.]" -"[l:list?Each \afile\a is interpreted as a list of files, one per line," -" that is checksummed.]" -"[p:permissions?If \b--check\b is not specified then list the file" -" mode, user and group between the checksum and path. User and group" -" matching the caller are output as \b-\b. If \b--check\b is" -" specified then the mode, user and group for each path in \afile\a" -" are updated if necessary to match those in \afile\a. A warning is" -" printed on the standard error for each changed file.]" -"[R:recursive?Recursively checksum the contents of directories.]" -"[S:silent|status?No output for \b--check\b; 0 exit status means all sums" -" matched, non-0 means at least one sum failed to match. Ignored for" -" \b--permissions\b.]" -"[t:total?List only the total checksum and block count of all files." -" \b--all\b \b--total\b lists each checksum and the total. The" -" total checksum and block count may be different from the checksum" -" and block count of the catenation of all files due to partial" -" blocks that may occur when the files are treated separately.]" -"[T:text?Read files in text mode (i.e., treat \b\\r\\n\b as \b\\n\b).]" -"[w!:warn?Warn about invalid \b--check\b lines.]" -"[x:method|algorithm?Specifies the checksum \amethod\a to" -" apply. Parenthesized method options are readonly implementation" -" details.]:[method]{\fmethods\f}" -"[L:logical|follow?Follow symbolic links when traversing directories. The" -" default is determined by \bgetconf PATH_RESOLVE\b.]" -"[H:metaphysical?Follow command argument symbolic links, otherwise don't" -" follow symbolic links when traversing directories. The default is" -" determined by \bgetconf PATH_RESOLVE\b.]" -"[P:physical?Don't follow symbolic links when traversing directories. The" -" default is determined by \bgetconf PATH_RESOLVE\b.]" -"[r:bsd?Equivalent to \b--method=bsd --scale=512\b for compatibility with" -" other \bsum\b(1) implementations.]" -"[s:sysv?Equivalent to \b--method=sys5\b for compatibility with other" -" \bsum\b(1) implementations.]" - -"\n" -"\n[ file ... ]\n" -"\n" - -"[+SEE ALSO?\bgetconf\b(1), \btw\b(1), \buuencode\b(1)]" -; - -#include <cmd.h> -#include <sum.h> -#include <ls.h> -#include <modex.h> -#include <fts_fix.h> -#include <error.h> - -typedef struct State_s /* program state */ -{ - int all; /* list all items */ - Sfio_t* check; /* check previous output */ - int flags; /* sumprint() SUM_* flags */ - gid_t gid; /* caller gid */ - int header; /* list method on output */ - int list; /* list file name too */ - Sum_t* oldsum; /* previous sum method */ - int permissions; /* include mode,uer,group */ - int haveperm; /* permissions in the input */ - int recursive; /* recursively descend dirs */ - size_t scale; /* scale override */ - unsigned long size; /* combined size of all files */ - int silent; /* silent check, 0 exit if ok */ - int (*sort)(FTSENT* const*, FTSENT* const*); - Sum_t* sum; /* sum method */ - int text; /* \r\n == \n */ - int total; /* list totals only */ - uid_t uid; /* caller uid */ - int warn; /* invalid check line warnings */ -} State_t; - -static void verify(State_t*, char*, char*, Sfio_t*); - -/* - * open path for read mode - */ - -static Sfio_t* -openfile(const char* path, const char* mode) -{ - Sfio_t* sp; - - if (!path || streq(path, "-") || streq(path, "/dev/stdin") || streq(path, "/dev/fd/0")) - { - sp = sfstdin; - sfopen(sp, NiL, mode); - } - else if (!(sp = sfopen(NiL, path, mode))) - error(ERROR_SYSTEM|2, "%s: cannot read", path); - return sp; -} - -/* - * close an openfile() stream - */ - -static int -closefile(Sfio_t* sp) -{ - return sp == sfstdin ? 0 : sfclose(sp); -} - -/* - * compute and print sum on an open file - */ - -static void -pr(State_t* state, Sfio_t* op, Sfio_t* ip, char* file, int perm, struct stat* st, Sfio_t* check) -{ - register char* p; - register char* r; - register char* e; - register int peek; - struct stat ss; - - if (check) - { - state->oldsum = state->sum; - while (p = sfgetr(ip, '\n', 1)) - verify(state, p, file, check); - state->sum = state->oldsum; - if (state->warn && !sfeof(ip)) - error(2, "%s: last line incomplete", file); - return; - } - suminit(state->sum); - if (state->text) - { - peek = 0; - while (p = sfreserve(ip, SF_UNBOUND, 0)) - { - e = p + sfvalue(ip); - if (peek) - { - peek = 0; - if (*p != '\n') - sumblock(state->sum, "\r", 1); - } - while (r = memchr(p, '\r', e - p)) - { - if (++r >= e) - { - e--; - peek = 1; - break; - } - sumblock(state->sum, p, r - p - (*r == '\n')); - p = r; - } - sumblock(state->sum, p, e - p); - } - if (peek) - sumblock(state->sum, "\r", 1); - } - else - while (p = sfreserve(ip, SF_UNBOUND, 0)) - sumblock(state->sum, p, sfvalue(ip)); - if (sfvalue(ip)) - error(ERROR_SYSTEM|2, "%s: read error", file); - sumdone(state->sum); - if (!state->total || state->all) - { - sumprint(state->sum, op, state->flags|SUM_SCALE, state->scale); - if (perm >= 0) - { - if (perm) - { - if (!st && fstat(sffileno(ip), st = &ss)) - error(ERROR_SYSTEM|2, "%s: cannot stat", file); - else - sfprintf(sfstdout, " %04o %s %s", - modex(st->st_mode & S_IPERM), - (st->st_uid != state->uid && ((st->st_mode & S_ISUID) || (st->st_mode & S_IRUSR) && !(st->st_mode & (S_IRGRP|S_IROTH)) || (st->st_mode & S_IXUSR) && !(st->st_mode & (S_IXGRP|S_IXOTH)))) ? fmtuid(st->st_uid) : "-", - (st->st_gid != state->gid && ((st->st_mode & S_ISGID) || (st->st_mode & S_IRGRP) && !(st->st_mode & S_IROTH) || (st->st_mode & S_IXGRP) && !(st->st_mode & S_IXOTH))) ? fmtgid(st->st_gid) : "-"); - } - if (ip != sfstdin) - sfprintf(op, " %s", file); - sfputc(op, '\n'); - } - } -} - -/* - * verify previous sum output - */ - -static void -verify(State_t* state, register char* s, char* check, Sfio_t* rp) -{ - register char* t; - char* e; - char* file; - int attr; - int mode; - int uid; - int gid; - Sfio_t* sp; - struct stat st; - - if (!*s || *s == '#' && (!*(s + 1) || *(s + 1) == ' ' || *(s + 1) == '\t')) - return; - if (t = strchr(s, ' ')) - { - if ((t - s) > 10 || !(file = strchr(t + 1, ' '))) - file = t; - *file++ = 0; - attr = 0; - if ((mode = strtol(file, &e, 8)) && *e == ' ' && (e - file) == 4) - { - mode = modei(mode); - if (t = strchr(++e, ' ')) - { - if (*e == '-' && (t - e) == 1) - uid = -1; - else - { - *t = 0; - uid = struid(e); - *t = ' '; - } - if (e = strchr(++t, ' ')) - { - if (*t == '-' && (e - t) == 1) - gid = -1; - else - { - *e = 0; - gid = struid(t); - *e = ' '; - } - file = e + 1; - attr = 1; - } - } - } - if (sp = openfile(file, "rb")) - { - pr(state, rp, sp, file, -1, NiL, NiL); - if (!(t = sfstruse(rp))) - error(ERROR_SYSTEM|3, "out of space"); - if (!streq(s, t)) - { - if (state->silent) - error_info.errors++; - else - error(2, "%s: checksum changed", file); - } - else if (attr) - { - if (fstat(sffileno(sp), &st)) - { - if (state->silent) - error_info.errors++; - else - error(ERROR_SYSTEM|2, "%s: cannot stat", file); - } - else - { - if (uid < 0 || uid == st.st_uid) - uid = -1; - else if (!state->permissions) - { - if (state->silent) - error_info.errors++; - else - error(2, "%s: uid should be %s", file, fmtuid(uid)); - } - if (gid < 0 || gid == st.st_gid) - gid = -1; - else if (!state->permissions) - { - if (state->silent) - error_info.errors++; - else - error(2, "%s: gid should be %s", file, fmtgid(gid)); - } - if (state->permissions && (uid >= 0 || gid >= 0)) - { - if (chown(file, uid, gid) < 0) - { - if (uid < 0) - error(ERROR_SYSTEM|2, "%s: cannot change group to %s", file, fmtgid(gid)); - else if (gid < 0) - error(ERROR_SYSTEM|2, "%s: cannot change user to %s", file, fmtuid(uid)); - else - error(ERROR_SYSTEM|2, "%s: cannot change user to %s and group to %s", file, fmtuid(uid), fmtgid(gid)); - } - else - { - if (uid < 0) - error(1, "%s: changed group to %s", file, fmtgid(gid)); - else if (gid < 0) - error(1, "%s: changed user to %s", file, fmtuid(uid)); - else - error(1, "%s: changed user to %s and group to %s", file, fmtuid(uid), fmtgid(gid)); - } - } - if ((st.st_mode & S_IPERM) ^ mode) - { - if (state->permissions) - { - if (chmod(file, mode) < 0) - error(ERROR_SYSTEM|2, "%s: cannot change mode to %s", file, fmtmode(mode, 0)); - else - error(ERROR_SYSTEM|1, "%s: changed mode to %s", file, fmtmode(mode, 0)); - } - else if (state->silent) - error_info.errors++; - else - error(2, "%s: mode should be %s", file, fmtmode(mode, 0)); - } - } - } - closefile(sp); - } - } - else if (strneq(s, "method=", 7)) - { - s += 7; - if (state->sum != state->oldsum) - sumclose(state->sum); - if (!(state->sum = sumopen(s))) - error(3, "%s: %s: unknown checksum method", check, s); - } - else if (streq(s, "permissions")) - state->haveperm = 1; - else - error(1, "%s: %s: unknown option", check, s); -} - -/* - * sum the list of files in lp - */ - -static void -list(State_t* state, register Sfio_t* lp) -{ - register char* file; - register Sfio_t* sp; - - while (file = sfgetr(lp, '\n', 1)) - if (sp = openfile(file, state->check ? "rt" : "rb")) - { - pr(state, sfstdout, sp, file, state->permissions, NiL, state->check); - closefile(sp); - } -} - -/* - * order child entries - */ - -static int -order(FTSENT* const* f1, FTSENT* const* f2) -{ - return strcoll((*f1)->fts_name, (*f2)->fts_name); -} - -/* - * optget() info discipline function - */ - -static int -optinfo(Opt_t* op, Sfio_t* sp, const char* s, Optdisc_t* dp) -{ - if (streq(s, "methods")) - return sumusage(sp); - return 0; -} - -int -b_cksum(int argc, register char** argv, void* context) -{ - register int flags; - char* file; - char* method; - Sfio_t* sp; - FTS* fts; - FTSENT* ent; - int logical; - Optdisc_t optdisc; - State_t state; - - cmdinit(argc, argv, context, ERROR_CATALOG, ERROR_NOTIFY); - memset(&state, 0, sizeof(state)); - flags = fts_flags() | FTS_TOP | FTS_NOPOSTORDER; - state.flags = SUM_SIZE; - state.warn = 1; - logical = 1; - method = 0; - optinit(&optdisc, optinfo); - for (;;) - { - switch (optget(argv, usage)) - { - case 'a': - state.all = 1; - continue; - case 'b': - state.text = 0; - continue; - case 'B': - state.scale = opt_info.num; - continue; - case 'c': - if (!(state.check = sfstropen())) - error(3, "out of space [check]"); - continue; - case 'h': - state.header = 1; - continue; - case 'l': - state.list = 1; - continue; - case 'p': - state.permissions = 1; - continue; - case 'r': - method = "bsd"; - state.scale = 512; - state.flags |= SUM_LEGACY; - continue; - case 'R': - flags &= ~FTS_TOP; - state.recursive = 1; - state.sort = order; - logical = 0; - continue; - case 's': - method = "sys5"; - continue; - case 'S': - state.silent = opt_info.num; - continue; - case 't': - state.total = 1; - continue; - case 'w': - state.warn = opt_info.num; - continue; - case 'x': - method = opt_info.arg; - continue; - case 'H': - flags |= FTS_META|FTS_PHYSICAL; - logical = 0; - continue; - case 'L': - flags &= ~(FTS_META|FTS_PHYSICAL); - logical = 0; - continue; - case 'P': - flags &= ~FTS_META; - flags |= FTS_PHYSICAL; - logical = 0; - continue; - case 'T': - state.text = 1; - continue; - case '?': - error(ERROR_USAGE|4, "%s", opt_info.arg); - break; - case ':': - error(2, "%s", opt_info.arg); - break; - } - break; - } - argv += opt_info.index; - if (error_info.errors) - error(ERROR_USAGE|4, "%s", optusage(NiL)); - - /* - * check the method - */ - - if (method && !(state.sum = sumopen(method))) - error(3, "%s: unknown checksum method", method); - if (!state.sum && !(state.sum = sumopen(error_info.id)) && !(state.sum = sumopen(astconf("UNIVERSE", NiL, NiL)))) - state.sum = sumopen(NiL); - - /* - * do it - */ - - if (logical) - { - flags &= ~(FTS_META|FTS_PHYSICAL); - flags |= FTS_SEEDOTDIR; - } - if (state.permissions) - { - state.uid = geteuid(); - state.gid = getegid(); - state.silent = 0; - } - if (!state.check && (state.header || state.permissions)) - { - sfprintf(sfstdout, "method=%s\n", state.sum->name); - if (state.permissions) - sfprintf(sfstdout, "permissions\n"); - } - if (state.list) - { - if (*argv) - { - while (file = *argv++) - if (sp = openfile(file, "rt")) - { - list(&state, sp); - closefile(sp); - } - } - else if (sp = openfile(NiL, "rt")) - { - list(&state, sp); - closefile(sp); - } - } - else if (!*argv && !state.recursive) - pr(&state, sfstdout, sfstdin, "/dev/stdin", state.permissions, NiL, state.check); - else if (!(fts = fts_open(argv, flags, state.sort))) - error(ERROR_system(1), "%s: not found", *argv); - else - { - while (!sh_checksig(context) && (ent = fts_read(fts))) - switch (ent->fts_info) - { - case FTS_SL: - if (!(flags & FTS_PHYSICAL) || (flags & FTS_META) && ent->fts_level == 1) - fts_set(NiL, ent, FTS_FOLLOW); - break; - case FTS_F: - if (sp = openfile(ent->fts_accpath, "rb")) - { - pr(&state, sfstdout, sp, ent->fts_path, state.permissions, ent->fts_statp, state.check); - closefile(sp); - } - break; - case FTS_DC: - error(ERROR_warn(0), "%s: directory causes cycle", ent->fts_accpath); - break; - case FTS_DNR: - error(ERROR_system(0), "%s: cannot read directory", ent->fts_accpath); - break; - case FTS_DNX: - error(ERROR_system(0), "%s: cannot search directory", ent->fts_accpath); - break; - case FTS_NS: - error(ERROR_system(0), "%s: not found", ent->fts_accpath); - break; - } - fts_close(fts); - } - if (state.total) - { - sumprint(state.sum, sfstdout, state.flags|SUM_TOTAL|SUM_SCALE, state.scale); - sfputc(sfstdout, '\n'); - } - sumclose(state.sum); - return error_info.errors != 0; -} diff --git a/usr/src/lib/libcmd/common/cmd.h b/usr/src/lib/libcmd/common/cmd.h deleted file mode 100644 index a78755bbc0..0000000000 --- a/usr/src/lib/libcmd/common/cmd.h +++ /dev/null @@ -1,163 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * AT&T Research - * - * builtin cmd definitions - */ - -#ifndef _CMD_H -#define _CMD_H - -#include <ast.h> -#include <error.h> -#include <stak.h> -#include <shcmd.h> - -#define cmdinit _cmd_init - -#define ERROR_CALLBACK ERROR_SET - -#if _BLD_cmd && defined(__EXPORT__) -#define extern __EXPORT__ -#endif - -#include <cmdext.h> - -#undef extern - -#if defined(CMD_BUILTIN) && !defined(CMD_STANDALONE) -#define CMD_STANDALONE CMD_BUILTIN -#endif - -#ifdef CMD_STANDALONE - -#define CMD_CONTEXT(c) ((Shbltin_t*)0) - -#if CMD_DYNAMIC - -#include <dlldefs.h> - -#else - -extern int CMD_STANDALONE(int, char**, void*); - -#endif - -#ifndef CMD_BUILTIN - -/* - * command initialization - */ - -static int -cmdinit(int argc, register char** argv, void* context, const char* catalog, int flags) -{ - register char* cp; - register char* pp; - - if (cp = strrchr(argv[0], '/')) - cp++; - else - cp = argv[0]; - if (pp = strrchr(cp, '_')) - cp = pp + 1; - error_info.id = cp; - if (!error_info.catalog) - error_info.catalog = (char*)catalog; - opt_info.index = 0; - if (context) - error_info.flags |= flags & ~(ERROR_CALLBACK|ERROR_NOTIFY); - return 0; -} - -#endif - -int -main(int argc, char** argv) -{ -#if CMD_DYNAMIC - register char* s; - register char* t; - void* dll; - Shbltin_f fun; - char buf[64]; - - if (s = strrchr(argv[0], '/')) - s++; - else if (!(s = argv[0])) - return 127; - if ((t = strrchr(s, '_')) && *++t) - s = t; - buf[0] = '_'; - buf[1] = 'b'; - buf[2] = '_'; - strncpy(buf + 3, s, sizeof(buf) - 4); - buf[sizeof(buf) - 1] = 0; - if (t = strchr(buf, '.')) - *t = 0; - for (;;) - { - if (dll = dlopen(NiL, RTLD_LAZY)) - { - if (fun = (Shbltin_f)dlsym(dll, buf + 1)) - break; - if (fun = (Shbltin_f)dlsym(dll, buf)) - break; - } - if (dll = dllplug(NiL, "cmd", NiL, RTLD_LAZY, NiL, 0)) - { - if (fun = (Shbltin_f)dlsym(dll, buf + 1)) - break; - if (fun = (Shbltin_f)dlsym(dll, buf)) - break; - } - return 127; - } - return (*fun)(argc, argv, NiL); -#else - return CMD_STANDALONE(argc, argv, NiL); -#endif -} - -#else - -#undef cmdinit -#ifdef _MSC_VER -#define CMD_CONTEXT(p) ((Shbltin_t*)(p)) -#define cmdinit(a,b,c,d,e) do{if(_cmd_init(a,b,c,d,e))return -1;}while(0) -#else -#define CMD_CONTEXT(p) (((p)&&((Shbltin_t*)(p))->version>=20071012&&((Shbltin_t*)(p))->version<20350101)?((Shbltin_t*)(p)):0) -#define cmdinit(a,b,c,d,e) do{if((c)&&!CMD_CONTEXT(c))c=0;if(_cmd_init(a,b,c,d,e))return -1;}while(0) -#endif - -#if _BLD_cmd && defined(__EXPORT__) -#define extern extern __EXPORT__ -#endif - -extern int _cmd_init(int, char**, void*, const char*, int); - -#undef extern - -#endif - -#endif diff --git a/usr/src/lib/libcmd/common/cmdinit.c b/usr/src/lib/libcmd/common/cmdinit.c deleted file mode 100644 index 70a65cd1b2..0000000000 --- a/usr/src/lib/libcmd/common/cmdinit.c +++ /dev/null @@ -1,75 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * command initialization - */ - -#include <cmd.h> -#include <shcmd.h> - -int -_cmd_init(int argc, char** argv, void* context, const char* catalog, int flags) -{ - register char* cp; - - if (argc <= 0) - return -1; - if (context) - { - if (flags & ERROR_CALLBACK) - { - flags &= ~ERROR_CALLBACK; - flags |= ERROR_NOTIFY; - } - else if (flags & ERROR_NOTIFY) - { - ((Shbltin_t*)(context))->notify = 1; - flags &= ~ERROR_NOTIFY; - } - error_info.flags |= flags; - } - if (cp = strrchr(argv[0], '/')) - cp++; - else - cp = argv[0]; - error_info.id = cp; - if (!error_info.catalog) - error_info.catalog = catalog; - opt_info.index = 0; - return 0; -} - -#if __OBSOLETE__ < 20080101 - -#if defined(__EXPORT__) -#define extern __EXPORT__ -#endif - -#undef cmdinit - -extern void -cmdinit(char** argv, void* context, const char* catalog, int flags) -{ - _cmd_init(0, argv, context, catalog, flags); -} - -#endif diff --git a/usr/src/lib/libcmd/common/cmp.c b/usr/src/lib/libcmd/common/cmp.c deleted file mode 100644 index db3f8de4b4..0000000000 --- a/usr/src/lib/libcmd/common/cmp.c +++ /dev/null @@ -1,289 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * Glenn Fowler - * AT&T Bell Laboratories - * - * cmp - */ - -static const char usage[] = -"[-?\n@(#)$Id: cmp (AT&T Research) 2009-01-05 $\n]" -USAGE_LICENSE -"[+NAME?cmp - compare two files]" -"[+DESCRIPTION?\bcmp\b compares two files \afile1\a and \afile2\a. " - "\bcmp\b writes no output if the files are the same. By default, " - "if the files differ, the byte and line number at which the " - "first difference occurred are written to standard output. Bytes " - "and lines are numbered beginning with 1.]" -"[+?If \askip1\a or \askip2\a are specified, or the \b-i\b option is " - "specified, initial bytes of the corresponding file are skipped " - "before beginning the compare. The skip values are in bytes or " - "can have a suffix of \bk\b for kilobytes or \bm\b for megabytes.]" -"[+?If either \afile1\a or \afiles2\a is \b-\b, \bcmp\b " - "uses standard input starting at the current location.]" -"[c:print-chars?Writes control characters as a \b^\b followed by a letter of " - "the alphabet and precede characters that have the high bit set with " - "\bM-\b as with \bcat\b(1).]" -"[i:ignore-initial]#[skip:=0?Sets default skip values for the operands " - "\askip1\a and \askip2\a to \askip\a.]" -"[l:verbose?Write the decimal byte number and the differing bytes (in octal) " - "for each difference.]" -"[s:quiet|silent?Write nothing for differing files; return non-zero " - "exit status only.] ]" -"\n" -"\nfile1 file2 [skip1 [skip2]]\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?The files or portions compared are identical.]" - "[+1?The files are different.]" - "[+>1?An error occurred.]" -"}" -"[+SEE ALSO?\bcomm\b(1), \bdiff\b(1), \bcat\b(1)]" -; - - -#include <cmd.h> -#include <ls.h> -#include <ctype.h> - -#define CMP_VERBOSE 1 -#define CMP_SILENT 2 -#define CMP_CHARS 4 - -#define cntl(x) (x&037) -#define printchar(c) ((c) ^ ('A'-cntl('A'))) - -static void outchar(Sfio_t *out, register int c, int delim) -{ - if(c&0200) - { - sfputc(out,'M'); - sfputc(out,'-'); - c &= ~0200; - } - else if(!isprint(c)) - { - sfputc(out,'^'); - c = printchar(c); - } - sfputc(out,c); - sfputc(out,delim); -} - -/* - * compare two files - */ - -static int -cmp(const char* file1, Sfio_t* f1, const char* file2, Sfio_t* f2, int flags) -{ - register int c1; - register int c2; - register unsigned char* p1 = 0; - register unsigned char* p2 = 0; - register Sfoff_t lines = 1; - register unsigned char* e1 = 0; - register unsigned char* e2 = 0; - Sfoff_t pos = 0; - int ret = 0; - unsigned char* last; - - for (;;) - { - if ((c1 = e1 - p1) <= 0) - { - if (!(p1 = (unsigned char*)sfreserve(f1, SF_UNBOUND, 0)) || (c1 = sfvalue(f1)) <= 0) - { - if ((e2 - p2) > 0 || sfreserve(f2, SF_UNBOUND, 0) && sfvalue(f2) > 0) - { - ret = 1; - if (!(flags & CMP_SILENT)) - error(ERROR_exit(1), "EOF on %s", file1); - } - return(ret); - } - e1 = p1 + c1; - } - if ((c2 = e2 - p2) <= 0) - { - if (!(p2 = (unsigned char*)sfreserve(f2, SF_UNBOUND, 0)) || (c2 = sfvalue(f2)) <= 0) - { - if (!(flags & CMP_SILENT)) - error(ERROR_exit(1), "EOF on %s", file2); - return(1); - } - e2 = p2 + c2; - } - if (c1 > c2) - c1 = c2; - pos += c1; - if (flags & CMP_SILENT) - { - if (memcmp(p1, p2, c1)) - return(1); - p1 += c1; - p2 += c1; - } - else - { - last = p1 + c1; - while (p1 < last) - { - if ((c1 = *p1++) != *p2++) - { - if (flags) - { - ret = 1; - if(flags&CMP_CHARS) - { - sfprintf(sfstdout, "%6I*d ", sizeof(pos), pos - (last - p1)); - outchar(sfstdout,c1,' '); - outchar(sfstdout,*(p2-1),'\n'); - } - else - sfprintf(sfstdout, "%6I*d %3o %3o\n", sizeof(pos), pos - (last - p1), c1, *(p2 - 1)); - } - else - { - sfprintf(sfstdout, "%s %s differ: char %I*d, line %I*u\n", file1, file2, sizeof(pos), pos - (last - p1), sizeof(lines), lines); - return(1); - } - } - if (c1 == '\n') - lines++; - } - } - } -} - -int -b_cmp(int argc, register char** argv, void* context) -{ - char* s; - char* e; - Sfio_t* f1 = 0; - Sfio_t* f2 = 0; - char* file1; - char* file2; - int n; - off_t o1 = 0; - off_t o2 = 0; - struct stat s1; - struct stat s2; - - int flags = 0; - - NoP(argc); - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - while (n = optget(argv, usage)) switch (n) - { - case 'l': - flags |= CMP_VERBOSE; - break; - case 's': - flags |= CMP_SILENT; - break; - case 'c': - flags |= CMP_CHARS; - break; - case 'i': - o1 = o2 = opt_info.num; - break; - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - argv += opt_info.index; - if (error_info.errors || !(file1 = *argv++) || !(file2 = *argv++)) - error(ERROR_usage(2), "%s", optusage(NiL)); - n = 2; - if (streq(file1, "-")) - f1 = sfstdin; - else if (!(f1 = sfopen(NiL, file1, "r"))) - { - if (!(flags & CMP_SILENT)) - error(ERROR_system(0), "%s: cannot open", file1); - goto done; - } - if (streq(file2, "-")) - f2 = sfstdin; - else if (!(f2 = sfopen(NiL, file2, "r"))) - { - if (!(flags & CMP_SILENT)) - error(ERROR_system(0), "%s: cannot open", file2); - goto done; - } - if (s = *argv++) - { - o1 = strtol(s, &e, 0); - if (*e) - { - error(ERROR_exit(0), "%s: %s: invalid skip", file1, s); - goto done; - } - if (s = *argv++) - { - o2 = strtol(s, &e, 0); - if (*e) - { - error(ERROR_exit(0), "%s: %s: invalid skip", file2, s); - goto done; - } - } - if (*argv) - { - error(ERROR_usage(0), "%s", optusage(NiL)); - goto done; - } - } - if (o1 && sfseek(f1, o1, SEEK_SET) != o1) - { - if (!(flags & CMP_SILENT)) - error(ERROR_exit(0), "EOF on %s", file1); - n = 1; - goto done; - } - if (o2 && sfseek(f2, o2, SEEK_SET) != o2) - { - if (!(flags & CMP_SILENT)) - error(ERROR_exit(0), "EOF on %s", file2); - n = 1; - goto done; - } - if (fstat(sffileno(f1), &s1)) - error(ERROR_system(0), "%s: cannot stat", file1); - else if (fstat(sffileno(f2), &s2)) - error(ERROR_system(0), "%s: cannot stat", file1); - else if (s1.st_ino == s2.st_ino && s1.st_dev == s2.st_dev && o1 == o2) - n = 0; - else - n = ((flags & CMP_SILENT) && S_ISREG(s1.st_mode) && S_ISREG(s2.st_mode) && (s1.st_size - o1) != (s2.st_size - o2)) ? 1 : cmp(file1, f1, file2, f2, flags); - done: - if (f1 && f1 != sfstdin) sfclose(f1); - if (f2 && f2 != sfstdin) sfclose(f2); - return(n); -} diff --git a/usr/src/lib/libcmd/common/comm.c b/usr/src/lib/libcmd/common/comm.c deleted file mode 100644 index dcae3ba22e..0000000000 --- a/usr/src/lib/libcmd/common/comm.c +++ /dev/null @@ -1,201 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * AT&T Bell Laboratories - * - * comm - */ - -static const char usage[] = -"[-?\n@(#)$Id: comm (AT&T Research) 1999-04-28 $\n]" -USAGE_LICENSE -"[+NAME?comm - select or reject lines common to two files]" -"[+DESCRIPTION?\bcomm\b reads two files \afile1\a and \afile2\a " - "which should be ordered in the collating sequence of the " - "current locale, and produces three text columns as output:]{" - "[+1?Lines only in \afile1\a.]" - "[+2?Lines only in \afile2\a.]" - "[+3?Lines in both files.]" - "}" -"[+?If lines in either file are not ordered according to the collating " - "sequence of the current locale, the results are not specified.]" -"[+?If either \afile1\a or \afile2\a is \b-\b, \bcomm\b " - "uses standard input starting at the current location.]" - -"[1?Suppress the output column of lines unique to \afile1\a.]" -"[2?Suppress the output column of lines unique to \afile2\a.]" -"[3?Suppress the output column of lines duplicate in \afile1\a and \afile2\a.]" -"\n" -"\nfile1 file2\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?Both files processed successfully.]" - "[+>0?An error occurred.]" -"}" -"[+SEE ALSO?\bcmp\b(1), \bdiff\b(1)]" -; - - -#include <cmd.h> - -#define C_FILE1 1 -#define C_FILE2 2 -#define C_COMMON 4 -#define C_ALL (C_FILE1|C_FILE2|C_COMMON) - -static int comm(Sfio_t *in1, Sfio_t *in2, register Sfio_t *out,register int mode) -{ - register char *cp1, *cp2; - register int n1, n2, n, comp; - if(cp1 = sfgetr(in1,'\n',0)) - n1 = sfvalue(in1); - if(cp2 = sfgetr(in2,'\n',0)) - n2 = sfvalue(in2); - while(cp1 && cp2) - { - n=(n1<n2?n1:n2); - if((comp=memcmp(cp1,cp2,n-1))==0 && (comp=n1-n2)==0) - { - if(mode&C_COMMON) - { - if(mode!=C_COMMON) - { - sfputc(out,'\t'); - if(mode==C_ALL) - sfputc(out,'\t'); - } - if(sfwrite(out,cp1,n) < 0) - return(-1); - } - if(cp1 = sfgetr(in1,'\n',0)) - n1 = sfvalue(in1); - if(cp2 = sfgetr(in2,'\n',0)) - n2 = sfvalue(in2); - } - else if(comp > 0) - { - if(mode&C_FILE2) - { - if(mode&C_FILE1) - sfputc(out,'\t'); - if(sfwrite(out,cp2,n2) < 0) - return(-1); - } - if(cp2 = sfgetr(in2,'\n',0)) - n2 = sfvalue(in2); - } - else - { - if((mode&C_FILE1) && sfwrite(out,cp1,n1) < 0) - return(-1); - if(cp1 = sfgetr(in1,'\n',0)) - n1 = sfvalue(in1); - } - } - n = 0; - if(cp2) - { - cp1 = cp2; - in1 = in2; - n1 = n2; - if(mode&C_FILE1) - n = 1; - mode &= C_FILE2; - } - else - mode &= C_FILE1; - if(!mode || !cp1) - { - if(cp1 && in1==sfstdin) - sfseek(in1,(Sfoff_t)0,SEEK_END); - return(0); - } - /* process the remaining stream */ - while(1) - { - if(n) - sfputc(out,'\t'); - if(sfwrite(out,cp1,n1) < 0) - return(-1); - if(!(cp1 = sfgetr(in1,'\n',0))) - return(0); - n1 = sfvalue(in1); - } - /* NOT REACHED */ -} - -int -b_comm(int argc, char *argv[], void* context) -{ - register int n; - register int mode = C_FILE1|C_FILE2|C_COMMON; - register char *cp; - Sfio_t *f1, *f2; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - while (n = optget(argv, usage)) switch (n) - { - case '1': - mode &= ~C_FILE1; - break; - case '2': - mode &= ~C_FILE2; - break; - case '3': - mode &= ~C_COMMON; - break; - case ':': - error(2, "%s",opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s",opt_info.arg); - break; - } - argv += opt_info.index; - argc -= opt_info.index; - if(error_info.errors || argc!=2) - error(ERROR_usage(2),"%s",optusage(NiL)); - cp = *argv++; - if(streq(cp,"-")) - f1 = sfstdin; - else if(!(f1 = sfopen(NiL, cp,"r"))) - error(ERROR_system(1),"%s: cannot open",cp); - cp = *argv; - if(streq(cp,"-")) - f2 = sfstdin; - else if(!(f2 = sfopen(NiL, cp,"r"))) - error(ERROR_system(1),"%s: cannot open",cp); - if(mode) - { - if(comm(f1,f2,sfstdout,mode) < 0) - error(ERROR_system(1)," write error"); - } - else if(f1==sfstdin || f2==sfstdin) - sfseek(sfstdin,(Sfoff_t)0,SEEK_END); - if(f1!=sfstdin) - sfclose(f1); - if(f2!=sfstdin) - sfclose(f2); - return(error_info.errors); -} - diff --git a/usr/src/lib/libcmd/common/cp.c b/usr/src/lib/libcmd/common/cp.c deleted file mode 100644 index 66b946b7f5..0000000000 --- a/usr/src/lib/libcmd/common/cp.c +++ /dev/null @@ -1,950 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * Glenn Fowler - * AT&T Research - * - * cp/ln/mv -- copy/link/move files - */ - -static const char usage_head[] = -"[-?@(#)$Id: cp (AT&T Research) 2010-01-20 $\n]" -USAGE_LICENSE -; - -static const char usage_cp[] = -"[+NAME?cp - copy files]" -"[+DESCRIPTION?If the last argument names an existing directory, \bcp\b" -" copies each \afile\a into a file with the same name in that" -" directory. Otherwise, if only two files are given, \bcp\b copies" -" the first onto the second. It is an error if the last argument is" -" not a directory and more than two files are given. By default" -" directories are not copied.]" - -"[a:archive?Preserve as much as possible of the structure and attributes of" -" the original files in the copy. Equivalent to \b--physical\b" -" \b--preserve\b \b--recursive\b.]" -"[p:preserve?Preserve file owner, group, permissions and timestamps.]" -"[h:hierarchy|parents?Form the name of each destination file by appending" -" to the target directory a slash and the specified source file name." -" The last argument must be an existing directory. Missing destination" -" directories are created.]" -"[H:metaphysical?Follow command argument symbolic links, otherwise don't" -" follow.]" -"[l:link?Make hard links to destination files instead of copies.]" -"[L:logical|dereference?Follow symbolic links and copy the files" -" they point to.]" -"[P|d:physical|nodereference?Don't follow symbolic links; copy symbolic" -" rather than the files they point to.]" -; - -static const char usage_ln[] = -"[+NAME?ln - link files]" -"[+DESCRIPTION?If the last argument names an existing directory, \bln\b" -" links each \afile\a into a file with the same name in that" -" directory. Otherwise, if only two files are given, \bln\b links" -" the first onto the second. It is an error if the last argument is" -" not a directory and more than two files are given. By default" -" directories are not linked.]" -; - -static const char usage_mv[] = -"[+NAME?mv - rename files]" -"[+DESCRIPTION?If the last argument names an existing directory, \bmv\b" -" renames each \afile\a into a file with the same name in that" -" directory. Otherwise, if only two files are given, \bmv\b renames" -" the first onto the second. It is an error if the last argument is" -" not a directory and more than two files are given. If a source and" -" destination file reside on different filesystems then \bmv\b copies" -" the file contents to the destination and then deletes the source" -" file.]" -; - -static const char usage_tail[] = -"[f:force?Replace existing destination files.]" -"[i:interactive|prompt?Prompt whether to replace existing destination files." -" An affirmative response (\by\b or \bY\b) replaces the file, a quit" -" response (\bq\b or \bQ\b) exits immediately, and all other" -" responses skip the file.]" -"[r|R:recursive?Operate on the contents of directories recursively.]" -"[s:symlink|symbolic-link?Make symbolic links to destination files.]" -"[u:update?Replace a destination file only if its modification time is older" -" than the corresponding source file modification time.]" -"[v:verbose?Print the name of each file before operating on it.]" -"[b:backup?Make backups of files that are about to be replaced. See" -" \b--suffix\b and \b--version-control\b for more information.]" -"[F:fsync|sync?\bfsync\b(2) each file after it is copied.]" -"[S:backup-suffix|suffix?A backup file is made by renaming the file to the" -" same name with the backup suffix appended. The backup suffix is" -" determined in this order: this option, the \bSIMPLE_BACKUP_SUFFIX\b," -" environment variable, or the default value \b~\b.]:[suffix]" -"[V:backup-type|version-control?The backup type is determined in this order:" -" this option, the \bVERSION_CONTROL\b environment variable, or the" -" default value \bexisting\b. \atype\a may be one of:]:[type]{" -" [+numbered|t?Always make numbered backups. The numbered backup" -" suffix is \b.\aSNS\a, where \aS\a is the" -" \bbackup-suffix\b and \aN\a is the version number," -" starting at 1, incremented with each version.]" -" [+existing|nil?Make numbered backups of files that already" -" have them, otherwise simple backups.]" -" [+simple|never?Always make simple backups.]" -"}" -"[x|X|l:xdev|local|mount|one-file-system?Do not descend into directories in" -" different filesystems than their parents.]" - -"\n" -"\nsource destination\n" -"file ... directory\n" -"\n" - -"[+SEE ALSO?\bpax\b(1), \bfsync\b(2), \brename\b(2), \bunlink\b(2)," -" \bremove\b(3)]" -; - -#include <cmd.h> -#include <ls.h> -#include <times.h> -#include <fts_fix.h> -#include <fs3d.h> -#include <hashkey.h> -#include <stk.h> -#include <tmx.h> - -#define PATH_CHUNK 256 - -#define CP 1 -#define LN 2 -#define MV 3 - -#define BAK_replace 0 /* no backup -- just replace */ -#define BAK_existing 1 /* number if already else simple*/ -#define BAK_number 2 /* append .suffix number suffix */ -#define BAK_simple 3 /* append suffix */ - -typedef struct State_s /* program state */ -{ - void* context; /* builtin context */ - int backup; /* BAK_* type */ - int directory; /* destination is directory */ - int flags; /* FTS_* flags */ - int force; /* force approval */ - int fs3d; /* 3d fs enabled */ - int hierarchy; /* preserve hierarchy */ - int interactive; /* prompt for approval */ - int missmode; /* default missing dir mode */ - int official; /* move to next view */ - int op; /* {CP,LN,MV} */ - int perm; /* permissions to preserve */ - int postsiz; /* state.path post index */ - int presiz; /* state.path pre index */ - int preserve; /* preserve { id mode time } */ - int recursive; /* subtrees too */ - int suflen; /* strlen(state.suffix) */ - int sync; /* fsync() each file after copy */ - int uid; /* caller uid */ - int update; /* replace only if newer */ - int verbose; /* list each file before op */ - int wflags; /* open() for write flags */ - - int (*link)(const char*, const char*); /* link */ - int (*stat)(const char*, struct stat*); /* stat */ - -#define INITSTATE pathsiz /* (re)init state before this */ - int pathsiz; /* state.path buffer size */ - - - char* path; /* to pathname buffer */ - char* opname; /* state.op message string */ - char* suffix; /* backup suffix */ - - Sfio_t* tmp; /* tmp string stream */ - - char text[PATH_MAX]; /* link text buffer */ -} State_t; - -static const char dot[2] = { '.' }; - -/* - * preserve support - */ - -static void -preserve(State_t* state, const char* path, struct stat* ns, struct stat* os) -{ - int n; - - if (tmxtouch(path, tmxgetatime(os), tmxgetmtime(os), TMX_NOTIME, 0)) - error(ERROR_SYSTEM|2, "%s: cannot reset access and modify times", path); - n = ((ns->st_uid != os->st_uid) << 1) | (ns->st_gid != os->st_gid); - if (n && chown(state->path, os->st_uid, os->st_gid)) - switch (n) - { - case 01: - error(ERROR_SYSTEM|2, "%s: cannot reset group to %s", path, fmtgid(os->st_gid)); - break; - case 02: - error(ERROR_SYSTEM|2, "%s: cannot reset owner to %s", path, fmtuid(os->st_uid)); - break; - case 03: - error(ERROR_SYSTEM|2, "%s: cannot reset owner to %s and group to %s", path, fmtuid(os->st_uid), fmtgid(os->st_gid)); - break; - } -} - -/* - * visit a single file and state.op to the destination - */ - -static int -visit(State_t* state, register FTSENT* ent) -{ - register char* base; - register int n; - register int len; - int rm; - int rfd; - int wfd; - int m; - int v; - char* s; - char* e; - char* protection; - Sfio_t* ip; - Sfio_t* op; - FTS* fts; - FTSENT* sub; - struct stat st; - - if (ent->fts_info == FTS_DC) - { - error(2, "%s: directory causes cycle", ent->fts_path); - fts_set(NiL, ent, FTS_SKIP); - return 0; - } - if (ent->fts_level == 0) - { - base = ent->fts_name; - len = ent->fts_namelen; - if (state->hierarchy) - state->presiz = -1; - else - { - state->presiz = ent->fts_pathlen; - while (*base == '.' && *(base + 1) == '/') - for (base += 2; *base == '/'; base++); - if (*base == '.' && !*(base + 1)) - state->presiz--; - else if (*base) - state->presiz -= base - ent->fts_name; - base = ent->fts_name + len; - while (base > ent->fts_name && *(base - 1) == '/') - base--; - while (base > ent->fts_name && *(base - 1) != '/') - base--; - len -= base - ent->fts_name; - if (state->directory) - state->presiz -= len + 1; - } - } - else - { - base = ent->fts_path + state->presiz + 1; - len = ent->fts_pathlen - state->presiz - 1; - } - len++; - if (state->directory) - { - if ((state->postsiz + len) > state->pathsiz && !(state->path = newof(state->path, char, state->pathsiz = roundof(state->postsiz + len, PATH_CHUNK), 0))) - error(ERROR_SYSTEM|3, "out of space"); - if (state->hierarchy && ent->fts_level == 0 && strchr(base, '/')) - { - s = state->path + state->postsiz; - memcpy(s, base, len); - while (e = strchr(s, '/')) - { - *e = 0; - if (access(state->path, F_OK)) - { - st.st_mode = state->missmode; - if (s = strrchr(s, '/')) - { - *s = 0; - stat(state->path, &st); - *s = '/'; - } - if (mkdir(state->path, st.st_mode & S_IPERM)) - { - error(ERROR_SYSTEM|2, "%s: cannot create directory -- %s ignored", state->path, ent->fts_path); - fts_set(NiL, ent, FTS_SKIP); - return 0; - } - } - *e++ = '/'; - s = e; - } - } - } - switch (ent->fts_info) - { - case FTS_DP: - if (state->preserve && state->op != LN || ent->fts_level > 0 && (ent->fts_statp->st_mode & S_IRWXU) != S_IRWXU) - { - if (len && ent->fts_level > 0) - memcpy(state->path + state->postsiz, base, len); - else - state->path[state->postsiz] = 0; - if (stat(state->path, &st)) - error(ERROR_SYSTEM|2, "%s: cannot stat", state->path); - else - { - if ((ent->fts_statp->st_mode & S_IPERM) != (st.st_mode & S_IPERM) && chmod(state->path, ent->fts_statp->st_mode & S_IPERM)) - error(ERROR_SYSTEM|2, "%s: cannot reset directory mode to %s", state->path, fmtmode(st.st_mode & S_IPERM, 0) + 1); - if (state->preserve) - preserve(state, state->path, &st, ent->fts_statp); - } - } - return 0; - case FTS_DNR: - case FTS_DNX: - case FTS_D: - if (!state->recursive) - { - fts_set(NiL, ent, FTS_SKIP); - if (state->op == CP) - error(1, "%s: directory -- copying as plain file", ent->fts_path); - else if (state->link == link && !state->force) - { - error(2, "%s: cannot link directory", ent->fts_path); - return 0; - } - } - else switch (ent->fts_info) - { - case FTS_DNR: - error(2, "%s: cannot read directory", ent->fts_path); - return 0; - case FTS_DNX: - error(2, "%s: cannot search directory", ent->fts_path); - fts_set(NiL, ent, FTS_SKIP); - - /*FALLTHROUGH*/ - case FTS_D: - if (state->directory) - memcpy(state->path + state->postsiz, base, len); - if (!(*state->stat)(state->path, &st)) - { - if (!S_ISDIR(st.st_mode)) - { - error(2, "%s: not a directory -- %s ignored", state->path, ent->fts_path); - return 0; - } - } - else if (mkdir(state->path, (ent->fts_statp->st_mode & S_IPERM)|(ent->fts_info == FTS_D ? S_IRWXU : 0))) - { - error(ERROR_SYSTEM|2, "%s: cannot create directory -- %s ignored", state->path, ent->fts_path); - fts_set(NiL, ent, FTS_SKIP); - } - if (!state->directory) - { - state->directory = 1; - state->path[state->postsiz++] = '/'; - state->presiz--; - } - return 0; - } - break; - case FTS_ERR: - case FTS_NS: - case FTS_SLNONE: - if (state->link != pathsetlink) - { - error(2, "%s: not found", ent->fts_path); - return 0; - } - break; -#if 0 - case FTS_SL: - if (state->op == CP) - { - error(2, "%s: cannot copy non-terminal symbolic link", ent->fts_path); - return 0; - } - break; -#endif - } - if (state->directory) - memcpy(state->path + state->postsiz, base, len); - if ((*state->stat)(state->path, &st)) - st.st_mode = 0; - else if (state->update && !S_ISDIR(st.st_mode) && (unsigned long)ent->fts_statp->st_mtime < (unsigned long)st.st_mtime) - { - fts_set(NiL, ent, FTS_SKIP); - return 0; - } - else if (!state->fs3d || !iview(&st)) - { - /* - * target is in top 3d view - */ - - if (st.st_dev == ent->fts_statp->st_dev && st.st_ino == ent->fts_statp->st_ino) - { - if (state->op == MV) - { - /* - * let rename() handle it - */ - - if (state->verbose) - sfputr(sfstdout, state->path, '\n'); - goto operate; - } - if (!state->official) - error(2, "%s: identical to %s", state->path, ent->fts_path); - return 0; - } - if (S_ISDIR(st.st_mode)) - { - error(2, "%s: cannot %s existing directory", state->path, state->opname); - return 0; - } - if (state->verbose) - sfputr(sfstdout, state->path, '\n'); - rm = state->op == LN || ent->fts_info == FTS_SL; - if (!rm || !state->force) - { - if ((n = open(state->path, O_RDWR|O_BINARY)) >= 0) - { - close(n); - if (state->force) - /* ok */; - else if (state->interactive) - { - if (astquery(-1, "%s %s? ", state->opname, state->path) < 0 || sh_checksig(state->context)) - return 0; - } - else if (state->op == LN) - { - error(2, "%s: cannot %s existing file", state->path, state->opname); - return 0; - } - } - else if (state->force) - rm = 1; - else - { - protection = -#ifdef ETXTBSY - errno == ETXTBSY ? "``running program''" : -#endif - st.st_uid != state->uid ? "``not owner''" : - fmtmode(st.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO), 0) + 1; - if (state->interactive) - { - if (astquery(-1, "override protection %s for %s? ", protection, state->path) < 0 || sh_checksig(state->context)) - return 0; - rm = 1; - } - else if (!rm) - { - error(2, "%s: cannot %s %s protection", state->path, state->opname, protection); - return 0; - } - } - } - switch (state->backup) - { - case BAK_existing: - case BAK_number: - v = 0; - if (s = strrchr(state->path, '/')) - { - e = state->path; - *s++ = 0; - } - else - { - e = (char*)dot; - s = state->path; - } - n = strlen(s); - if (fts = fts_open((char**)e, FTS_NOCHDIR|FTS_ONEPATH|FTS_PHYSICAL|FTS_NOPOSTORDER|FTS_NOSTAT|FTS_NOSEEDOTDIR, NiL)) - { - while (sub = fts_read(fts)) - { - if (strneq(s, sub->fts_name, n) && sub->fts_name[n] == '.' && strneq(sub->fts_name + n + 1, state->suffix, state->suflen) && (m = strtol(sub->fts_name + n + state->suflen + 1, &e, 10)) && streq(e, state->suffix) && m > v) - v = m; - if (sub->fts_level) - fts_set(NiL, sub, FTS_SKIP); - } - fts_close(fts); - } - if (s != state->path) - *--s = '/'; - if (v || state->backup == BAK_number) - { - sfprintf(state->tmp, "%s.%s%d%s", state->path, state->suffix, v + 1, state->suffix); - goto backup; - } - /*FALLTHROUGH*/ - case BAK_simple: - sfprintf(state->tmp, "%s%s", state->path, state->suffix); - backup: - if (!(s = sfstruse(state->tmp))) - error(ERROR_SYSTEM|3, "%s: out of space", state->path); - if (rename(state->path, s)) - { - error(ERROR_SYSTEM|2, "%s: cannot backup to %s", state->path, s); - return 0; - } - break; - default: - if (rm && remove(state->path)) - { - error(ERROR_SYSTEM|2, "%s: cannot remove", state->path); - return 0; - } - break; - } - } - operate: - switch (state->op) - { - case MV: - for (;;) - { - if (!rename(ent->fts_path, state->path)) - return 0; - if (errno == ENOENT) - rm = 1; - else if (!rm && st.st_mode && !remove(state->path)) - { - rm = 1; - continue; - } - if (errno != EXDEV && (rm || S_ISDIR(ent->fts_statp->st_mode))) - { - error(ERROR_SYSTEM|2, "%s: cannot rename to %s", ent->fts_path, state->path); - return 0; - } - else - break; - } - /*FALLTHROUGH*/ - case CP: - if (S_ISLNK(ent->fts_statp->st_mode)) - { - if ((n = pathgetlink(ent->fts_path, state->text, sizeof(state->text) - 1)) < 0) - { - error(ERROR_SYSTEM|2, "%s: cannot read symbolic link text", ent->fts_path); - return 0; - } - state->text[n] = 0; - if (pathsetlink(state->text, state->path)) - { - error(ERROR_SYSTEM|2, "%s: cannot copy symbolic link to %s", ent->fts_path, state->path); - return 0; - } - } - else if (state->op == CP || S_ISREG(ent->fts_statp->st_mode) || S_ISDIR(ent->fts_statp->st_mode)) - { - if (ent->fts_statp->st_size > 0 && (rfd = open(ent->fts_path, O_RDONLY|O_BINARY)) < 0) - { - error(ERROR_SYSTEM|2, "%s: cannot read", ent->fts_path); - return 0; - } - else if ((wfd = open(state->path, st.st_mode ? (state->wflags & ~O_EXCL) : state->wflags, ent->fts_statp->st_mode & state->perm)) < 0) - { - error(ERROR_SYSTEM|2, "%s: cannot write", state->path); - if (ent->fts_statp->st_size > 0) - close(rfd); - return 0; - } - else if (ent->fts_statp->st_size > 0) - { - if (!(ip = sfnew(NiL, NiL, SF_UNBOUND, rfd, SF_READ))) - { - error(ERROR_SYSTEM|2, "%s: %s read stream error", ent->fts_path, state->path); - close(rfd); - close(wfd); - } - else - { - n = 0; - if (!(op = sfnew(NiL, NiL, SF_UNBOUND, wfd, SF_WRITE))) - { - error(ERROR_SYSTEM|2, "%s: %s write stream error", ent->fts_path, state->path); - close(wfd); - sfclose(ip); - } - else - { - if (sfmove(ip, op, (Sfoff_t)SF_UNBOUND, -1) < 0) - n |= 3; - if (!sfeof(ip)) - n |= 1; - if (sfsync(op) || state->sync && fsync(wfd) || sfclose(op)) - n |= 2; - if (sfclose(ip)) - n |= 1; - if (n) - error(ERROR_SYSTEM|2, "%s: %s %s error", ent->fts_path, state->path, n == 1 ? ERROR_translate(0, 0, 0, "read") : n == 2 ? ERROR_translate(0, 0, 0, "write") : ERROR_translate(0, 0, 0, "io")); - } - } - } - else - close(wfd); - } - else if (S_ISBLK(ent->fts_statp->st_mode) || S_ISCHR(ent->fts_statp->st_mode) || S_ISFIFO(ent->fts_statp->st_mode)) - { - if (mknod(state->path, ent->fts_statp->st_mode, idevice(ent->fts_statp))) - { - error(ERROR_SYSTEM|2, "%s: cannot copy special file to %s", ent->fts_path, state->path); - return 0; - } - } - else - { - error(2, "%s: cannot copy -- unknown file type 0%o", ent->fts_path, S_ITYPE(ent->fts_statp->st_mode)); - return 0; - } - if (state->preserve) - { - if (ent->fts_info != FTS_SL) - { - if (stat(state->path, &st)) - error(ERROR_SYSTEM|2, "%s: cannot stat", state->path); - else - { - if ((ent->fts_statp->st_mode & state->perm) != (st.st_mode & state->perm) && chmod(state->path, ent->fts_statp->st_mode & state->perm)) - error(ERROR_SYSTEM|2, "%s: cannot reset mode to %s", state->path, fmtmode(st.st_mode & state->perm, 0) + 1); - preserve(state, state->path, &st, ent->fts_statp); - } - } - if (state->op == MV && remove(ent->fts_path)) - error(ERROR_SYSTEM|1, "%s: cannot remove", ent->fts_path); - } - break; - case LN: - if ((*state->link)(ent->fts_path, state->path)) - error(ERROR_SYSTEM|2, "%s: cannot link to %s", ent->fts_path, state->path); - break; - } - return 0; -} - -int -b_cp(int argc, register char** argv, void* context) -{ - register char* file; - register char* s; - char** v; - char* backup_type; - FTS* fts; - FTSENT* ent; - const char* usage; - int path_resolve; - int standard; - struct stat st; - State_t* state; - Shbltin_t* sh; - void* cleanup = context; - - cmdinit(argc, argv, context, ERROR_CATALOG, ERROR_NOTIFY); - if (!(sh = CMD_CONTEXT(context)) || !(state = (State_t*)sh->ptr)) - { - if (!(state = newof(0, State_t, 1, 0))) - error(ERROR_SYSTEM|3, "out of space"); - if (sh) - sh->ptr = state; - } - else - memset(state, 0, offsetof(State_t, INITSTATE)); - state->context = context; - state->presiz = -1; - backup_type = 0; - state->flags = FTS_NOCHDIR|FTS_NOSEEDOTDIR; - state->uid = geteuid(); - state->wflags = O_WRONLY|O_CREAT|O_TRUNC|O_BINARY; - if (!state->tmp && !(state->tmp = sfstropen())) - error(ERROR_SYSTEM|3, "out of space [tmp string]"); - sfputr(state->tmp, usage_head, -1); - standard = !strcmp(astconf("CONFORMANCE", NiL, NiL), "standard"); - switch (error_info.id[0]) - { - case 'c': - case 'C': - sfputr(state->tmp, usage_cp, -1); - state->op = CP; - state->stat = stat; - path_resolve = -1; - break; - case 'l': - case 'L': - sfputr(state->tmp, usage_ln, -1); - state->op = LN; - state->flags |= FTS_PHYSICAL; - state->link = link; - state->stat = lstat; - path_resolve = 1; - break; - case 'm': - case 'M': - sfputr(state->tmp, usage_mv, -1); - state->op = MV; - state->flags |= FTS_PHYSICAL; - state->preserve = 1; - state->stat = lstat; - path_resolve = 1; - break; - default: - error(3, "not implemented"); - break; - } - sfputr(state->tmp, usage_tail, -1); - if (!(usage = sfstruse(state->tmp))) - error(ERROR_SYSTEM|3, "%s: out of space", state->path); - state->opname = state->op == CP ? ERROR_translate(0, 0, 0, "overwrite") : ERROR_translate(0, 0, 0, "replace"); - for (;;) - { - switch (optget(argv, usage)) - { - case 'a': - state->flags |= FTS_PHYSICAL; - state->preserve = 1; - state->recursive = 1; - path_resolve = 1; - continue; - case 'b': - state->backup = 1; - continue; - case 'f': - state->force = 1; - if (state->op != CP || !standard) - state->interactive = 0; - continue; - case 'h': - state->hierarchy = 1; - continue; - case 'i': - state->interactive = 1; - if (state->op != CP || !standard) - state->force = 0; - continue; - case 'l': - state->op = LN; - state->link = link; - state->stat = lstat; - continue; - case 'p': - state->preserve = 1; - continue; - case 'r': - state->recursive = 1; - if (path_resolve < 0) - path_resolve = 0; - continue; - case 's': - state->op = LN; - state->link = pathsetlink; - state->stat = lstat; - continue; - case 'u': - state->update = 1; - continue; - case 'v': - state->verbose = 1; - continue; - case 'x': - state->flags |= FTS_XDEV; - continue; - case 'F': -#if _lib_fsync - state->sync = 1; -#else - error(1, "%s not implemented on this system", opt_info.name); -#endif - continue; - case 'H': - state->flags |= FTS_META|FTS_PHYSICAL; - path_resolve = 1; - continue; - case 'L': - state->flags &= ~FTS_PHYSICAL; - path_resolve = 1; - continue; - case 'P': - state->flags &= ~FTS_META; - state->flags |= FTS_PHYSICAL; - path_resolve = 1; - continue; - case 'R': - state->recursive = 1; - state->flags &= ~FTS_META; - state->flags |= FTS_PHYSICAL; - path_resolve = 1; - continue; - case 'S': - state->suffix = opt_info.arg; - continue; - case 'V': - backup_type = opt_info.arg; - continue; - case '?': - error(ERROR_USAGE|4, "%s", opt_info.arg); - continue; - case ':': - error(2, "%s", opt_info.arg); - continue; - } - break; - } - argc -= opt_info.index + 1; - argv += opt_info.index; - if (*argv && streq(*argv, "-") && !streq(*(argv - 1), "--")) - { - argc--; - argv++; - } - if (!(v = (char**)stkalloc(stkstd, (argc + 2) * sizeof(char*)))) - error(ERROR_SYSTEM|3, "out of space"); - memcpy(v, argv, (argc + 1) * sizeof(char*)); - argv = v; - if (!standard) - { - state->wflags |= O_EXCL; - if (!argc) - { - argc++; - argv[1] = (char*)dot; - } - } - if (state->backup) - { - if (!(file = backup_type) && !(backup_type = getenv("VERSION_CONTROL"))) - state->backup = BAK_existing; - else - switch (strkey(backup_type)) - { - case HASHKEY6('e','x','i','s','t','i'): - case HASHKEY5('e','x','i','s','t'): - case HASHKEY4('e','x','i','s'): - case HASHKEY3('e','x','i'): - case HASHKEY2('e','x'): - case HASHKEY1('e'): - case HASHKEY3('n','i','l'): - case HASHKEY2('n','i'): - state->backup = BAK_existing; - break; - case HASHKEY5('n','e','v','e','r'): - case HASHKEY4('n','e','v','e'): - case HASHKEY3('n','e','v'): - case HASHKEY2('n','e'): - case HASHKEY6('s','i','m','p','l','e'): - case HASHKEY5('s','i','m','p','l'): - case HASHKEY4('s','i','m','p'): - case HASHKEY3('s','i','m'): - case HASHKEY2('s','i'): - case HASHKEY1('s'): - state->backup = BAK_simple; - break; - case HASHKEY6('n','u','m','b','e','r'): - case HASHKEY5('n','u','m','b','e'): - case HASHKEY4('n','u','m','b'): - case HASHKEY3('n','u','m'): - case HASHKEY2('n','u'): - case HASHKEY1('t'): - state->backup = BAK_number; - break; - default: - if (file) - error(2, "%s: unknown backup type", backup_type); - break; - } - if (!state->suffix && !(state->suffix = getenv("SIMPLE_BACKUP_SUFFIX"))) - state->suffix = "~"; - state->suflen = strlen(state->suffix); - } - if (argc <= 0 || error_info.errors) - error(ERROR_USAGE|4, "%s", optusage(NiL)); - if (!path_resolve) - state->flags |= fts_flags(); - file = argv[argc]; - argv[argc] = 0; - if (s = strrchr(file, '/')) - { - while (*s == '/') - s++; - if (!(!*s || *s == '.' && (!*++s || *s == '.' && !*++s))) - s = 0; - } - if (file != (char*)dot) - pathcanon(file, 0); - if (!(state->directory = !stat(file, &st) && S_ISDIR(st.st_mode)) && argc > 1) - error(ERROR_USAGE|4, "%s", optusage(NiL)); - if (s && !state->directory) - error(3, "%s: not a directory", file); - if ((state->fs3d = fs3d(FS3D_TEST)) && strmatch(file, "...|*/...|.../*")) - state->official = 1; - state->postsiz = strlen(file); - if (state->pathsiz < roundof(state->postsiz + 2, PATH_CHUNK) && !(state->path = newof(state->path, char, state->pathsiz = roundof(state->postsiz + 2, PATH_CHUNK), 0))) - error(ERROR_SYSTEM|3, "out of space"); - memcpy(state->path, file, state->postsiz + 1); - if (state->directory && state->path[state->postsiz - 1] != '/') - state->path[state->postsiz++] = '/'; - if (state->hierarchy) - { - if (!state->directory) - error(3, "%s: last argument must be a directory", file); - state->missmode = st.st_mode; - } - state->perm = state->uid ? S_IPERM : (S_IPERM & ~S_ISVTX); - if (!state->recursive) - state->flags |= FTS_TOP; - if (fts = fts_open(argv, state->flags, NiL)) - { - while (!sh_checksig(context) && (ent = fts_read(fts)) && !visit(state, ent)); - fts_close(fts); - } - else if (state->link != pathsetlink) - switch (state->op) - { - case CP: - error(ERROR_SYSTEM|2, "%s: cannot copy", argv[0]); - break; - case LN: - error(ERROR_SYSTEM|2, "%s: cannot link", argv[0]); - break; - case MV: - error(ERROR_SYSTEM|2, "%s: cannot move", argv[0]); - break; - } - else if ((*state->link)(*argv, state->path)) - error(ERROR_SYSTEM|2, "%s: cannot link to %s", *argv, state->path); - if (cleanup && !sh) - { - if (state->path) - free(state->path); - free(state); - } - return error_info.errors != 0; -} diff --git a/usr/src/lib/libcmd/common/cut.c b/usr/src/lib/libcmd/common/cut.c deleted file mode 100644 index 6b6cabe60e..0000000000 --- a/usr/src/lib/libcmd/common/cut.c +++ /dev/null @@ -1,702 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * AT&T Bell Laboratories - * - * cut fields or columns from fields from a file - */ - -static const char usage[] = -"[-?\n@(#)$Id: cut (AT&T Research) 2009-12-04 $\n]" -USAGE_LICENSE -"[+NAME?cut - cut out selected columns or fields of each line of a file]" -"[+DESCRIPTION?\bcut\b bytes, characters, or character-delimited fields " - "from one or more files, contatenating them on standard output.]" -"[+?The option argument \alist\a is a comma-separated or blank-separated " - "list of positive numbers and ranges. Ranges can be of three " - "forms. The first is two positive integers separated by a hyphen " - "(\alow\a\b-\b\ahigh\a), which represents all fields from \alow\a to " - "\ahigh\a. The second is a positive number preceded by a hyphen " - "(\b-\b\ahigh\a), which represents all fields from field \b1\b to " - "\ahigh\a. The last is a positive number followed by a hyphen " - "(\alow\a\b-\b), which represents all fields from \alow\a to the " - "last field, inclusive. Elements in the \alist\a can be repeated, " - "can overlap, and can appear in any order. The order of the " - "output is that of the input.]" -"[+?One and only one of \b-b\b, \b-c\b, or \b-f\b must be specified.]" -"[+?If no \afile\a is given, or if the \afile\a is \b-\b, \bcut\b " - "cuts from standard input. The start of the file is defined " - "as the current offset.]" -"[b:bytes]:[list?\bcut\b based on a list of byte counts.]" -"[c:characters]:[list?\bcut\b based on a list of character counts.]" -"[d:delimiter]:[delim?The field character for the \b-f\b option is set " - "to \adelim\a. The default is the \btab\b character.]" -"[f:fields]:[list?\bcut\b based on fields separated by the delimiter " - "character specified with the \b-d\b optiion.]" -"[n!:split?Split multibyte characters selected by the \b-b\b option.]" -"[R|r:reclen]#[reclen?If \areclen\a > 0, the input will be read as fixed length " - "records of length \areclen\a when used with the \b-b\b or \b-c\b " - "option.]" -"[s:suppress|only-delimited?Suppress lines with no delimiter characters, " - "when used with the \b-f\b option. By default, lines with no " - "delimiters will be passsed in untouched.]" -"[D:line-delimeter|output-delimiter]:[ldelim?The line delimiter character for " - "the \b-f\b option is set to \aldelim\a. The default is the " - "\bnewline\b character.]" -"[N!:newline?Output new-lines at end of each record when used " - "with the \b-b\b or \b-c\b option.]" -"\n" -"\n[file ...]\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?All files processed successfully.]" - "[+>0?One or more files failed to open or could not be read.]" -"}" -"[+SEE ALSO?\bpaste\b(1), \bgrep\b(1)]" -; - -#include <cmd.h> -#include <ctype.h> - -typedef struct Delim_s -{ - char* str; - int len; - int chr; -} Delim_t; - -typedef struct Cut_s -{ - int mb; - int eob; - int cflag; - int nosplit; - int sflag; - int nlflag; - int reclen; - Delim_t wdelim; - Delim_t ldelim; - unsigned char space[UCHAR_MAX+1]; - int list[2]; /* NOTE: must be last member */ -} Cut_t; - -#define HUGE INT_MAX -#define BLOCK 8*1024 -#define C_BYTES 1 -#define C_CHARS 2 -#define C_FIELDS 4 -#define C_SUPRESS 8 -#define C_NOSPLIT 16 -#define C_NONEWLINE 32 - -#define SP_LINE 1 -#define SP_WORD 2 -#define SP_WIDE 3 - -#define mb2wc(w,p,n) (*ast.mb_towc)(&w,(char*)p,n) - -/* - * compare the first of an array of integers - */ - -static int -mycomp(register const void* a, register const void* b) -{ - if (*((int*)a) < *((int*)b)) - return -1; - if (*((int*)a) > *((int*)b)) - return 1; - return 0; -} - -static Cut_t* -cutinit(int mode, char* str, Delim_t* wdelim, Delim_t* ldelim, size_t reclen) -{ - register int* lp; - register int c; - register int n = 0; - register int range = 0; - register char* cp = str; - Cut_t* cut; - - if (!(cut = (Cut_t*)stakalloc(sizeof(Cut_t) + strlen(cp) * sizeof(int)))) - error(ERROR_exit(1), "out of space"); - if (cut->mb = mbwide()) - { - memset(cut->space, 0, sizeof(cut->space) / 2); - memset(cut->space + sizeof(cut->space) / 2, SP_WIDE, sizeof(cut->space) / 2); - } - else - memset(cut->space, 0, sizeof(cut->space)); - cut->wdelim = *wdelim; - if (wdelim->len == 1) - cut->space[wdelim->chr] = SP_WORD; - cut->ldelim = *ldelim; - cut->eob = (ldelim->len == 1) ? ldelim->chr : 0; - cut->space[cut->eob] = SP_LINE; - cut->cflag = (mode&C_CHARS) && cut->mb; - cut->nosplit = (mode&(C_BYTES|C_NOSPLIT)) == (C_BYTES|C_NOSPLIT) && cut->mb; - cut->sflag = (mode&C_SUPRESS) != 0; - cut->nlflag = (mode&C_NONEWLINE) != 0; - cut->reclen = reclen; - lp = cut->list; - for (;;) - switch(c = *cp++) - { - case ' ': - case '\t': - while(*cp==' ' || *cp=='\t') - cp++; - /*FALLTHROUGH*/ - case 0: - case ',': - if(range) - { - --range; - if((n = (n ? (n-range) : (HUGE-1))) < 0) - error(ERROR_exit(1),"invalid range for c/f option"); - *lp++ = range; - *lp++ = n; - } - else - { - *lp++ = --n; - *lp++ = 1; - } - if(c==0) - { - register int *dp; - *lp = HUGE; - n = 1 + (lp-cut->list)/2; - qsort(lp=cut->list,n,2*sizeof(*lp),mycomp); - /* eliminate overlapping regions */ - for(n=0,range= -2,dp=lp; *lp!=HUGE; lp+=2) - { - if(lp[0] <= range) - { - if(lp[1]==HUGE) - { - dp[-1] = HUGE; - break; - } - if((c = lp[0]+lp[1]-range)>0) - { - range += c; - dp[-1] += c; - } - } - else - { - range = *dp++ = lp[0]; - if(lp[1]==HUGE) - { - *dp++ = HUGE; - break; - } - range += (*dp++ = lp[1]); - } - } - *dp = HUGE; - lp = cut->list; - /* convert ranges into gaps */ - for(n=0; *lp!=HUGE; lp+=2) - { - c = *lp; - *lp -= n; - n = c+lp[1]; - } - return cut; - } - n = range = 0; - break; - - case '-': - if(range) - error(ERROR_exit(1),"bad list for c/f option"); - range = n?n:1; - n = 0; - break; - - default: - if(!isdigit(c)) - error(ERROR_exit(1),"bad list for c/f option"); - n = 10*n + (c-'0'); - break; - } - /* NOTREACHED */ -} - -/* - * cut each line of file <fdin> and put results to <fdout> using list <list> - */ - -static void -cutcols(Cut_t* cut, Sfio_t* fdin, Sfio_t* fdout) -{ - register int c; - register int len; - register int ncol = 0; - register const int* lp = cut->list; - register char* bp; - register int skip; /* non-zero for don't copy */ - int must; - const char* xx; - - for (;;) - { - if (len = cut->reclen) - bp = sfreserve(fdin, len, -1); - else - bp = sfgetr(fdin, '\n', 0); - if (!bp && !(bp = sfgetr(fdin, 0, SF_LASTR))) - break; - len = sfvalue(fdin); - xx = 0; - if (!(ncol = skip = *(lp = cut->list))) - ncol = *++lp; - must = 1; - do - { - if (cut->nosplit) - { - register const char* s = bp; - register int w = len < ncol ? len : ncol; - register int z; - - while (w > 0) - { - if (!(*s & 0x80)) - z = 1; - else if ((z = mblen(s, w)) <= 0) - { - if (s == bp && xx) - { - w += s - xx; - bp = (char*)(s = xx); - xx = 0; - continue; - } - xx = s; - if (skip) - s += w; - w = 0; - break; - } - s += z; - w -= z; - } - c = s - bp; - ncol = !w && ncol >= len; - } - else if (cut->cflag) - { - register const char* s = bp; - register int w = len; - register int z; - - while (w > 0 && ncol > 0) - { - ncol--; - if (!(*s & 0x80) || (z = mblen(s, w)) <= 0) - z = 1; - s += z; - w -= z; - - } - c = s - bp; - ncol = !w && (ncol || !skip); - } - else - { - if ((c = ncol) > len) - c = len; - else if (c == len && !skip) - ncol++; - ncol -= c; - } - if (!skip && c) - { - if (sfwrite(fdout, (char*)bp, c) < 0) - return; - must = 0; - } - bp += c; - if (ncol) - break; - len -= c; - ncol = *++lp; - skip = !skip; - } while (ncol != HUGE); - if (!cut->nlflag && (skip || must || cut->reclen)) - { - if (cut->ldelim.len > 1) - sfwrite(fdout, cut->ldelim.str, cut->ldelim.len); - else - sfputc(fdout, cut->ldelim.chr); - } - } -} - -/* - * cut each line of file <fdin> and put results to <fdout> using list <list> - * stream <fdin> must be line buffered - */ - -static void -cutfields(Cut_t* cut, Sfio_t* fdin, Sfio_t* fdout) -{ - register unsigned char *sp = cut->space; - register unsigned char *cp; - register unsigned char *wp; - register int c, nfields; - register const int *lp = cut->list; - register unsigned char *copy; - register int nodelim, empty, inword=0; - register unsigned char *ep; - unsigned char *bp, *first; - int lastchar; - wchar_t w; - Sfio_t *fdtmp = 0; - long offset = 0; - unsigned char mb[8]; - /* process each buffer */ - while ((bp = (unsigned char*)sfreserve(fdin, SF_UNBOUND, -1)) && (c = sfvalue(fdin)) > 0) - { - cp = bp; - ep = cp + --c; - if((lastchar = cp[c]) != cut->eob) - *ep = cut->eob; - /* process each line in the buffer */ - while (cp <= ep) - { - first = cp; - if (!inword) - { - nodelim = empty = 1; - copy = cp; - if (nfields = *(lp = cut->list)) - copy = 0; - else - nfields = *++lp; - } - else if (copy) - copy = cp; - inword = 0; - do - { - /* skip over non-delimiter characters */ - if (cut->mb) - for (;;) - { - switch (c = sp[*(unsigned char*)cp++]) - { - case 0: - continue; - case SP_WIDE: - wp = --cp; - while ((c = mb2wc(w, cp, ep - cp)) <= 0) - { - /* mb char possibly spanning buffer boundary -- fun stuff */ - if ((ep - cp) < mbmax()) - { - int i; - int j; - int k; - - if (lastchar != cut->eob) - { - *ep = lastchar; - if ((c = mb2wc(w, cp, ep - cp)) > 0) - break; - } - if (copy) - { - empty = 0; - if ((c = cp - copy) > 0 && sfwrite(fdout, (char*)copy, c) < 0) - goto failed; - } - for (i = 0; i <= (ep - cp); i++) - mb[i] = cp[i]; - if (!(bp = (unsigned char*)sfreserve(fdin, SF_UNBOUND, -1)) || (c = sfvalue(fdin)) <= 0) - goto failed; - cp = bp; - ep = cp + --c; - if ((lastchar = cp[c]) != cut->eob) - *ep = cut->eob; - j = i; - k = 0; - while (j < mbmax()) - mb[j++] = cp[k++]; - if ((c = mb2wc(w, (char*)mb, j)) <= 0) - { - c = i; - w = 0; - } - first = bp = cp += c - i; - if (copy) - { - copy = bp; - if (w == cut->ldelim.chr) - lastchar = cut->ldelim.chr; - else if (w != cut->wdelim.chr) - { - empty = 0; - if (sfwrite(fdout, (char*)mb, c) < 0) - goto failed; - } - } - c = 0; - } - else - { - w = *cp; - c = 1; - } - break; - } - cp += c; - c = w; - if (c == cut->wdelim.chr) - { - c = SP_WORD; - break; - } - if (c == cut->ldelim.chr) - { - c = SP_LINE; - break; - } - continue; - default: - wp = cp - 1; - break; - } - break; - } - else - { - while (!(c = sp[*cp++])); - wp = cp - 1; - } - /* check for end-of-line */ - if (c == SP_LINE) - { - if (cp <= ep) - break; - if (lastchar == cut->ldelim.chr) - break; - /* restore cut->last character */ - if (lastchar != cut->eob) - *ep = lastchar; - inword++; - if (!sp[lastchar]) - break; - } - nodelim = 0; - if (--nfields > 0) - continue; - nfields = *++lp; - if (copy) - { - empty = 0; - if ((c = wp - copy) > 0 && sfwrite(fdout, (char*)copy, c) < 0) - goto failed; - copy = 0; - } - else - /* set to delimiter unless the first field */ - copy = empty ? cp : wp; - } while (!inword); - if (!inword) - { - if (!copy) - { - if (nodelim) - { - if (!cut->sflag) - { - if (offset) - { - sfseek(fdtmp,(Sfoff_t)0,SEEK_SET); - sfmove(fdtmp,fdout,offset,-1); - } - copy = first; - } - } - else - sfputc(fdout,'\n'); - } - if (offset) - sfseek(fdtmp,offset=0,SEEK_SET); - } - if (copy && (c=cp-copy)>0 && (!nodelim || !cut->sflag) && sfwrite(fdout,(char*)copy,c)< 0) - goto failed; - } - /* see whether to save in tmp file */ - if(inword && nodelim && !cut->sflag && (c=cp-first)>0) - { - /* copy line to tmpfile in case no fields */ - if(!fdtmp) - fdtmp = sftmp(BLOCK); - sfwrite(fdtmp,(char*)first,c); - offset +=c; - } - } - failed: - if(fdtmp) - sfclose(fdtmp); -} - -int -b_cut(int argc, char** argv, void* context) -{ - register char* cp = 0; - register Sfio_t* fp; - char* s; - int n; - Cut_t* cut; - int mode = 0; - Delim_t wdelim; - Delim_t ldelim; - size_t reclen = 0; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - wdelim.chr = '\t'; - ldelim.chr = '\n'; - wdelim.len = ldelim.len = 1; - for (;;) - { - switch (n = optget(argv, usage)) - { - case 0: - break; - case 'b': - case 'c': - if(mode&C_FIELDS) - { - error(2, "f option already specified"); - continue; - } - cp = opt_info.arg; - if(n=='b') - mode |= C_BYTES; - else - mode |= C_CHARS; - continue; - case 'D': - ldelim.str = opt_info.arg; - if (mbwide()) - { - s = opt_info.arg; - ldelim.chr = mbchar(s); - if ((n = s - opt_info.arg) > 1) - { - ldelim.len = n; - continue; - } - } - ldelim.chr = *(unsigned char*)opt_info.arg; - ldelim.len = 1; - continue; - case 'd': - wdelim.str = opt_info.arg; - if (mbwide()) - { - s = opt_info.arg; - wdelim.chr = mbchar(s); - if ((n = s - opt_info.arg) > 1) - { - wdelim.len = n; - continue; - } - } - wdelim.chr = *(unsigned char*)opt_info.arg; - wdelim.len = 1; - continue; - case 'f': - if(mode&(C_CHARS|C_BYTES)) - { - error(2, "c option already specified"); - continue; - } - cp = opt_info.arg; - mode |= C_FIELDS; - continue; - case 'n': - mode |= C_NOSPLIT; - continue; - case 'N': - mode |= C_NONEWLINE; - continue; - case 'R': - case 'r': - if(opt_info.num>0) - reclen = opt_info.num; - continue; - case 's': - mode |= C_SUPRESS; - continue; - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - break; - } - argv += opt_info.index; - if (error_info.errors) - error(ERROR_usage(2), "%s",optusage(NiL)); - if(!cp) - { - error(2, "b, c or f option must be specified"); - error(ERROR_usage(2), "%s", optusage(NiL)); - } - if(!*cp) - error(3, "non-empty b, c or f option must be specified"); - if((mode & (C_FIELDS|C_SUPRESS)) == C_SUPRESS) - error(3, "s option requires f option"); - cut = cutinit(mode, cp, &wdelim, &ldelim, reclen); - if(cp = *argv) - argv++; - do - { - if(!cp || streq(cp,"-")) - fp = sfstdin; - else if(!(fp = sfopen(NiL,cp,"r"))) - { - error(ERROR_system(0),"%s: cannot open",cp); - continue; - } - if(mode&C_FIELDS) - cutfields(cut,fp,sfstdout); - else - cutcols(cut,fp,sfstdout); - if(fp!=sfstdin) - sfclose(fp); - } while(cp = *argv++); - if (sfsync(sfstdout)) - error(ERROR_system(0), "write error"); - return error_info.errors != 0; -} diff --git a/usr/src/lib/libcmd/common/date.c b/usr/src/lib/libcmd/common/date.c deleted file mode 100644 index ce011e2960..0000000000 --- a/usr/src/lib/libcmd/common/date.c +++ /dev/null @@ -1,489 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * Glenn Fowler - * AT&T Research - * - * date -- set/display date - */ - -static const char usage[] = -"[-?\n@(#)$Id: date (AT&T Research) 2009-03-03 $\n]" -USAGE_LICENSE -"[+NAME?date - set/list/convert dates]" -"[+DESCRIPTION?\bdate\b sets the current date and time (with appropriate" -" privilege), lists the current date or file dates, or converts" -" dates.]" -"[+?Most common \adate\a forms are recognized, including those for" -" \bcrontab\b(1), \bls\b(1), \btouch\b(1), and the default" -" output from \bdate\b itself.]" -"[+?If the \adate\a operand consists of 4, 6, 8, 10 or 12 digits followed" -" by an optional \b.\b and two digits then it is interpreted as:" -" \aHHMM.SS\a, \addHHMM.SS\a, \ammddHHMM.SS\a, \ammddHHMMyy.SS\a or" -" \ayymmddHHMM.SS\a, or \ammddHHMMccyy.SS\a or \accyymmddHHMM.SS\a." -" Conflicting standards and practice allow a leading or trailing" -" 2 or 4 digit year for the 10 and 12 digit forms; the X/Open trailing" -" form is used to disambiguate (\btouch\b(1) uses the leading form.)" -" Avoid the 10 digit form to avoid confusion. The digit fields are:]{" -" [+cc?Century - 1, 19-20.]" -" [+yy?Year in century, 00-99.]" -" [+mm?Month, 01-12.]" -" [+dd?Day of month, 01-31.]" -" [+HH?Hour, 00-23.]" -" [+MM?Minute, 00-59.]" -" [+SS?Seconds, 00-60.]" -"}" -"[+?If more than one \adate\a operand is specified then:]{" -" [+1.?Each operand sets the reference date for the next" -" operand.]" -" [+2.?The date is listed for each operand.]" -" [+3.?The system date is not set.]" -"}" - -"[a:access-time|atime?List file argument access times.]" -"[c:change-time|ctime?List file argument change times.]" -"[d:date?Use \adate\a as the current date and do not set the system" -" clock.]:[date]" -"[e:epoch?Output the date in seconds since the epoch." -" Equivalent to \b--format=%s\b.]" -"[E:elapsed?Interpret pairs of arguments as start and stop dates, sum the" -" differences between all pairs, and list the result as a" -" \bfmtelapsed\b(3) elapsed time on the standard output. If there are" -" an odd number of arguments then the last time argument is differenced" -" with the current time.]" -"[f:format?Output the date according to the \bstrftime\b(3) \aformat\a." -" For backwards compatibility, a first argument of the form" -" \b+\b\aformat\a is equivalent to \b-f\b format." -" \aformat\a is in \bprintf\b(3) style, where %\afield\a names" -" a fixed size field, zero padded if necessary," -" and \\\ac\a and \\\annn\a sequences are as in C. Invalid" -" %\afield\a specifications and all other characters are copied" -" without change. \afield\a may be preceded by \b%-\b to turn off" -" padding or \b%_\b to pad with space, otherwise numeric fields" -" are padded with \b0\b and string fields are padded with space." -" \afield\a may also be preceded by \bE\b for alternate era" -" representation or \bO\b for alternate digit representation (if" -" supported by the current locale.) Finally, an integral \awidth\a" -" preceding \afield\a truncates the field to \awidth\a characters." -" The fields are:]:[format]{" -" [+%?% character]" -" [+a?abbreviated weekday name]" -" [+A?full weekday name]" -" [+b?abbreviated month name]" -" [+c?\bctime\b(3) style date without the trailing newline]" -" [+C?2-digit century]" -" [+d?day of month number]" -" [+D?date as \amm/dd/yy\a]" -" [+e?blank padded day of month number]" -" [+E?unpadded day of month number]" -" [+f?locale default override date format]" -" [+F?%ISO 8601:2000 standard date format; equivalent to Y-%m-%d]" -" [+g?\bls\b(1) \b-l\b recent date with \ahh:mm\a]" -" [+G?\bls\b(1) \b-l\b distant date with \ayyyy\a]" -" [+h?abbreviated month name]" -" [+H?24-hour clock hour]" -" [+i?international \bdate\b(1) date with time zone type name]" -" [+I?12-hour clock hour]" -" [+j?1-offset Julian date]" -" [+J?0-offset Julian date]" -" [+k?\bdate\b(1) style date]" -" [+K?all numeric date; equivalent to \b%Y-%m-%d+%H:%M:%S\b; \b%_[EO]]K\b for space separator, %OK adds \b.%N\b, \b%EK\b adds \b%.N%z\b, \b%_EK\b adds \b.%N %z\b]" -" [+l?\bls\b(1) \b-l\b date; equivalent to \b%Q/%g/%G/\b]" -" [+L?locale default date format]" -" [+m?month number]" -" [+M?minutes]" -" [+n?newline character]" -" [+N?nanoseconds 000000000-999999999]" -" [+p?meridian (e.g., \bAM\b or \bPM\b)]" -" [+q?time zone type name (nation code)]" -" [+Q?\a<del>recent<del>distant<del>\a: \a<del>\a is a unique" -" delimter character; \arecent\a format for recent" -" dates, \adistant\a format otherwise]" -" [+r?12-hour time as \ahh:mm:ss meridian\a]" -" [+R?24-hour time as \ahh:mm\a]" -" [+s?number of seconds since the epoch; \a.prec\a preceding" -" \bs\b appends \aprec\a nanosecond digits, \b9\b if" -" \aprec\a is omitted]" -" [+S?seconds 00-60]" -" [+t?tab character]" -" [+T?24-hour time as \ahh:mm:ss\a]" -" [+u?weekday number 1(Monday)-7]" -" [+U?week number with Sunday as the first day]" -" [+V?ISO week number (i18n is \afun\a)]" -" [+w?weekday number 0(Sunday)-6]" -" [+W?week number with Monday as the first day]" -" [+x?locale date style that includes month, day and year]" -" [+X?locale time style that includes hours and minutes]" -" [+y?2-digit year (you'll be sorry)]" -" [+Y?4-digit year]" -" [+z?time zone \aSHHMM\a west of GMT offset where S is" -" \b+\b or \b-\b]" -" [+Z?time zone name]" -" [+=[=]][-+]]flag?set (default or +) or clear (-) \aflag\a" -" for the remainder of \aformat\a, or for the remainder" -" of the process if \b==\b is specified. \aflag\a may be:]{" -" [+l?enable leap second adjustments]" -" [+n?convert \b%S\b as \b%S.%N\b]" -" [+u?UTC time zone]" -" }" -" [+#?equivalent to %s]" -" [+??alternate?use \aalternate\a format if a default format" -" override has not been specified, e.g., \bls\b(1) uses" -" \"%?%l\"; export TM_OPTIONS=\"format='\aoverride\a'\"" -" to override the default]" -"}" -"[i:incremental|adjust?Set the system time in incrementatl adjustments to" -" avoid complete time shift shock. Negative adjustments still maintain" -" monotonic increasing time. Not available on all systems.]" -"[L:last?List only the last time for multiple \adate\a operands.]" -"[l:leap-seconds?Include leap seconds in time calculations. Leap seconds" -" after the ast library release date are not accounted for.]" -"[m:modify-time|mtime?List file argument modify times.]" -"[n!:network?Set network time.]" -"[p:parse?Add \aformat\a to the list of \bstrptime\b(3) parse conversion" -" formats. \aformat\a follows the same conventions as the" -" \b--format\b option, with the addition of these format" -" fields:]:[format]{" -" [+|?If the format failed before this point then restart" -" the parse with the remaining format.]" -" [+&?Call the \btmdate\b(3) heuristic parser. This is" -" is the default when \b--parse\b is omitted.]" -"}" -"[s:show?Show the date without setting the system time.]" -"[u:utc|gmt|zulu?Output dates in \acoordinated universal time\a (UTC).]" -"[U:unelapsed?Interpret each argument as \bfmtelapsed\b(3) elapsed" -" time and list the \bstrelapsed\b(3) 1/\ascale\a seconds.]#[scale]" -"[z:list-zones?List the known time zone table and exit. The table columns" -" are: country code, standard zone name, savings time zone name," -" minutes west of \bUTC\b, and savings time minutes offset. Blank" -" or empty entries are listed as \b-\b.]" - -"\n" -"\n[ +format | date ... | file ... ]\n" -"\n" - -"[+SEE ALSO?\bcrontab\b(1), \bls\b(1), \btouch\b(1), \bfmtelapsed\b(3)," -" \bstrftime\b(3), \bstrptime\b(3), \btm\b(3)]" -; - -#include <cmd.h> -#include <ls.h> -#include <proc.h> -#include <tmx.h> -#include <times.h> - -typedef struct Fmt -{ - struct Fmt* next; - char* format; -} Fmt_t; - -#ifndef ENOSYS -#define ENOSYS EINVAL -#endif - -/* - * set the system clock - * the standards wimped out here - */ - -static int -settime(void* context, const char* cmd, Time_t now, int adjust, int network) -{ - char* s; - char** argv; - char* args[5]; - char buf[1024]; - - if (!adjust && !network) - return tmxsettime(now); - argv = args; - s = "/usr/bin/date"; - if (!streq(cmd, s) && (!eaccess(s, X_OK) || !eaccess(s+=4, X_OK))) - { - *argv++ = s; - if (streq(astconf("UNIVERSE", NiL, NiL), "att")) - { - tmxfmt(buf, sizeof(buf), "%m%d%H" "%M%Y.%S", now); - if (adjust) - *argv++ = "-a"; - } - else - { - tmxfmt(buf, sizeof(buf), "%Y%m%d%H" "%M.%S", now); - if (network) - *argv++ = "-n"; - if (tm_info.flags & TM_UTC) - *argv++ = "-u"; - } - *argv++ = buf; - *argv = 0; - if (!sh_run(context, argv - args, args)) - return 0; - } - return -1; -} - -/* - * convert s to Time_t with error checking - */ - -static Time_t -convert(register Fmt_t* f, char* s, Time_t now) -{ - char* t; - char* u; - - do - { - now = tmxscan(s, &t, f->format, &u, now, 0); - if (!*t && (!f->format || !*u)) - break; - } while (f = f->next); - if (!f || *t) - error(3, "%s: invalid date specification", f ? t : s); - return now; -} - -int -b_date(int argc, register char** argv, void* context) -{ - register int n; - register char* s; - register Fmt_t* f; - char* t; - unsigned long u; - Time_t now; - Time_t ts; - Time_t te; - Time_t e; - char buf[1024]; - Fmt_t* fmts; - Fmt_t fmt; - struct stat st; - - char* cmd = argv[0]; /* original command path */ - char* format = 0; /* tmxfmt() format */ - char* string = 0; /* date string */ - int elapsed = 0; /* args are start/stop pairs */ - int filetime = 0; /* use this st_ time field */ - int increment = 0; /* incrementally adjust time */ - int last = 0; /* display the last time arg */ - Tm_zone_t* listzones = 0; /* known time zone table */ - int network = 0; /* don't set network time */ - int show = 0; /* show date and don't set */ - int unelapsed = 0; /* fmtelapsed() => strelapsed */ - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - tm_info.flags = TM_DATESTYLE; - fmts = &fmt; - fmt.format = ""; - fmt.next = 0; - for (;;) - { - switch (optget(argv, usage)) - { - case 'a': - case 'c': - case 'm': - filetime = opt_info.option[1]; - continue; - case 'd': - string = opt_info.arg; - show = 1; - continue; - case 'e': - format = "%#"; - continue; - case 'E': - elapsed = 1; - continue; - case 'f': - format = opt_info.arg; - continue; - case 'i': - increment = 1; - continue; - case 'l': - tm_info.flags |= TM_LEAP; - continue; - case 'L': - last = 1; - continue; - case 'n': - network = 1; - continue; - case 'p': - if (!(f = newof(0, Fmt_t, 1, 0))) - error(ERROR_SYSTEM|3, "out of space [format]"); - f->next = fmts; - f->format = opt_info.arg; - fmts = f; - continue; - case 's': - show = 1; - continue; - case 'u': - tm_info.flags |= TM_UTC; - continue; - case 'U': - unelapsed = (int)opt_info.num; - continue; - case 'z': - listzones = tm_data.zone; - continue; - case '?': - error(ERROR_USAGE|4, "%s", opt_info.arg); - continue; - case ':': - error(2, "%s", opt_info.arg); - continue; - } - break; - } - argv += opt_info.index; - if (error_info.errors) - error(ERROR_USAGE|4, "%s", optusage(NiL)); - now = tmxgettime(); - if (listzones) - { - s = "-"; - while (listzones->standard) - { - if (listzones->type) - s = listzones->type; - sfprintf(sfstdout, "%3s %4s %4s %4d %4d\n", s, *listzones->standard ? listzones->standard : "-", listzones->daylight ? listzones->daylight : "-", listzones->west, listzones->dst); - listzones++; - show = 1; - } - } - else if (elapsed) - { - e = 0; - while (s = *argv++) - { - if (!(t = *argv++)) - { - argv--; - t = "now"; - } - ts = convert(fmts, s, now); - te = convert(fmts, t, now); - if (te > ts) - e += te - ts; - else - e += ts - te; - } - sfputr(sfstdout, fmtelapsed((unsigned long)tmxsec(e), 1), '\n'); - show = 1; - } - else if (unelapsed) - { - while (s = *argv++) - { - u = strelapsed(s, &t, unelapsed); - if (*t) - error(3, "%s: invalid elapsed time", s); - sfprintf(sfstdout, "%lu\n", u); - } - show = 1; - } - else if (filetime) - { - if (!*argv) - error(ERROR_USAGE|4, "%s", optusage(NiL)); - n = argv[1] != 0; - while (s = *argv++) - { - if (stat(s, &st)) - error(2, "%s: not found", s); - else - { - switch (filetime) - { - case 'a': - now = tmxgetatime(&st); - break; - case 'c': - now = tmxgetctime(&st); - break; - default: - now = tmxgetmtime(&st); - break; - } - tmxfmt(buf, sizeof(buf), format, now); - if (n) - sfprintf(sfstdout, "%s: %s\n", s, buf); - else - sfprintf(sfstdout, "%s\n", buf); - show = 1; - } - } - } - else - { - if ((s = *argv) && !format && *s == '+') - { - format = s + 1; - argv++; - s = *argv; - } - if (s || (s = string)) - { - if (*argv && string) - error(ERROR_USAGE|4, "%s", optusage(NiL)); - now = convert(fmts, s, now); - if (*argv && (s = *++argv)) - { - show = 1; - do - { - if (!last) - { - tmxfmt(buf, sizeof(buf), format, now); - sfprintf(sfstdout, "%s\n", buf); - } - now = convert(fmts, s, now); - } while (s = *++argv); - } - } - else - show = 1; - if (format || show) - { - tmxfmt(buf, sizeof(buf), format, now); - sfprintf(sfstdout, "%s\n", buf); - } - else if (settime(context, cmd, now, increment, network)) - error(ERROR_SYSTEM|3, "cannot set system time"); - } - while (fmts != &fmt) - { - f = fmts; - fmts = fmts->next; - free(f); - } - tm_info.flags = 0; - if (show && sfsync(sfstdout)) - error(ERROR_system(0), "write error"); - return error_info.errors != 0; -} diff --git a/usr/src/lib/libcmd/common/dirname.c b/usr/src/lib/libcmd/common/dirname.c deleted file mode 100644 index 076460eb97..0000000000 --- a/usr/src/lib/libcmd/common/dirname.c +++ /dev/null @@ -1,136 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * AT&T Bell Laboratories - * - * dirname path [suffix] - * - * print the dirname of a pathname - */ - -static const char usage[] = -"[-?\n@(#)$Id: dirname (AT&T Research) 2009-01-31 $\n]" -USAGE_LICENSE -"[+NAME?dirname - return directory portion of file name]" -"[+DESCRIPTION?\bdirname\b treats \astring\a as a file name and returns " - "the name of the directory containing the file name by deleting " - "the last component from \astring\a.]" -"[+?If \astring\a consists solely of \b/\b characters the output will " - "be a single \b/\b unless \bPATH_LEADING_SLASHES\b returned by " - "\bgetconf\b(1) is \b1\b and \astring\a consists of multiple " - "\b/\b characters in which case \b//\b will be output. " - "Otherwise, trailing \b/\b characters are removed, and if " - "there are no remaining \b/\b characters in \astring\a, " - "the string \b.\b will be written to standard output. " - "Otherwise, all characters following the last \b/\b are removed. " - "If the remaining string consists solely of \b/\b characters, " - "the output will be as if the original string had consisted solely " - "as \b/\b characters as described above. Otherwise, all " - "trailing slashes are removed and the output will be this string " - "unless this string is empty. If empty the output will be \b.\b.]" -"[f:file?Print the \b$PATH\b relative regular file path for \astring\a.]" -"[r:relative?Print the \b$PATH\b relative readable file path for \astring\a.]" -"[x:executable?Print the \b$PATH\b relative executable file path for \astring\a.]" -"\n" -"\nstring\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?Successful Completion.]" - "[+>0?An error occurred.]" -"}" -"[+SEE ALSO?\bbasename\b(1), \bgetconf\b(1), \bdirname\b(3), \bpathname\b(3)]" -; - -#include <cmd.h> - -static void l_dirname(register Sfio_t *outfile, register const char *pathname) -{ - register const char *last; - /* go to end of path */ - for(last=pathname; *last; last++); - /* back over trailing '/' */ - while(last>pathname && *--last=='/'); - /* back over non-slash chars */ - for(;last>pathname && *last!='/';last--); - if(last==pathname) - { - /* all '/' or "" */ - if(*pathname!='/') - last = pathname = "."; - } - else - { - /* back over trailing '/' */ - for(;*last=='/' && last > pathname; last--); - } - /* preserve // */ - if(last!=pathname && pathname[0]=='/' && pathname[1]=='/') - { - while(pathname[2]=='/' && pathname<last) - pathname++; - if(last!=pathname && pathname[0]=='/' && pathname[1]=='/' && *astconf("PATH_LEADING_SLASHES",NiL,NiL)!='1') - pathname++; - } - sfwrite(outfile,pathname,last+1-pathname); - sfputc(outfile,'\n'); -} - -int -b_dirname(int argc,register char *argv[], void* context) -{ - register int n; - int mode = 0; - char buf[PATH_MAX]; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - while (n = optget(argv, usage)) switch (n) - { - case 'f': - mode |= PATH_REGULAR; - break; - case 'r': - mode &= ~PATH_REGULAR; - mode |= PATH_READ; - break; - case 'x': - mode |= PATH_EXECUTE; - break; - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - argv += opt_info.index; - argc -= opt_info.index; - if(error_info.errors || argc != 1) - error(ERROR_usage(2),"%s", optusage(NiL)); - if(!mode) - l_dirname(sfstdout,argv[0]); - else if(pathpath(buf, argv[0], "", mode)) - sfputr(sfstdout, buf, '\n'); - else - error(1|ERROR_WARNING, "%s: relative path not found", argv[0]); - return(0); -} diff --git a/usr/src/lib/libcmd/common/expr.c b/usr/src/lib/libcmd/common/expr.c deleted file mode 100644 index 537408e507..0000000000 --- a/usr/src/lib/libcmd/common/expr.c +++ /dev/null @@ -1,535 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped - -/* - * expr.c - * Written by David Korn - * Tue Oct 31 08:48:11 EST 1995 - */ - -static const char usage[] = -"[-?\n@(#)$Id: expr (AT&T Research) 2008-01-30 $\n]" -USAGE_LICENSE -"[+NAME?expr - evaluate arguments as an expression]" -"[+DESCRIPTION?\bexpr\b evaluates an expression given as arguments and writes " - "the result to standard output. The character \b0\b will be written " - "to indicate a zero value and nothing will be written to indicate an " - "empty string.]" -"[+?Most of the functionality of \bexpr\b is provided in a more natural " - "way by the shell, \bsh\b(1), and \bexpr\b is provided primarily " - "for backward compatibility.]" -"[+?Terms of the expression must be separate arguments. A string argument is " - "one that can not be identified as an integer. Integer-valued " - "arguments may be preceded by a unary plus or minus sign. Because " - "many of the operators use characters that have special meaning to " - "the shell, they must be quoted when entered from the shell.]" - -"[+?Expressions are formed from the operators listed below in order " - "of increasing precedence within groups. All of the operators are " - "left associative. The symbols \aexpr1\a and \aexpr2\a represent " - "expressions formed from strings and integers and the following " - "operators:]{" - "[+\aexpr1\a \b|\b \aexpr2\a?Returns the evaluation of \aexpr1\a if " - "it is neither null nor 0, otherwise returns the evaluation of expr2.]" - - "[+\aexpr1\a \b&\b \aexpr2\a?Returns the evaluation of \aexpr1\a if " - "neither expression evaluates to null or 0, otherwise returns 0.]" - - "[+\aexpr1\a \aop\a \aexpr2\a?Returns the result of a decimal integer " - "comparison if both arguments are integers; otherwise, returns the " - "result of a string comparison using the locale-specific collation " - "sequence. The result of each comparison will be 1 if the specified " - "relationship is true, or 0 if the relationship is false. \aop\a " - "can be one of the following:]{" - "[+=?Equal.]" - "[+==?Equal.]" - "[+>?Greater than.]" - "[+>=?Greater than or equal to.]" - "[+<?Less than.]" - "[+<=?Less than or equal to.]" - "[+!=?Not equal to.]" - "}" - - "[+\aexpr1\a \aop\a \aexpr2\a?Where \aop\a is \b+\b or \b-\b; " - "addition or subtraction of decimal integer-valued arguments.]" - "[+\aexpr1\a \aop\a \aexpr2\a?Where \aop\a is \b*\b, \b/\b or \b%\b; " - "multiplication, division, or remainder of the decimal " - "integer-valued arguments.]" - "[+\aexpr1\a \b::\b \aexpr2\a?The matching operator : compares " - "\aexpr1\a with \aexpr2\a, which must be a BRE. Normally, " - "the matching operator returns the number of bytes matched " - "and 0 on failure. However, if the pattern contains at " - "least one sub-expression [\\( . . .\\)]], the string " - "corresponding to \\1 will be returned.]" - "[+( \aexpr1\a )?Grouping symbols. An expression can " - "be placed within parenthesis to change precedence.]" - "[+match\b \astring\a \aexpr\a?Equivalent to \astring\a \b:\b " - "\aexpr\a.]" - "[+substr\b \astring\a \apos\a \alength\a?\alength\a character " - "substring of \astring\a starting at \apos\a " - "(counting from 1).]" - "[+index\b \astring\a \achars\a?The position in \astring\a " - "(counting from 1) of the leftmost occurrence of any " - "character in \achars\a.]" - "[+length\b \astring\a?The number of characters in \astring\a.]" - "[+quote\b \atoken\a?Treat \atoken\a as a string operand.]" - "}" -"[+?For backwards compatibility, unrecognized options beginning with " - "a \b-\b will be treated as operands. Portable applications " - "should use \b--\b to indicate end of options.]" - -"\n" -"\n operand ...\n" -"\n" - -"[+EXIT STATUS?]{" - "[+0?The expression is neither null nor 0.]" - "[+1?The expression is null or 0.]" - "[+2?Invalid expressions.]" - "[+>2?An error occurred.]" - "}" -"[+SEE ALSO?\bregcomp\b(5), \bgrep\b(1), \bsh\b(1)]" -; - -#include <cmd.h> -#include <regex.h> - -#define T_ADD 0x100 -#define T_MULT 0x200 -#define T_CMP 0x400 -#define T_FUN 0x800 -#define T_OP 7 -#define T_NUM 1 -#define T_STR 2 - -#define OP_EQ (T_CMP|0) -#define OP_GT (T_CMP|1) -#define OP_LT (T_CMP|2) -#define OP_GE (T_CMP|3) -#define OP_LE (T_CMP|4) -#define OP_NE (T_CMP|5) -#define OP_PLUS (T_ADD|0) -#define OP_MINUS (T_ADD|1) -#define OP_MULT (T_MULT|0) -#define OP_DIV (T_MULT|1) -#define OP_MOD (T_MULT|2) -#define OP_INDEX (T_FUN|0) -#define OP_LENGTH (T_FUN|1) -#define OP_MATCH (T_FUN|2) -#define OP_QUOTE (T_FUN|3) -#define OP_SUBSTR (T_FUN|4) - -#define numeric(np) ((np)->type&T_NUM) - -static const struct Optable_s -{ - const char opname[3]; - int op; -} -optable[] = -{ - "|", '|', - "&", '&', - "=", OP_EQ, - "==", OP_EQ, - ">", OP_GT, - "<", OP_LT, - ">=", OP_GE, - "<=", OP_LE, - "!=", OP_NE, - "+", OP_PLUS, - "-", OP_MINUS, - "*", OP_MULT, - "/", OP_DIV, - "%", OP_MOD, - ":", ':', - "(", '(', - ")", ')' -}; - -typedef struct Node_s -{ - int type; - long num; - char *str; -} Node_t; - -typedef struct State_s -{ - int standard; - char** arglist; - char buf[36]; -} State_t; - -static int expr_or(State_t*, Node_t*); - -static int getnode(State_t* state, Node_t *np) -{ - register char* sp; - register char* cp; - register int i; - register int j; - register int k; - register int tok; - char* ep; - - if (!(cp = *state->arglist++)) - error(ERROR_exit(2), "argument expected"); - if (!state->standard) - switch (cp[0]) - { - case 'i': - if (cp[1] == 'n' && !strcmp(cp, "index")) - { - if (!(cp = *state->arglist++)) - error(ERROR_exit(2), "string argument expected"); - if (!(ep = *state->arglist++)) - error(ERROR_exit(2), "chars argument expected"); - np->num = (ep = strpbrk(cp, ep)) ? (ep - cp + 1) : 0; - np->type = T_NUM; - goto next; - } - break; - case 'l': - if (cp[1] == 'e' && !strcmp(cp, "length")) - { - if (!(cp = *state->arglist++)) - error(ERROR_exit(2), "string argument expected"); - np->num = strlen(cp); - np->type = T_NUM; - goto next; - } - break; - case 'm': - if (cp[1] == 'a' && !strcmp(cp, "match")) - { - if (!(np->str = *state->arglist++)) - error(ERROR_exit(2), "pattern argument expected"); - np->type = T_STR; - return ':'; - } - break; - case 'q': - if (cp[1] == 'u' && !strcmp(cp, "quote") && !(cp = *state->arglist++)) - error(ERROR_exit(2), "string argument expected"); - break; - case 's': - if (cp[1] == 'u' && !strcmp(cp, "substr")) - { - if (!(sp = *state->arglist++)) - error(ERROR_exit(2), "string argument expected"); - if (!(cp = *state->arglist++)) - error(ERROR_exit(2), "position argument expected"); - i = strtol(cp, &ep, 10); - if (*ep || --i < 0) - i = -1; - if (!(cp = *state->arglist++)) - error(ERROR_exit(2), "length argument expected"); - j = strtol(cp, &ep, 10); - if (*ep) - j = -1; - k = strlen(sp); - if (i < 0 || i >= k || j < 0) - sp = ""; - else - { - sp += i; - k -= i; - if (j < k) - sp[j] = 0; - } - np->type = T_STR; - np->str = sp; - goto next; - } - break; - } - if (*cp=='(' && cp[1]==0) - { - tok = expr_or(state, np); - if (tok != ')') - error(ERROR_exit(2),"closing parenthesis missing"); - } - else - { - np->type = T_STR; - np->str = cp; - if (*cp) - { - np->num = strtol(np->str,&ep,10); - if (!*ep) - np->type |= T_NUM; - } - } - next: - if (!(cp = *state->arglist)) - return 0; - state->arglist++; - for (i=0; i < sizeof(optable)/sizeof(*optable); i++) - if (*cp==optable[i].opname[0] && cp[1]==optable[i].opname[1]) - return optable[i].op; - error(ERROR_exit(2),"%s: unknown operator argument",cp); - return 0; -} - -static int expr_cond(State_t* state, Node_t *np) -{ - register int tok = getnode(state, np); - - while (tok==':') - { - regex_t re; - regmatch_t match[2]; - int n; - Node_t rp; - char *cp; - tok = getnode(state, &rp); - if (np->type&T_STR) - cp = np->str; - else - sfsprintf(cp=state->buf,sizeof(state->buf),"%d",np->num); - np->num = 0; - np->type = T_NUM; - if (n = regcomp(&re, rp.str, REG_LEFT|REG_LENIENT)) - regfatal(&re, ERROR_exit(2), n); - if (!(n = regexec(&re, cp, elementsof(match), match, 0))) - { - if (re.re_nsub > 0) - { - np->type = T_STR; - if (match[1].rm_so >= 0) - { - np->str = cp + match[1].rm_so; - np->str[match[1].rm_eo - match[1].rm_so] = 0; - np->num = strtol(np->str,&cp,10); - if (cp!=np->str && *cp==0) - np->type |= T_NUM; - } - else - np->str = ""; - } - else - np->num = match[0].rm_eo - match[0].rm_so; - } - else if (n != REG_NOMATCH) - regfatal(&re, ERROR_exit(2), n); - else if (re.re_nsub) - { - np->str = ""; - np->type = T_STR; - } - regfree(&re); - } - return tok; -} - -static int expr_mult(State_t* state, Node_t *np) -{ - register int tok = expr_cond(state, np); - - while ((tok&~T_OP)==T_MULT) - { - Node_t rp; - int op = (tok&T_OP); - tok = expr_cond(state, &rp); - if (!numeric(np) || !numeric(&rp)) - error(ERROR_exit(2),"non-numeric argument"); - if (op && rp.num==0) - error(ERROR_exit(2),"division by zero"); - switch(op) - { - case 0: - np->num *= rp.num; - break; - case 1: - np->num /= rp.num; - break; - case 2: - np->num %= rp.num; - } - np->type = T_NUM; - } - return tok; -} - -static int expr_add(State_t* state, Node_t *np) -{ - register int tok = expr_mult(state, np); - - while ((tok&~T_OP)==T_ADD) - { - Node_t rp; - int op = (tok&T_OP); - tok = expr_mult(state, &rp); - if (!numeric(np) || !numeric(&rp)) - error(ERROR_exit(2),"non-numeric argument"); - if (op) - np->num -= rp.num; - else - np->num += rp.num; - np->type = T_NUM; - } - return tok; -} - -static int expr_cmp(State_t* state, Node_t *np) -{ - register int tok = expr_add(state, np); - - while ((tok&~T_OP)==T_CMP) - { - Node_t rp; - register char *left,*right; - char buff1[36],buff2[36]; - int op = (tok&T_OP); - tok = expr_add(state, &rp); - if (numeric(&rp) && numeric(np)) - op |= 010; - else - { - if (np->type&T_STR) - left = np->str; - else - sfsprintf(left=buff1,sizeof(buff1),"%d",np->num); - if (rp.type&T_STR) - right = rp.str; - else - sfsprintf(right=buff2,sizeof(buff2),"%d",rp.num); - } - switch(op) - { - case 0: - np->num = streq(left,right); - break; - case 1: - np->num = (strcoll(left,right)>0); - break; - case 2: - np->num = (strcoll(left,right)<0); - break; - case 3: - np->num = (strcoll(left,right)>=0); - break; - case 4: - np->num = (strcoll(left,right)<=0); - break; - case 5: - np->num = !streq(left,right); - break; - case 010: - np->num = (np->num==rp.num); - break; - case 011: - np->num = (np->num>rp.num); - break; - case 012: - np->num = (np->num<rp.num); - break; - case 013: - np->num = (np->num>=rp.num); - break; - case 014: - np->num = (np->num<=rp.num); - break; - case 015: - np->num = (np->num!=rp.num); - break; - } - np->type = T_NUM; - } - return tok; -} - -static int expr_and(State_t* state, Node_t *np) -{ - register int tok = expr_cmp(state, np); - while (tok=='&') - { - Node_t rp; - tok = expr_cmp(state, &rp); - if ((numeric(&rp) && rp.num==0) || *rp.str==0) - { - np->num = 0; - np->type=T_NUM; - } - } - return tok; -} - -static int expr_or(State_t* state, Node_t *np) -{ - register int tok = expr_and(state, np); - while (tok=='|') - { - Node_t rp; - tok = expr_and(state, &rp); - if ((numeric(np) && np->num==0) || *np->str==0) - *np = rp; - } - return tok; -} - -int -b_expr(int argc, char *argv[], void *context) -{ - State_t state; - Node_t node; - int n; - - cmdinit(argc, argv,context, ERROR_CATALOG, 0); - state.standard = !strcmp(astconf("CONFORMANCE", NiL, NiL), "standard"); -#if 0 - if (state.standard) - state.arglist = argv+1; - else -#endif - { - while (n=optget(argv, usage)) - { - /* - * NOTE: this loop ignores all but literal -- and -? - * out of kindness for obsolescent usage - * (and is ok with the standard) but strict - * getopt conformance would give usage for all - * unknown - options - */ - if(n=='?') - error(ERROR_usage(2), "%s", opt_info.arg); - if (opt_info.option[1] != '?') - break; - error(ERROR_usage(2), "%s", opt_info.arg); - } - if (error_info.errors) - error(ERROR_usage(2),"%s",optusage((char*)0)); - state.arglist = argv+opt_info.index; - } - if (expr_or(&state, &node)) - error(ERROR_exit(2),"syntax error"); - if (node.type&T_STR) - { - if (*node.str) - sfprintf(sfstdout,"%s\n",node.str); - } - else - sfprintf(sfstdout,"%d\n",node.num); - return numeric(&node)?node.num==0:*node.str==0; -} diff --git a/usr/src/lib/libcmd/common/fds.c b/usr/src/lib/libcmd/common/fds.c deleted file mode 100644 index 0eb22bb1fd..0000000000 --- a/usr/src/lib/libcmd/common/fds.c +++ /dev/null @@ -1,360 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped - -static const char usage[] = -"[-?\n@(#)$Id: fds (AT&T Research) 2009-09-09 $\n]" -USAGE_LICENSE -"[+NAME?fds - list open file descriptor status]" -"[+DESCRIPTION?\bfds\b lists the status for each open file descriptor. " - "When invoked as a shell builtin it accesses the file descriptors of the " - "calling shell, otherwise it lists the file descriptors passed across " - "\bexec\b(2).]" -"[l:long?List file descriptor details.]" -"[u:unit?Write output to \afd\a.]#[fd]" -"[+SEE ALSO?\blogname\b(1), \bwho\b(1), \bgetgroups\b(2), \bgetsockname\b(2), \bgetsockopts\b(2)]" -; - -#include <cmd.h> -#include <ls.h> - -#include "FEATURE/sockets" - -#if defined(S_IFSOCK) && _sys_socket && _hdr_arpa_inet && _hdr_netinet_in && _lib_getsockname && _lib_getsockopt && _lib_inet_ntoa -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#else -#undef S_IFSOCK -#endif - -#ifndef minor -#define minor(x) (int)((x)&0xff) -#endif -#ifndef major -#define major(x) (int)(((unsigned int)(x)>>8)&0xff) -#endif - -#undef getconf -#define getconf(x) strtol(astconf(x,NiL,NiL),NiL,0) - -#ifdef S_IFSOCK - -typedef struct NV_s -{ - const char* name; - int value; -} NV_t; - -static const NV_t family[] = -{ -#ifdef AF_LOCAL - "pipe", AF_LOCAL, -#endif -#ifdef AF_UNIX - "pipe", AF_UNIX, -#endif -#ifdef AF_FILE - "FILE", AF_FILE, -#endif -#ifdef AF_INET - "INET", AF_INET, -#endif -#ifdef AF_AX25 - "AX25", AF_AX25, -#endif -#ifdef AF_IPX - "IPX", AF_IPX, -#endif -#ifdef AF_APPLETALK - "APPLETALK", AF_APPLETALK, -#endif -#ifdef AF_NETROM - "NETROM", AF_NETROM, -#endif -#ifdef AF_BRIDGE - "BRIDGE", AF_BRIDGE, -#endif -#ifdef AF_ATMPVC - "ATMPVC", AF_ATMPVC, -#endif -#ifdef AF_X25 - "X25", AF_X25, -#endif -#ifdef AF_INET6 - "INET6", AF_INET6, -#endif -#ifdef AF_ROSE - "ROSE", AF_ROSE, -#endif -#ifdef AF_DECnet - "DECnet", AF_DECnet, -#endif -#ifdef AF_NETBEUI - "NETBEUI", AF_NETBEUI, -#endif -#ifdef AF_SECURITY - "SECURITY", AF_SECURITY, -#endif -#ifdef AF_KEY - "KEY", AF_KEY, -#endif -#ifdef AF_NETLINK - "NETLINK", AF_NETLINK, -#endif -#ifdef AF_ROUTE - "ROUTE", AF_ROUTE, -#endif -#ifdef AF_PACKET - "PACKET", AF_PACKET, -#endif -#ifdef AF_ASH - "ASH", AF_ASH, -#endif -#ifdef AF_ECONET - "ECONET", AF_ECONET, -#endif -#ifdef AF_ATMSVC - "ATMSVC", AF_ATMSVC, -#endif -#ifdef AF_SNA - "SNA", AF_SNA, -#endif -#ifdef AF_IRDA - "IRDA", AF_IRDA, -#endif -#ifdef AF_PPPOX - "PPPOX", AF_PPPOX, -#endif -#ifdef AF_WANPIPE - "WANPIPE", AF_WANPIPE, -#endif -#ifdef AF_BLUETOOTH - "BLUETOOTH", AF_BLUETOOTH, -#endif - 0 -}; - -#endif - -int -b_fds(int argc, char** argv, void* context) -{ - register char* s; - register int i; - register char* m; - register char* x; - int flags; - int details; - int open_max; - int unit; - Sfio_t* sp; - struct stat st; -#ifdef S_IFSOCK - struct sockaddr_in addr; - char* a; - unsigned char* b; - unsigned char* e; - socklen_t addrlen; - socklen_t len; - int type; - int port; - int prot; - char num[64]; - char fam[64]; -#ifdef INET6_ADDRSTRLEN - char nam[256]; -#endif -#endif - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - details = 0; - unit = 1; - for (;;) - { - switch (optget(argv, usage)) - { - case 'l': - details = opt_info.num; - continue; - case 'u': - unit = opt_info.num; - continue; - case '?': - error(ERROR_USAGE|4, "%s", opt_info.arg); - continue; - case ':': - error(2, "%s", opt_info.arg); - continue; - } - break; - } - argv += opt_info.index; - if (error_info.errors || *argv) - error(ERROR_USAGE|4, "%s", optusage(NiL)); - if ((open_max = getconf("OPEN_MAX")) <= 0) - open_max = OPEN_MAX; - if (unit == 1) - sp = sfstdout; - else if (fstat(unit, &st) || !(sp = sfnew(NiL, NiL, SF_UNBOUND, unit, SF_WRITE))) - error(ERROR_SYSTEM|3, "%d: cannot write to file descriptor"); - for (i = 0; i <= open_max; i++) - { - if (fstat(i, &st)) - { - /* not open */ - continue; - } - if (!details) - { - sfprintf(sp, "%d\n", i); - continue; - } - if ((flags = fcntl(i, F_GETFL, (char*)0)) == -1) - m = "--"; - else - switch (flags & (O_RDONLY|O_WRONLY|O_RDWR)) - { - case O_RDONLY: - m = "r-"; - break; - case O_WRONLY: - m = "-w"; - break; - case O_RDWR: - m = "rw"; - break; - default: - m = "??"; - break; - } - x = (fcntl(i, F_GETFD, (char*)0) > 0) ? "x" : "-"; - if (isatty(i) && (s = ttyname(i))) - { - sfprintf(sp, "%02d %s%s %s %s\n", i, m, x, fmtmode(st.st_mode, 0), s); - continue; - } -#ifdef S_IFSOCK - addrlen = sizeof(addr); - memset(&addr, 0, addrlen); - if (!getsockname(i, (struct sockaddr*)&addr, (void*)&addrlen)) - { - type = 0; - prot = 0; -#ifdef SO_TYPE - len = sizeof(type); - if (getsockopt(i, SOL_SOCKET, SO_TYPE, (void*)&type, (void*)&len)) - type = -1; -#endif -#ifdef SO_PROTOTYPE - len = sizeof(prot); - if (getsockopt(i, SOL_SOCKET, SO_PROTOTYPE, (void*)&prot, (void*)&len)) - prot = -1; -#endif - if (!st.st_mode) - st.st_mode = S_IFSOCK|S_IRUSR|S_IWUSR; - s = 0; - switch (type) - { - case SOCK_DGRAM: - switch (addr.sin_family) - { - case AF_INET: -#ifdef AF_INET6 - case AF_INET6: -#endif - s = "udp"; - break; - } - break; - case SOCK_STREAM: - switch (addr.sin_family) - { - case AF_INET: -#ifdef AF_INET6 - case AF_INET6: -#endif -#ifdef IPPROTO_SCTP - if (prot == IPPROTO_SCTP) - s = "sctp"; - else -#endif - s = "tcp"; - break; - } - break; -#ifdef SOCK_RAW - case SOCK_RAW: - s = "raw"; - break; -#endif -#ifdef SOCK_RDM - case SOCK_RDM: - s = "rdm"; - break; -#endif -#ifdef SOCK_SEQPACKET - case SOCK_SEQPACKET: - s = "seqpacket"; - break; -#endif - } - if (!s) - { - for (type = 0; family[type].name && family[type].value != addr.sin_family; type++); - if (!(s = (char*)family[type].name)) - sfsprintf(s = num, sizeof(num), "family.%d", addr.sin_family); - } - port = 0; -#ifdef INET6_ADDRSTRLEN - if (a = (char*)inet_ntop(addr.sin_family, &addr.sin_addr, nam, sizeof(nam))) - port = ntohs(addr.sin_port); - else -#endif - if (addr.sin_family == AF_INET) - { - a = inet_ntoa(addr.sin_addr); - port = ntohs(addr.sin_port); - } - else - { - a = fam; - e = (b = (unsigned char*)&addr) + addrlen; - while (b < e && a < &fam[sizeof(fam)-1]) - a += sfsprintf(a, &fam[sizeof(fam)] - a - 1, ".%d", *b++); - a = a == fam ? "0" : fam + 1; - } - if (port) - sfprintf(sp, "%02d %s%s %s /dev/%s/%s/%d\n", i, m, x, fmtmode(st.st_mode, 0), s, a, port); - else - sfprintf(sp, "%02d %s%s %s /dev/%s/%s\n", i, m, x, fmtmode(st.st_mode, 0), s, a); - continue; - } -#endif - sfprintf(sp, "%02d %s%s %s /dev/inode/%u/%u\n", i, m, x, fmtmode(st.st_mode, 0), st.st_dev, st.st_ino); - } - if (sp != sfstdout) - { - sfsetfd(sp, -1); - sfclose(sp); - } - return 0; -} diff --git a/usr/src/lib/libcmd/common/features/ids b/usr/src/lib/libcmd/common/features/ids deleted file mode 100644 index 04be5755cf..0000000000 --- a/usr/src/lib/libcmd/common/features/ids +++ /dev/null @@ -1,8 +0,0 @@ -lib endgrent,getgrent,setgrent -lib fsid,getfsgid,isfsg sys/types.h sys/fss.h fsg.h -lfsg -mac fsid sys/types.h sys/fss.h fsg.h -cat{ - #if !_lib_fsid && _mac_fsid - #define _lib_fsid 1 - #endif -}end diff --git a/usr/src/lib/libcmd/common/features/sockets b/usr/src/lib/libcmd/common/features/sockets deleted file mode 100644 index 2660abb8df..0000000000 --- a/usr/src/lib/libcmd/common/features/sockets +++ /dev/null @@ -1,3 +0,0 @@ -sys socket -hdr arpa.inet,netinet.in -lib getsockname,getsockopt,inet_ntoa diff --git a/usr/src/lib/libcmd/common/features/symlink b/usr/src/lib/libcmd/common/features/symlink deleted file mode 100644 index a7d86b09f5..0000000000 --- a/usr/src/lib/libcmd/common/features/symlink +++ /dev/null @@ -1,21 +0,0 @@ -lib lchmod note{ lchmod implemented }end execute{ - #include <unistd.h> - #include <errno.h> - int - main() - { - lchmod("No-FiLe", 0); - return errno != ENOENT; - } -}end - -lib lchown note{ lchown implemented }end execute{ - #include <unistd.h> - #include <errno.h> - int - main() - { - lchown("No-FiLe", 0, 0); - return errno != ENOENT; - } -}end diff --git a/usr/src/lib/libcmd/common/features/utsname b/usr/src/lib/libcmd/common/features/utsname deleted file mode 100644 index 7254867181..0000000000 --- a/usr/src/lib/libcmd/common/features/utsname +++ /dev/null @@ -1,15 +0,0 @@ -lib getdomainname,gethostid,gethostname,sethostname,syscall,systeminfo,uname -lib syssgi -mem utsname.base_rel,utsname.idnumber,utsname.m_type,utsname.nodeext sys/utsname.h -sys syscall,systeminfo,syssgi - -tst cross{ - u=`/bin/uname -o 2>/dev/null` - case $u in - UWIN-*) u=UWIN ;; - esac - case $u in - '') ;; - *) echo "#define _UNAME_os_DEFAULT \"$u\" /* default os name */" ;; - esac -}end diff --git a/usr/src/lib/libcmd/common/fmt.c b/usr/src/lib/libcmd/common/fmt.c deleted file mode 100644 index 2830e2191b..0000000000 --- a/usr/src/lib/libcmd/common/fmt.c +++ /dev/null @@ -1,632 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped - -static const char usage[] = -"[-?\n@(#)$Id: fmt (AT&T Research) 2007-01-02 $\n]" -USAGE_LICENSE -"[+NAME?fmt - simple text formatter]" -"[+DESCRIPTION?\bfmt\b reads the input files and left justifies space " - "separated words into lines \awidth\a characters or less in length and " - "writes the lines to the standard output. The standard input is read if " - "\b-\b or no files are specified. Blank lines and interword spacing are " - "preserved in the output. Indentation is preserved, and lines with " - "identical indentation are joined and justified.]" -"[+?\bfmt\b is meant to format mail messages prior to sending, but may " - "also be useful for other simple tasks. For example, in \bvi\b(1) the " - "command \b:!}fmt\b will justify the lines in the current paragraph.]" -"[c:crown-margin?Preserve the indentation of the first two lines within " - "a paragraph, and align the left margin of each subsequent line with " - "that of the second line.]" -"[o:optget?Format concatenated \boptget\b(3) usage strings.]" -"[s:split-only?Split lines only; do not join short lines to form longer " - "ones.]" -"[u:uniform-spacing?One space between words, two after sentences.]" -"[w:width?Set the output line width to \acolumns\a.]#[columns:=72]" - "\n\n" -"[ file ... ]" - "\n\n" -"[+SEE ALSO?\bmailx\b(1), \bnroff\b(1), \btroff\b(1), \bvi\b(1), " - "\boptget\b(3)]" -; - -#include <cmd.h> -#include <ctype.h> - -typedef struct Fmt_s -{ - long flags; - char* outp; - char* outbuf; - char* endbuf; - Sfio_t* in; - Sfio_t* out; - int indent; - int nextdent; - int nwords; - int prefix; - int quote; - int retain; - int section; -} Fmt_t; - -#define INDENT 4 -#define TABSZ 8 - -#define isoption(fp,c) ((fp)->flags&(1L<<((c)-'a'))) -#define setoption(fp,c) ((fp)->flags|=(1L<<((c)-'a'))) -#define clroption(fp,c) ((fp)->flags&=~(1L<<((c)-'a'))) - -static void -outline(Fmt_t* fp) -{ - register char* cp = fp->outbuf; - int n = 0; - int c; - int d; - - if (!fp->outp) - return; - while (fp->outp[-1] == ' ') - fp->outp--; - *fp->outp = 0; - while (*cp++ == ' ') - n++; - if (n >= TABSZ) - { - n /= TABSZ; - cp = &fp->outbuf[TABSZ*n]; - while (n--) - *--cp = '\t'; - } - else - cp = fp->outbuf; - fp->nwords = 0; - if (!isoption(fp, 'o')) - sfputr(fp->out, cp, '\n'); - else if (*cp) - { - n = fp->indent; - if (*cp != '[') - { - if (*cp == ' ') - cp++; - n += INDENT; - } - while (n--) - sfputc(fp->out, ' '); - if (fp->quote) - { - if ((d = (fp->outp - cp)) <= 0) - c = 0; - else if ((c = fp->outp[-1]) == 'n' && d > 1 && fp->outp[-2] == '\\') - c = '}'; - sfprintf(fp->out, "\"%s%s\"\n", cp, c == ']' || c == '{' || c == '}' ? "" : " "); - } - else - sfputr(fp->out, cp, '\n'); - if (fp->nextdent) - { - fp->indent += fp->nextdent; - fp->endbuf -= fp->nextdent; - fp->nextdent = 0; - } - } - fp->outp = 0; -} - -static void -split(Fmt_t* fp, char* buf, int splice) -{ - register char* cp; - register char* ep; - register char* qp; - register int c = 1; - register int q = 0; - register int n; - int prefix; - - for (ep = buf; *ep == ' '; ep++); - prefix = ep - buf; - - /* - * preserve blank lines - */ - - if ((*ep == 0 || *buf == '.') && !isoption(fp, 'o')) - { - if (*ep) - prefix = strlen(buf); - outline(fp); - strcpy(fp->outbuf, buf); - fp->outp = fp->outbuf+prefix; - outline(fp); - return; - } - if (fp->prefix < prefix && !isoption(fp, 'c')) - outline(fp); - if (!fp->outp || prefix < fp->prefix) - fp->prefix = prefix; - while (c) - { - cp = ep; - while (*ep == ' ') - ep++; - if (cp != ep && isoption(fp, 'u')) - cp = ep-1; - while (c = *ep) - { - if (c == ' ') - break; - ep++; - - /* - * skip over \space - */ - - if (c == '\\' && *ep) - ep++; - } - n = (ep-cp); - if (n && isoption(fp, 'o')) - { - for (qp = cp; qp < ep; qp++) - if (*qp == '\\') - qp++; - else if (*qp == '"') - q = !q; - if (*(ep-1) == '"') - goto skip; - } - if (fp->nwords > 0 && &fp->outp[n] >= fp->endbuf && !fp->retain && !q) - outline(fp); - skip: - if (fp->nwords == 0) - { - if (fp->prefix) - memset(fp->outbuf, ' ', fp->prefix); - fp->outp = &fp->outbuf[fp->prefix]; - while (*cp == ' ') - cp++; - n = (ep-cp); - } - memcpy(fp->outp, cp, n); - fp->outp += n; - fp->nwords++; - } - if (isoption(fp, 's') || *buf == 0) - outline(fp); - else if (fp->outp) - { - /* - * two spaces at ends of sentences - */ - - if (!isoption(fp, 'o') && strchr(".:!?", fp->outp[-1])) - *fp->outp++ = ' '; - if (!splice && !fp->retain && (!fp->quote || (fp->outp - fp->outbuf) < 2 || fp->outp[-2] != '\\' || fp->outp[-1] != 'n' && fp->outp[-1] != 't' && fp->outp[-1] != ' ')) - *fp->outp++ = ' '; - } -} - -static int -dofmt(Fmt_t* fp) -{ - register int c; - int b; - int x; - int splice; - char* cp; - char* dp; - char* ep; - char* lp; - char* tp; - char buf[8192]; - - cp = 0; - while (cp || (cp = sfgetr(fp->in, '\n', 0)) && !(splice = 0) && (lp = cp + sfvalue(fp->in) - 1) || (cp = sfgetr(fp->in, '\n', SF_LASTR)) && (splice = 1) && (lp = cp + sfvalue(fp->in))) - { - if (isoption(fp, 'o')) - { - if (!isoption(fp, 'i')) - { - setoption(fp, 'i'); - b = 0; - while (cp < lp) - { - if (*cp == ' ') - b += 1; - else if (*cp == '\t') - b += INDENT; - else - break; - cp++; - } - fp->indent = roundof(b, INDENT); - } - else - while (cp < lp && (*cp == ' ' || *cp == '\t')) - cp++; - if (!isoption(fp, 'q') && cp < lp) - { - setoption(fp, 'q'); - if (*cp == '"') - { - ep = lp; - while (--ep > cp) - if (*ep == '"') - { - fp->quote = 1; - break; - } - else if (*ep != ' ' && *ep != '\t') - break; - } - } - } - again: - dp = buf; - ep = 0; - for (b = 1;; b = 0) - { - if (cp >= lp) - { - cp = 0; - break; - } - c = *cp++; - if (isoption(fp, 'o')) - { - if (c == '\\') - { - x = 0; - c = ' '; - cp--; - while (cp < lp) - { - if (*cp == '\\') - { - cp++; - if ((lp - cp) < 1) - { - c = '\\'; - break; - } - if (*cp == 'n') - { - cp++; - c = '\n'; - if ((lp - cp) > 2) - { - if (*cp == ']' || *cp == '@' && *(cp + 1) == '(') - { - *dp++ = '\\'; - *dp++ = 'n'; - c = *cp++; - break; - } - if (*cp == '\\' && *(cp + 1) == 'n') - { - cp += 2; - *dp++ = '\n'; - break; - } - } - } - else if (*cp == 't' || *cp == ' ') - { - cp++; - x = 1; - c = ' '; - } - else - { - if (x && dp != buf && *(dp - 1) != ' ') - *dp++ = ' '; - *dp++ = '\\'; - c = *cp++; - break; - } - } - else if (*cp == ' ' || *cp == '\t') - { - cp++; - c = ' '; - x = 1; - } - else - { - if (x && c != '\n' && dp != buf && *(dp - 1) != ' ') - *dp++ = ' '; - break; - } - } - if (c == '\n') - { - c = 0; - goto flush; - } - if (c == ' ' && (dp == buf || *(dp - 1) == ' ')) - continue; - } - else if (c == '"') - { - if (b || cp >= lp) - { - if (fp->quote) - continue; - fp->section = 0; - } - } - else if (c == '\a') - { - *dp++ = '\\'; - c = 'a'; - } - else if (c == '\b') - { - *dp++ = '\\'; - c = 'b'; - } - else if (c == '\f') - { - *dp++ = '\\'; - c = 'f'; - } - else if (c == '\v') - { - *dp++ = '\\'; - c = 'v'; - } - else if (c == ']' && (cp >= lp || *cp != ':' && *cp != '#' && *cp != '!')) - { - if (cp < lp && *cp == ']') - { - cp++; - *dp++ = c; - } - else - { - fp->section = 1; - fp->retain = 0; - flush: - *dp++ = c; - *dp = 0; - split(fp, buf, 0); - outline(fp); - goto again; - } - } - else if (fp->section) - { - if (c == '[') - { - if (b) - fp->retain = 1; - else - { - cp--; - c = 0; - goto flush; - } - fp->section = 0; - } - else if (c == '{') - { - x = 1; - for (tp = cp; tp < lp; tp++) - { - if (*tp == '[' || *tp == '\n') - break; - if (*tp == ' ' || *tp == '\t' || *tp == '"') - continue; - if (*tp == '\\' && (lp - tp) > 1) - { - if (*++tp == 'n') - break; - if (*tp == 't' || *tp == '\n') - continue; - } - x = 0; - break; - } - if (x) - { - if (fp->endbuf > (fp->outbuf + fp->indent + 2*INDENT)) - fp->nextdent = 2*INDENT; - goto flush; - } - else - fp->section = 0; - } - else if (c == '}') - { - if (fp->indent && (b || *(cp - 2) != 'f')) - { - if (b) - { - fp->indent -= 2*INDENT; - fp->endbuf += 2*INDENT; - } - else - { - cp--; - c = 0; - } - goto flush; - } - else - fp->section = 0; - } - else if (c == ' ' || c == '\t') - continue; - else - fp->section = 0; - } - else if (c == '?' && (cp >= lp || *cp != '?')) - { - if (fp->retain) - { - cp--; - while (cp < lp && *cp != ' ' && *cp != '\t' && *cp != ']' && dp < &buf[sizeof(buf)-3]) - *dp++ = *cp++; - if (cp < lp && (*cp == ' ' || *cp == '\t')) - *dp++ = *cp++; - *dp = 0; - split(fp, buf, 0); - dp = buf; - ep = 0; - fp->retain = 0; - if (fp->outp >= fp->endbuf) - outline(fp); - continue; - } - } - else if (c == ' ' || c == '\t') - for (c = ' '; *cp == ' ' || *cp == '\t'; cp++); - } - else if (c == '\b') - { - if (dp > buf) - { - dp--; - if (ep) - ep--; - } - continue; - } - else if (c == '\t') - { - /* - * expand tabs - */ - - if (!ep) - ep = dp; - c = isoption(fp, 'o') ? 1 : TABSZ - (dp - buf) % TABSZ; - if (dp >= &buf[sizeof(buf) - c - 3]) - { - cp--; - break; - } - while (c-- > 0) - *dp++ = ' '; - continue; - } - else if (!isprint(c)) - continue; - if (dp >= &buf[sizeof(buf) - 3]) - { - tp = dp; - while (--tp > buf) - if (isspace(*tp)) - { - cp -= dp - tp; - dp = tp; - break; - } - ep = 0; - break; - } - if (c != ' ') - ep = 0; - else if (!ep) - ep = dp; - *dp++ = c; - } - if (ep) - *ep = 0; - else - *dp = 0; - split(fp, buf, splice); - } - return 0; -} - -int -b_fmt(int argc, char** argv, void *context) -{ - register int n; - char* cp; - Fmt_t fmt; - char outbuf[8 * 1024]; - - fmt.flags = 0; - fmt.out = sfstdout; - fmt.outbuf = outbuf; - fmt.outp = 0; - fmt.endbuf = &outbuf[72]; - fmt.indent = 0; - fmt.nextdent = 0; - fmt.nwords = 0; - fmt.prefix = 0; - fmt.quote = 0; - fmt.retain = 0; - fmt.section = 1; - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - while (n = optget(argv, usage)) - switch (n) - { - case 'c': - case 'o': - case 's': - case 'u': - setoption(&fmt, n); - break; - case 'w': - if (opt_info.num < TABSZ || opt_info.num>= sizeof(outbuf)) - error(2, "width out of range"); - fmt.endbuf = &outbuf[opt_info.num]; - break; - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - argv += opt_info.index; - if (error_info.errors) - error(ERROR_usage(2), "%s", optusage(NiL)); - if (isoption(&fmt, 'o')) - setoption(&fmt, 'c'); - if (isoption(&fmt, 's')) - clroption(&fmt, 'u'); - if (cp = *argv) - argv++; - do { - if (!cp || streq(cp, "-")) - fmt.in = sfstdin; - else if (!(fmt.in = sfopen(NiL, cp, "r"))) - { - error(ERROR_system(0), "%s: cannot open", cp); - error_info.errors = 1; - continue; - } - dofmt(&fmt); - if (fmt.in != sfstdin) - sfclose(fmt.in); - } while (cp = *argv++); - outline(&fmt); - if (sfsync(sfstdout)) - error(ERROR_system(0), "write error"); - return error_info.errors != 0; -} diff --git a/usr/src/lib/libcmd/common/fold.c b/usr/src/lib/libcmd/common/fold.c deleted file mode 100644 index e371570095..0000000000 --- a/usr/src/lib/libcmd/common/fold.c +++ /dev/null @@ -1,242 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * AT&T Bell Laboratories - * - * fold - */ - -static const char usage[] = -"[-?\n@(#)$Id: fold (AT&T Research) 2004-11-18 $\n]" -USAGE_LICENSE -"[+NAME?fold - fold lines]" -"[+DESCRIPTION?\bfold\b is a filter that folds lines from its input, " - "breaking the lines to have a maximum of \awidth\a column " - "positions (or bytes if the \b-b\b option is specified). Lines " - "are broken by the insertion of a newline character such that " - "each output line is the maximum width possible that does not " - "exceed the specified number of column positions, (or bytes). A line " - "will not be broken in the middle of a character.] " -"[+?Unless the \b-b\b option is specified, the following will be treated " - "specially:]{" - "[+carriage-return?The current count of line width will be set " - "to zero. \bfold\b will not insert a newline immediately " - "before or after a carriage-return.]" - "[+backspace?If positive, the current count of line width will be " - "decremented by one. \bfold\b will not insert a newline " - "immediately before or after a backspace.]" - "[+tab?Each tab character encountered will advance the column " - "position to the next tab stop. Tab stops are at each " - "column position \an\a, where \an\a modulo 8 equals 1.]" - "}" -"[+?If no \afile\a is given, or if the \afile\a is \b-\b, \bfold\b " - "reads from standard input. The start of the file is defined " - "as the current offset.]" - -"[b:bytes?Count bytes rather than columns so that each carriage-return, " - "backspace, and tab counts as 1.]" -"[c:continue?Emit \atext\a at line splits.]:[text:='\\n']" -"[d:delimiter?Break at \adelim\a boundaries.]:[delim]" -"[s:spaces?Break at word boundaries. If the line contains any blanks, " - "(spaces or tabs), within the first \awidth\a column positions or " - "bytes, the line is broken after the last blank meeting the " - "\awidth\a constraint.]" -"[w:width]#[width:=80?Use a maximum line length of \awidth\a columns " - "instead of the default.]" -"\n" -"\n[file ...]\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?All files processed successfully.]" - "[+>0?An error occurred.]" -"}" -"[+SEE ALSO?\bpaste\b(1)]" -; - - -#include <cmd.h> - -#define WIDTH 80 -#define TABSIZE 8 - -#define T_EOF 1 -#define T_NL 2 -#define T_BS 3 -#define T_TAB 4 -#define T_SP 5 -#define T_RET 6 - -static void fold(Sfio_t *in, Sfio_t *out, register int width, const char *cont, size_t contsize, char *cols) -{ - register char *cp, *first; - register int n, col=0, x=0; - register char *last_space=0; - cols[0] = 0; - for (;;) - { - if (!(cp = sfgetr(in,'\n',0))) - { - if (!(cp = sfgetr(in,'\n',-1)) || (n = sfvalue(in)) <= 0) - break; - x = cp[--n]; - cp[n] = '\n'; - } - /* special case -b since no column adjustment is needed */ - if(cols['\b']==0 && (n=sfvalue(in))<=width) - { - sfwrite(out,cp,n); - continue; - } - first = cp; - col = 0; - last_space = 0; - for(;;) - { - while((n=cols[*(unsigned char*)cp++])==0); - while((cp-first) > (width-col)) - { - if(last_space) - col = last_space - first; - else - col = width-col; - sfwrite(out,first,col); - first += col; - col = 0; - last_space = 0; - if(cp>first+1 || (n!=T_NL && n!=T_BS)) - sfwrite(out, cont, contsize); - } - switch(n) - { - case T_NL: - if(x) - *(cp-1) = x; - break; - case T_RET: - col = 0; - continue; - case T_BS: - if((cp+(--col)-first)>0) - col--; - continue; - case T_TAB: - n = (TABSIZE-1) - (cp+col-1-first)&(TABSIZE-1); - col +=n; - if((cp-first) > (width-col)) - { - sfwrite(out,first,(--cp)-first); - sfwrite(out, cont, contsize); - first = cp; - col = TABSIZE-1; - last_space = 0; - continue; - } - if(cols[' ']) - last_space = cp; - continue; - case T_SP: - last_space = cp; - continue; - default: - continue; - } - break; - } - sfwrite(out,first,cp-first); - } -} - -int -b_fold(int argc, char *argv[], void* context) -{ - register int n, width=WIDTH; - register Sfio_t *fp; - register char *cp; - char *cont="\n"; - size_t contsize = 1; - char cols[1<<CHAR_BIT]; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - memset(cols, 0, sizeof(cols)); - cols['\t'] = T_TAB; - cols['\b'] = T_BS; - cols['\n'] = T_NL; - cols['\r'] = T_RET; - for (;;) - { - switch (optget(argv, usage)) - { - case 0: - break; - case 'b': - cols['\r'] = cols['\b'] = 0; - cols['\t'] = cols[' ']; - continue; - case 'c': - contsize = stresc(cont = strdup(opt_info.arg)); - continue; - case 'd': - if (n = *opt_info.arg) - cols[n] = T_SP; - continue; - case 's': - cols[' '] = T_SP; - if(cols['\t']==0) - cols['\t'] = T_SP; - continue; - case 'w': - if ((width = opt_info.num) <= 0) - error(2, "%d: width must be positive", opt_info.num); - continue; - case ':': - error(2, "%s", opt_info.arg); - continue; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - continue; - } - break; - } - argv += opt_info.index; - argc -= opt_info.index; - if(error_info.errors) - error(ERROR_usage(2),"%s", optusage(NiL)); - if(cp = *argv) - argv++; - do - { - if(!cp || streq(cp,"-")) - fp = sfstdin; - else if(!(fp = sfopen(NiL,cp,"r"))) - { - error(ERROR_system(0),"%s: cannot open",cp); - error_info.errors = 1; - continue; - } - fold(fp,sfstdout,width,cont,contsize,cols); - if(fp!=sfstdin) - sfclose(fp); - } - while(cp= *argv++); - return(error_info.errors); -} diff --git a/usr/src/lib/libcmd/common/fts_fix.c b/usr/src/lib/libcmd/common/fts_fix.c deleted file mode 100644 index cc007e06c7..0000000000 --- a/usr/src/lib/libcmd/common/fts_fix.c +++ /dev/null @@ -1,56 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -/* - * -lcmd specific workaround to handle - * fts_namelen - * fts_pathlen - * fts_level - * changing from [unsigned] short bit to [s]size_t - * - * ksh (or any other main application) that pulls in -lcmd - * at runtime may result in old -last running with new -lcmd - * which is not a good situation (tm) - * - * probably safe to drop after 20150101 - */ - -#include <ast.h> -#include <fts_fix.h> - -#undef fts_read - -FTSENT* -_fts_read(FTS* fts) -{ - FTSENT* oe; - - static FTSENT* ne; - - if ((oe = _ast_fts_read(fts)) && ast.version < 20100102L && (ne || (ne = newof(0, FTSENT, 1, 0)))) - { - *ne = *oe; - oe = ne; - ne->fts_namelen = ne->_fts_namelen; - ne->fts_pathlen = ne->_fts_pathlen; - ne->fts_level = ne->_fts_level; - } - return oe; -} diff --git a/usr/src/lib/libcmd/common/fts_fix.h b/usr/src/lib/libcmd/common/fts_fix.h deleted file mode 100644 index e4d411a82e..0000000000 --- a/usr/src/lib/libcmd/common/fts_fix.h +++ /dev/null @@ -1,48 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -/* - * -lcmd specific workaround to handle - * fts_namelen - * fts_pathlen - * fts_level - * changing from [unsigned] short bit to [s]size_t - * - * ksh (or any other main application) that pulls in -lcmd - * at runtime may result in old -last running with new -lcmd - * which is not a good situation (tm) - */ - -#ifndef _FTS_FIX_H -#define _FTS_FIX_H 1 - -#include <fts.h> - -#ifdef fts_read -#undef fts_read -#else -#define _ast_fts_read fts_read -#endif - -#define fts_read _fts_read - -extern FTSENT* fts_read(FTS*); - -#endif diff --git a/usr/src/lib/libcmd/common/getconf.c b/usr/src/lib/libcmd/common/getconf.c deleted file mode 100644 index d7d02c98ac..0000000000 --- a/usr/src/lib/libcmd/common/getconf.c +++ /dev/null @@ -1,396 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * Glenn Fowler - * AT&T Research - * - * getconf - get configuration values - */ - -static const char usage[] = -"[-?\n@(#)$Id: getconf (AT&T Research) 2008-04-24 $\n]" -USAGE_LICENSE -"[+NAME?getconf - get configuration values]" -"[+DESCRIPTION?\bgetconf\b displays the system configuration value for" -" \aname\a. If \aname\a is a filesystem specific variable then" -" the value is determined relative to \apath\a or the current" -" directory if \apath\a is omitted. If \avalue\a is specified then" -" \bgetconf\b attempts to change the process local value to \avalue\a." -" \b-\b may be used in place of \apath\a when it is not relevant." -" If \apath\a is \b=\b then the the \avalue\a is cached and used" -" for subsequent tests in the calling and all child processes." -" Only \bwritable\b variables may be set; \breadonly\b variables" -" cannot be changed.]" -"[+?The current value for \aname\a is written to the standard output. If" -" \aname\a is valid but undefined then \bundefined\b is written to" -" the standard output. If \aname\a is invalid or an error occurs in" -" determining its value, then a diagnostic written to the standard error" -" and \bgetconf\b exits with a non-zero exit status.]" -"[+?More than one variable may be set or queried by providing the \aname\a" -" \apath\a \avalue\a 3-tuple for each variable, specifying \b-\b for" -" \avalue\a when querying.]" -"[+?If no operands are specified then all known variables are written in" -" \aname\a=\avalue\a form to the standard output, one per line." -" Only one of \b--call\b, \b--name\b or \b--standard\b may be specified.]" -"[+?This implementation uses the \bastgetconf\b(3) string interface to the native" -" \bsysconf\b(2), \bconfstr\b(2), \bpathconf\b(2), and \bsysinfo\b(2)" -" system calls. If \bgetconf\b on \b$PATH\b is not the default native" -" \bgetconf\b, named by \b$(getconf GETCONF)\b, then \bastgetconf\b(3)" -" checks only \bast\b specific extensions and the native system calls;" -" invalid options and/or names not supported by \bastgetconf\b(3) cause" -" the \bgetconf\b on \b$PATH\b to be executed.]" - -"[a:all?Call the native \bgetconf\b(1) with option \b-a\b.]" -"[b:base?List base variable name sans call and standard prefixes.]" -"[c:call?Display variables with call prefix that matches \aRE\a. The call" -" prefixes are:]:[RE]{" -" [+CS?\bconfstr\b(2)]" -" [+PC?\bpathconf\b(2)]" -" [+SC?\bsysconf\b(2)]" -" [+SI?\bsysinfo\b(2)]" -" [+XX?Constant value.]" -"}" -"[d:defined?Only display defined values when no operands are specified.]" -"[l:lowercase?List variable names in lower case.]" -"[n:name?Display variables with name that match \aRE\a.]:[RE]" -"[p:portable?Display the named \bwritable\b variables and values in a form that" -" can be directly executed by \bsh\b(1) to set the values. If \aname\a" -" is omitted then all \bwritable\b variables are listed.]" -"[q:quote?\"...\" quote values.]" -"[r:readonly?Display the named \breadonly\b variables in \aname\a=\avalue\a form." -" If \aname\a is omitted then all \breadonly\b variables are listed.]" -"[s:standard?Display variables with standard prefix that matches \aRE\a." -" Use the \b--table\b option to view all standard prefixes, including" -" local additions. The standard prefixes available on all systems" -" are:]:[RE]{" -" [+AES]" -" [+AST]" -" [+C]" -" [+GNU]" -" [+POSIX]" -" [+SVID]" -" [+XBS5]" -" [+XOPEN]" -" [+XPG]" -"}" -"[t:table?Display the internal table that contains the name, standard," -" standard section, and system call symbol prefix for each variable.]" -"[w:writable?Display the named \bwritable\b variables in \aname\a=\avalue\a" -" form. If \aname\a is omitted then all \bwritable\b variables are" -" listed.]" -"[v:specification?Call the native \bgetconf\b(1) with option" -" \b-v\b \aname\a.]:[name]" - -"\n" -"\n[ name [ path [ value ] ] ... ]\n" -"\n" - -"[+ENVIRONMENT]{" -" [+_AST_FEATURES?Process local writable values that are different from" -" the default are stored in the \b_AST_FEATURES\b environment" -" variable. The \b_AST_FEATURES\b value is a space-separated" -" list of \aname\a \apath\a \avalue\a 3-tuples, where" -" \aname\a is the system configuration name, \apath\a is the" -" corresponding path, \b-\b if no path is applicable, and" -" \avalue\a is the system configuration value.]" -"}" -"[+SEE ALSO?\bpathchk\b(1), \bconfstr\b(2), \bpathconf\b(2)," -" \bsysconf\b(2), \bastgetconf\b(3)]" -; - -#include <cmd.h> -#include <proc.h> -#include <ls.h> - -typedef struct Path_s -{ - const char* path; - int len; -} Path_t; - -int -b_getconf(int argc, char** argv, void* context) -{ - register char* name; - register char* path; - register char* value; - register const char* s; - register const char* t; - char* pattern; - char* native; - char* cmd; - Path_t* e; - Path_t* p; - int flags; - int n; - int i; - int m; - int q; - char** oargv; - char buf[PATH_MAX]; - Path_t std[64]; - struct stat st0; - struct stat st1; - - static const char empty[] = "-"; - static const Path_t equiv[] = { { "/bin", 4 }, { "/usr/bin", 8 } }; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - oargv = argv; - if (*(native = astconf("GETCONF", NiL, NiL)) != '/') - native = 0; - flags = 0; - name = 0; - pattern = 0; - for (;;) - { - switch (optget(argv, usage)) - { - case 'a': - if (native) - goto defer; - continue; - case 'b': - flags |= ASTCONF_base; - continue; - case 'c': - flags |= ASTCONF_matchcall; - pattern = opt_info.arg; - continue; - case 'd': - flags |= ASTCONF_defined; - continue; - case 'l': - flags |= ASTCONF_lower; - continue; - case 'n': - flags |= ASTCONF_matchname; - pattern = opt_info.arg; - continue; - case 'p': - flags |= ASTCONF_parse; - continue; - case 'q': - flags |= ASTCONF_quote; - continue; - case 'r': - flags |= ASTCONF_read; - continue; - case 's': - flags |= ASTCONF_matchstandard; - pattern = opt_info.arg; - continue; - case 't': - flags |= ASTCONF_table; - continue; - case 'v': - if (native) - goto defer; - continue; - case 'w': - flags |= ASTCONF_write; - continue; - case ':': - if (native) - goto defer; - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - break; - } - argv += opt_info.index; - if (!(name = *argv)) - path = 0; - else if (streq(name, empty)) - { - name = 0; - if (path = *++argv) - { - argv++; - if (streq(path, empty)) - path = 0; - } - } - if (error_info.errors || !name && *argv) - error(ERROR_usage(2), "%s", optusage(NiL)); - if (!name) - astconflist(sfstdout, path, flags, pattern); - else - { - flags = native ? (ASTCONF_system|ASTCONF_error) : 0; - do - { - if (!(path = *++argv)) - value = 0; - else - { - if (streq(path, empty)) - { - path = 0; - flags = 0; - } - if ((value = *++argv) && (streq(value, empty))) - { - value = 0; - flags = 0; - } - } - s = astgetconf(name, path, value, flags, errorf); - if (error_info.errors) - break; - if (!s) - goto defer; - if (!value) - { - if (flags & ASTCONF_write) - { - sfputr(sfstdout, name, ' '); - sfputr(sfstdout, path ? path : empty, ' '); - } - sfputr(sfstdout, s, '\n'); - } - } while (*argv && (name = *++argv)); - } - return error_info.errors != 0; - - defer: - - /* - * defer to argv[0] if absolute and it exists - */ - - if ((cmd = oargv[0]) && *cmd == '/' && !access(cmd, X_OK)) - goto found; - - /* - * defer to the first getconf on $PATH that is also on the standard PATH - */ - - e = std; - s = astconf("PATH", NiL, NiL); - q = !stat(equiv[0].path, &st0) && !stat(equiv[1].path, &st1) && st0.st_ino == st1.st_ino && st0.st_dev == st1.st_dev; - m = 0; - do - { - for (t = s; *s && *s != ':'; s++); - if ((n = s - t) && *t == '/') - { - if (q) - for (i = 0; i < 2; i++) - if (n == equiv[i].len && !strncmp(t, equiv[i].path, n)) - { - if (m & (i+1)) - t = 0; - else - { - m |= (i+1); - if (!(m & (!i+1))) - { - m |= (!i+1); - e->path = t; - e->len = n; - e++; - if (e >= &std[elementsof(std)]) - break; - t = equiv[!i].path; - n = equiv[!i].len; - } - } - } - if (t) - { - e->path = t; - e->len = n; - e++; - } - } - while (*s == ':') - s++; - } while (*s && e < &std[elementsof(std)]); - if (e < &std[elementsof(std)]) - { - e->len = strlen(e->path = "/usr/sbin"); - if (++e < &std[elementsof(std)]) - { - e->len = strlen(e->path = "/sbin"); - e++; - } - } - if (s = getenv("PATH")) - do - { - for (t = s; *s && *s != ':'; s++); - if ((n = s - t) && *t == '/') - { - for (p = std; p < e; p++) - if (p->len == n && !strncmp(t, p->path, n)) - { - sfsprintf(buf, sizeof(buf), "%-*.*s/%s", n, n, t, error_info.id); - if (!access(buf, X_OK)) - { - cmd = buf; - goto found; - } - } - } - while (*s == ':') - s++; - } while (*s); - - /* - * defer to the first getconf on the standard PATH - */ - - for (p = std; p < e; p++) - { - sfsprintf(buf, sizeof(buf), "%-*.*s/%s", p->len, p->len, p->path, error_info.id); - if (!access(buf, X_OK)) - { - cmd = buf; - goto found; - } - } - - /* - * out of deferrals - */ - - if (name) - error(4, "%s: unknown name -- no native getconf(1) to defer to", name); - else - error(4, "no native getconf(1) to defer to"); - return 2; - - found: - - /* - * don't blame us for crappy diagnostics - */ - - oargv[0] = cmd; - if ((n = sh_run(context, argc, oargv)) >= EXIT_NOEXEC) - error(ERROR_SYSTEM|2, "%s: exec error [%d]", cmd, n); - return n; -} diff --git a/usr/src/lib/libcmd/common/grep.c b/usr/src/lib/libcmd/common/grep.c deleted file mode 100644 index 1e857f087c..0000000000 --- a/usr/src/lib/libcmd/common/grep.c +++ /dev/null @@ -1,876 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1995-2009 AT&T Knowledge Ventures * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Knowledge Ventures * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped - -static const char usage[] = -"[-?\n@(#)$Id: grep (AT&T Research) 2006-06-14 $\n]" -USAGE_LICENSE -"[+NAME?grep - search lines in files for matching patterns]" -"[+DESCRIPTION?The \bgrep\b commands search the named input files" -" for lines containing a match for the given \apatterns\a." -" Matching lines are printed by default. The standard input is searched" -" if no files are given or when the file \b-\b is specified.]" -"[+?There are six variants of \bgrep\b, each one using a different form of" -" \apattern\a, controlled either by option or the command path" -" base name. Details of each variant may be found in \bregex\b(3).]" -" {" -" [+grep?The default basic regular expressions (no alternations.)]" -" [+egrep?Extended regular expressions (alternations, one or more.)]" -" [+pgrep?\bperl\b(1) regular expressions (lenient extended.)]" -" [+xgrep?Augmented regular expressions (conjunction, negation.)]" -" [+fgrep?Fixed string expressions.]" -" [+agrep?Approximate regular expressions (not implemented.)]" -" }" -"[G:basic-regexp?\bgrep\b mode (default): basic regular expression \apatterns\a.]" -"[E:extended-regexp?\begrep\b mode: extended regular expression \apatterns\a.]" -"[X:augmented-regexp?\bxgrep\b mode: augmented regular expression \apatterns\a.]" -"[P:perl-regexp?\bpgrep\b mode: \bperl\b(1) regular expression \apatterns\a.]" -"[F:fixed-string?\bfgrep\b mode: fixed string \apatterns\a.]" -"[A:approximate-regexp?\bagrep\b mode: approximate regular expression \apatterns\a (not implemented.)]" - -"[C:context?Set the matched line context \abefore\a and \aafter\a count." -" By default only matched lines are printed.]:?" -" [before[,after]]:=2,2]" -"[c:count?Only print a matching line count for each file.]" -"[e:expression|pattern|regexp?Specify a matching \apattern\a. More than one" -" \apattern\a implies alternation. If this option is specified" -" then the command line \apattern\a must be omitted.]:" -" [pattern]" -"[f:file?Each line in \apattern-file\a is a \apattern\a, placed into a single" -" alternating expression.]:" -" [pattern-file]" -"[H:filename|with-filename?Prefix each matched line with the containing file name.]" -"[h:no-filename?Suppress containing file name prefix for each matched line.]" -"[i:ignore-case?Ignore case when matching.]" -"[l:files-with-matches?Only print file names with at least one match.]" -"[L:files-without-matches?Only print file names with no matches.]" -"[b:highlight?Highlight matches using the ansi terminal bold sequence.]" -"[v:invert-match|revert-match?Invert the \apattern\a match sense.]" -"[m:label?All patterns must be of the form \alabel\a:\apattern\a. Match and" -" count output will be prefixed by the corresponding \alabel\a:.]" -"[O:lenient?Enable lenient \apattern\a interpretation. This is the default.]" -"[x:line-match|line-regexp?Force \apatterns\a to match complete lines.]" -"[n:number|line-number?Prefix each matched line with its line number.]" -"[N:name?Set the standard input file name prefix to" -" \aname\a.]:[name:=empty]" -"[q:quiet|silent?Do not print matching lines.]" -"[S:strict?Enable strict \apattern\a interpretation with diagnostics.]" -"[s:suppress|no-messages?Suppress error and warning messages.]" -"[t:total?Only print a single matching line count for all files.]" -"[T:test?Enable implementation specific tests.]:" -" [test]" -"[w:word-match|word-regexp?Force \apatterns\a to match complete words.]" -"[a?Ignored for GNU compatibility.]" -"\n" -"\n[ pattern ] [ file ... ]\n" -"\n" -"[+DIAGNOSTICS?Exit status 0 if matches were found, 1 if no matches were found," -" where \b-v\b invertes the exit status. Exit status 2 for other" -" errors that are accompanied by a message on the standard error.]" -"[+SEE ALSO?\bed\b(1), \bsed\b(1), \bperl\b(1), \bregex\b(3)]" -"[+CAVEATS?Some expressions of necessity require exponential space" -" and/or time.]" -"[+BUGS?Some expressions may use sub-optimal algorithms. For example," -" don't use this implementation to compute primes.]" -; - -#include <ast.h> -#include <ctype.h> -#include <ccode.h> -#include <error.h> -#include <regex.h> - -#ifndef EISDIR -#define EISDIR (-1) -#endif - -/* - * snarfed from Doug McElroy's C++ version - * - * this grep is based on the Posix re package. - * unfortunately it has to have a nonstandard interface. - * 1. fgrep does not have usual operators. REG_LITERAL - * caters for this. - * 2. grep allows null expressions, hence REG_NULL. - * 3. it may be possible to combine the multiple - * patterns of grep into single patterns. important - * special cases are handled by regcomb(). - * 4. anchoring by -x has to be done separately from - * compilation (remember that fgrep has no ^ or $ operator), - * hence REG_LEFT|REG_RIGHT. (An honest, but slow alternative: - * run regexec with REG_NOSUB off and nmatch=1 and check - * whether the match is full length) - */ - -typedef struct Item_s /* list item - sue me for waste */ -{ - struct Item_s* next; /* next in list */ - regex_t re; /* compiled re */ - Sfulong_t hits; /* labeled pattern matches */ - Sfulong_t total; /* total hits */ - char string[1]; /* string value */ -} Item_t; - -typedef struct List_s /* generic list */ -{ - Item_t* head; /* list head */ - Item_t* tail; /* list tail */ -} List_t; - -typedef struct State_s /* program state */ -{ - struct - { - char* base; /* sfsetbuf buffer */ - size_t size; /* sfsetbuf size */ - int noshare; /* turn off SF_SHARE */ - } buffer; - - List_t file; /* pattern file list */ - List_t pattern; /* pattern list */ - List_t re; /* re list */ - - regmatch_t posvec[1]; /* match position vector */ - regmatch_t* pos; /* match position pointer */ - int posnum; /* number of match positions */ - - int any; /* if any pattern hit */ - int list; /* list files with hits */ - int notfound; /* some input file not found */ - int options; /* regex options */ - - Sfulong_t hits; /* total matched pattern count */ - - unsigned char byline; /* multiple pattern line by line*/ - unsigned char count; /* count number of hits */ - unsigned char label; /* all patterns labeled */ - unsigned char match; /* match sense */ - unsigned char query; /* return status but no output */ - unsigned char number; /* line numbers */ - unsigned char prefix; /* print file prefix */ - unsigned char suppress; /* no unopenable file messages */ - unsigned char words; /* word matches only */ -} State_s; - -static void -addre(State_s *state, List_t* p, char* s) -{ - int c; - char* b; - Item_t* x; - Sfio_t* t; - - b = s; - if (state->label) - { - if (!(s = strchr(s, ':'))) - error(3, "%s: label:pattern expected", b); - c = s - b; - s++; - } - else - c = 0; - if (!(x = newof(0, Item_t, 1, c))) - error(ERROR_SYSTEM|3, "out of space (pattern `%s')", b); - if (c) - memcpy(x->string, b, c); - if (state->words) - { - if (!(t = sfstropen())) - error(ERROR_SYSTEM|3, "out of space (word pattern `%s')", s); - if (!(state->options & REG_AUGMENTED)) - sfputc(t, '\\'); - sfputc(t, '<'); - sfputr(t, s, -1); - if (!(state->options & REG_AUGMENTED)) - sfputc(t, '\\'); - sfputc(t, '>'); - if (!(s = sfstruse(t))) - error(ERROR_SYSTEM|3, "out of space"); - } - else - t = 0; - if (c = regcomp(&x->re, s, state->options|REG_MULTIPLE)) - regfatal(&x->re, 3, c); - if (t) - sfstrclose(t); - if (!p->head) - { - p->head = p->tail = x; - if (state->number || !regrecord(&x->re)) - state->byline = 1; - } - else if (state->label || regcomb(&p->tail->re, &x->re)) - { - p->tail = p->tail->next = x; - if (!state->byline && (state->number || !state->label || !regrecord(&x->re))) - state->byline = 1; - } - else - free(x); -} - -static void -addstring(State_s *state, List_t* p, char* s) -{ - Item_t* x; - - if (!(x = newof(0, Item_t, 1, strlen(s)))) - error(ERROR_SYSTEM|3, "out of space (string `%s')", s); - strcpy(x->string, s); - if (p->head) - p->tail->next = x; - else - p->head = x; - p->tail = x; -} - -static void -compile(State_s *state) -{ - int line; - size_t n; - char* s; - char* t; - char* file; - Item_t* x; - Sfio_t* f; - - for (x = state->pattern.head; x; x = x->next) - addre(state, &state->re, x->string); - for (x = state->file.head; x; x = x->next) - { - s = x->string; - if (!(f = sfopen(NiL, s, "r"))) - error(ERROR_SYSTEM|4, "%s: cannot open", s); - else - { - file = error_info.file; - error_info.file = s; - line = error_info.line; - error_info.line = 0; - while (s = (char*)sfreserve(f, SF_UNBOUND, SF_LOCKR)) - { - if (!(n = sfvalue(f))) - break; - if (s[n - 1] != '\n') - { - for (t = s + n; t > s && *--t != '\n'; t--); - if (t == s) - { - sfread(f, s, 0); - break; - } - n = t - s + 1; - } - s[n - 1] = 0; - addre(state, &state->re, s); - s[n - 1] = '\n'; - sfread(f, s, n); - } - while ((s = sfgetr(f, '\n', 1)) || (s = sfgetr(f, '\n', -1))) - { - error_info.line++; - addre(state, &state->re, s); - } - error_info.file = file; - error_info.line = line; - sfclose(f); - } - } - if (!state->re.head) - error(3, "no pattern"); -} - -static void -highlight(Sfio_t* sp, const char* s, int n, int so, int eo) -{ - static const char bold[] = {CC_esc,'[','1','m'}; - static const char normal[] = {CC_esc,'[','0','m'}; - - sfwrite(sp, s, so); - sfwrite(sp, bold, sizeof(bold)); - sfwrite(sp, s + so, eo - so); - sfwrite(sp, normal, sizeof(normal)); - sfwrite(sp, s + eo, n - eo); -} - -typedef struct -{ - State_s *state; - Item_t *item; -} record_handle; - -static int -record(void* handle, const char* s, size_t len) -{ - record_handle *r_x = (record_handle *)handle; - State_s *state = r_x->state; - Item_t *item = r_x->item; - - item->hits++; - if (state->query || state->list) - return -1; - if (!state->count) - { - if (state->prefix) - sfprintf(sfstdout, "%s:", error_info.file); - if (state->label) - sfprintf(sfstdout, "%s:", item->string); - if (state->pos) - highlight(sfstdout, s, len + 1, state->pos[0].rm_so, state->pos[0].rm_eo); - else - sfwrite(sfstdout, s, len + 1); - } - return 0; -} - -static void -execute(State_s *state, Sfio_t* input, char* name) -{ - register char* s; - char* file; - Item_t* x; - size_t len; - int result; - int line; - - Sfulong_t hits = 0; - - if (state->buffer.noshare) - sfset(input, SF_SHARE, 0); - if (state->buffer.size) - sfsetbuf(input, state->buffer.base, state->buffer.size); - if (!name) - name = "/dev/stdin"; - file = error_info.file; - error_info.file = name; - line = error_info.line; - error_info.line = 0; - if (state->byline) - { - for (;;) - { - error_info.line++; - if (s = sfgetr(input, '\n', 0)) - len = sfvalue(input) - 1; - else if (s = sfgetr(input, '\n', -1)) - { - len = sfvalue(input); - s[len] = '\n'; -#if _you_like_the_noise - error(1, "newline appended"); -#endif - } - else - { - if (sferror(input) && errno != EISDIR) - error(ERROR_SYSTEM|2, "read error"); - break; - } - x = state->re.head; - do - { - if (!(result = regnexec(&x->re, s, len, state->posnum, state->pos, 0))) - { - if (!state->label) - break; - x->hits++; - if (state->query || state->list) - goto done; - if (!state->count) - { - if (state->prefix) - sfprintf(sfstdout, "%s:", name); - if (state->number) - sfprintf(sfstdout, "%d:", error_info.line); - sfprintf(sfstdout, "%s:", x->string); - if (state->pos) - highlight(sfstdout, s, len + 1, state->pos[0].rm_so, state->pos[0].rm_eo); - else - sfwrite(sfstdout, s, len + 1); - } - } - else if (result != REG_NOMATCH) - regfatal(&x->re, 3, result); - } while (x = x->next); - if (!state->label && (x != 0) == state->match) - { - hits++; - if (state->query || state->list) - break; - if (!state->count) - { - if (state->prefix) - sfprintf(sfstdout, "%s:", name); - if (state->number) - sfprintf(sfstdout, "%d:", error_info.line); - if (state->pos) - highlight(sfstdout, s, len + 1, state->pos[0].rm_so, state->pos[0].rm_eo); - else - sfwrite(sfstdout, s, len + 1); - } - } - } - } - else - { - register char* e; - register char* t; - char* r; - - static char* span = 0; - static size_t spansize = 0; - - s = e = 0; - for (;;) - { - if (s < e) - { - t = span; - for (;;) - { - len = 2 * (e - s) + t - span + 1; - len = roundof(len, SF_BUFSIZE); - if (spansize < len) - { - spansize = len; - len = t - span; - if (!(span = newof(span, char, spansize, 0))) - error(ERROR_SYSTEM|3, "%s: line longer than %lu characters", name, len + e - s); - t = span + len; - } - len = e - s; - memcpy(t, s, len); - t += len; - if (!(s = sfreserve(input, SF_UNBOUND, 0)) || (len = sfvalue(input)) <= 0) - { - if ((sfvalue(input) || sferror(input)) && errno != EISDIR) - error(ERROR_SYSTEM|2, "%s: read error", name); - break; - } - else if (!(e = memchr(s, '\n', len))) - e = s + len; - else - { - r = s + len; - len = (e - s) + t - span; - len = roundof(len, SF_BUFSIZE); - if (spansize < len) - { - spansize = len; - len = t - span; - if (!(span = newof(span, char, spansize, 0))) - error(ERROR_SYSTEM|3, "%s: line longer than %lu characters", name, len + e - s); - t = span + len; - } - len = e - s; - memcpy(t, s, len); - t += len; - s += len + 1; - e = r; - break; - } - } - *t = '\n'; - x = state->re.head; - do - { - record_handle r_x = { state, x }; - if ((result = regrexec(&x->re, span, t - span, state->posnum, state->pos, state->options, '\n', (void*)&r_x, record)) < 0) - goto done; - if (result && result != REG_NOMATCH) - regfatal(&x->re, 3, result); - } while (x = x->next); - if (!s) - break; - } - else - { - if (!(s = sfreserve(input, SF_UNBOUND, 0))) - { - if ((sfvalue(input) || sferror(input)) && errno != EISDIR) - error(ERROR_SYSTEM|2, "%s: read error", name); - break; - } - if ((len = sfvalue(input)) <= 0) - break; - e = s + len; - } - t = e; - while (t > s) - if (*--t == '\n') - { - x = state->re.head; - do - { - record_handle r_x = { state, x }; - if ((result = regrexec(&x->re, s, t - s, state->posnum, state->pos, state->options, '\n', (void*)&r_x, record)) < 0) - goto done; - if (result && result != REG_NOMATCH) - regfatal(&x->re, 3, result); - } while (x = x->next); - s = t + 1; - break; - } - } - } - done: - error_info.file = file; - error_info.line = line; - if (state->byline && !state->label) - { - if (hits && state->list >= 0) - state->any = 1; - if (!state->query) - { - if (!state->list) - { - if (state->count) - { - if (state->count & 2) - state->hits += hits; - else - { - if (state->prefix) - sfprintf(sfstdout, "%s:", name); - sfprintf(sfstdout, "%I*u\n", sizeof(hits), hits); - } - } - } - else if ((hits != 0) == (state->list > 0)) - { - if (state->list < 0) - state->any = 1; - sfprintf(sfstdout, "%s\n", name); - } - } - } - else - { - x = state->re.head; - do - { - if (x->hits && state->list >= 0) - { - state->any = 1; - if (state->query) - break; - } - if (!state->query) - { - if (!state->list) - { - if (state->count) - { - if (state->count & 2) - { - x->total += x->hits; - state->hits += x->hits; - } - else - { - if (state->prefix) - sfprintf(sfstdout, "%s:", name); - if (state->label) - sfprintf(sfstdout, "%s:", x->string); - sfprintf(sfstdout, "%I*u\n", sizeof(x->hits), x->hits); - } - } - } - else if ((x->hits != 0) == (state->list > 0)) - { - if (state->list < 0) - state->any = 1; - if (state->label) - sfprintf(sfstdout, "%s:%s\n", name, x->string); - else - sfprintf(sfstdout, "%s\n", name); - } - } - x->hits = 0; - } while (x = x->next); - } -} - - -static -int grep_main(int argc, char** argv, void *context) -{ - int c; - char* s; - char* h; - Sfio_t* f; - State_s state; - memset(&state, 0, sizeof(state)); - - NoP(argc); - state.match = 1; - state.options = REG_FIRST|REG_NOSUB|REG_NULL; - h = 0; - if (strcmp(astconf("CONFORMANCE", NiL, NiL), "standard")) - state.options |= REG_LENIENT; - if (s = strrchr(argv[0], '/')) - s++; - else - s = argv[0]; - switch (*s) - { - case 'e': - case 'E': - s = "egrep"; - state.options |= REG_EXTENDED; - break; - case 'f': - case 'F': - s = "fgrep"; - state.options |= REG_LITERAL; - break; - case 'p': - case 'P': - s = "pgrep"; - state.options |= REG_EXTENDED|REG_LENIENT; - break; - case 'x': - case 'X': - s = "xgrep"; - state.options |= REG_AUGMENTED; - break; - default: - s = "grep"; - break; - } - error_info.id = s; - while (c = optget(argv, usage)) - switch (c) - { - case 'E': - state.options |= REG_EXTENDED; - break; - case 'F': - state.options |= REG_LITERAL; - break; - case 'G': - state.options &= ~(REG_AUGMENTED|REG_EXTENDED); - break; - case 'H': - state.prefix = opt_info.num; - break; - case 'L': - state.list = -opt_info.num; - break; - case 'N': - h = opt_info.arg; - break; - case 'O': - state.options |= REG_LENIENT; - break; - case 'P': - state.options |= REG_EXTENDED|REG_LENIENT; - break; - case 'S': - state.options &= ~REG_LENIENT; - break; - case 'T': - s = opt_info.arg; - switch (*s) - { - case 'b': - case 'm': - c = *s++; - state.buffer.size = strton(s, &s, NiL, 1); - if (c == 'b' && !(state.buffer.base = newof(0, char, state.buffer.size, 0))) - error(ERROR_SYSTEM|3, "out of space [test buffer]"); - if (*s) - error(3, "%s: invalid characters after test", s); - break; - case 'f': - state.options |= REG_FIRST; - break; - case 'l': - state.options |= REG_LEFT; - break; - case 'n': - state.buffer.noshare = 1; - break; - case 'r': - state.options |= REG_RIGHT; - break; - default: - error(3, "%s: unknown test", s); - break; - } - break; - case 'X': - state.options |= REG_AUGMENTED; - break; - case 'a': - break; - case 'b': - state.options &= ~(REG_FIRST|REG_NOSUB); - break; - case 'c': - state.count |= 1; - break; - case 'e': - addstring(&state, &state.pattern, opt_info.arg); - break; - case 'f': - addstring(&state, &state.file, opt_info.arg); - break; - case 'h': - state.prefix = 2; - break; - case 'i': - state.options |= REG_ICASE; - break; - case 'l': - state.list = opt_info.num; - break; - case 'm': - state.label = 1; - break; - case 'n': - state.number = 1; - break; - case 'q': - state.query = 1; - break; - case 's': - state.suppress = opt_info.num; - break; - case 't': - state.count |= 2; - break; - case 'v': - if (state.match = !opt_info.num) - state.options &= ~REG_INVERT; - else - state.options |= REG_INVERT; - break; - case 'w': - state.words = 1; - break; - case 'x': - state.options |= REG_LEFT|REG_RIGHT; - break; - case '?': - error(ERROR_USAGE|4, "%s", opt_info.arg); - break; - case ':': - error(2, "%s", opt_info.arg); - break; - default: - error(3, "%s: not implemented", opt_info.name); - break; - } - argv += opt_info.index; - if ((state.options & REG_LITERAL) && (state.options & (REG_AUGMENTED|REG_EXTENDED))) - error(3, "-F and -A or -P or -X are incompatible"); - if ((state.options & REG_LITERAL) && state.words) - error(ERROR_SYSTEM|3, "-F and -w are incompatible"); - if (!state.file.head && !state.pattern.head) - { - if (!argv[0]) - error(3, "no pattern"); - addstring(&state, &state.pattern, *argv++); - } - if (!(state.options & (REG_FIRST|REG_NOSUB))) - { - if (state.count || state.list || state.query || (state.options & REG_INVERT)) - state.options |= REG_FIRST|REG_NOSUB; - else - { - state.pos = state.posvec; - state.posnum = elementsof(state.posvec); - } - } - compile(&state); - if (!argv[0]) - { - state.prefix = h ? 1 : 0; - execute(&state, sfstdin, h); - } - else - { - if (state.prefix > 1) - state.prefix = 0; - else if (argv[1]) - state.prefix = 1; - while (s = *argv++) - { - if (f = sfopen(NiL, s, "r")) - { - execute(&state, f, s); - sfclose(f); - if (state.query && state.any) - break; - } - else - { - state.notfound = 1; - if (!state.suppress) - error(ERROR_SYSTEM|2, "%s: cannot open", s); - } - } - } - if ((state.count & 2) && !state.query && !state.list) - { - if (state.label) - { - Item_t* x; - - x = state.re.head; - do - { - sfprintf(sfstdout, "%s:%I*u\n", x->string, sizeof(x->total), x->total); - } while (x = x->next); - } - else - sfprintf(sfstdout, "%I*u\n", sizeof(state.hits), state.hits); - } - return (state.notfound && !state.query) ? 2 : !state.any; -} - - -int b_egrep(int argc, char** argv, void *context) -{ - return grep_main(argc, argv, context); -} - -int b_grep(int argc, char** argv, void *context) -{ - return grep_main(argc, argv, context); -} - -int b_fgrep(int argc, char** argv, void *context) -{ - return grep_main(argc, argv, context); -} - -int b_pgrep(int argc, char** argv, void *context) -{ - return grep_main(argc, argv, context); -} - -int b_xgrep(int argc, char** argv, void *context) -{ - return grep_main(argc, argv, context); -} diff --git a/usr/src/lib/libcmd/common/head.c b/usr/src/lib/libcmd/common/head.c deleted file mode 100644 index 80ce196b7e..0000000000 --- a/usr/src/lib/libcmd/common/head.c +++ /dev/null @@ -1,150 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * AT&T Bell Laboratories - * - * output the beginning portion of one or more files - */ - -static const char usage[] = -"[-n?\n@(#)$Id: head (AT&T Research) 2006-09-27 $\n]" -USAGE_LICENSE -"[+NAME?head - output beginning portion of one or more files ]" -"[+DESCRIPTION?\bhead\b copies one or more input files to standard " - "output stopping at a designated point for each file or to the end of " - "the file whichever comes first. Copying ends at the point indicated by " - "the options. By default a header of the form \b==> \b\afilename\a\b " - "<==\b is output before all but the first file but this can be changed " - "with the \b-q\b and \b-v\b options.]" -"[+?If no \afile\a is given, or if the \afile\a is \b-\b, \bhead\b " - "copies from standard input starting at the current location.]" -"[+?The option argument for \b-c\b, and \b-s\b can optionally be " - "followed by one of the following characters to specify a different unit " - "other than a single byte:]" - "{" - "[+b?512 bytes.]" - "[+k?1-killobyte.]" - "[+m?1-megabyte.]" - "}" -"[+?For backwards compatibility, \b-\b\anumber\a is equivalent to \b-n\b " - "\anumber\a.]" -"[n:lines?Copy \alines\a lines from each file.]#[lines:=10]" -"[c:bytes?Copy \achars\a bytes from each file.]#[chars]" -"[q:quiet|silent?Never ouput filename headers.]" -"[s:skip?Skip \askip\a characters or lines from each file before " - "copying.]#[skip]" -"[v:verbose?Always ouput filename headers.]" - "\n\n" -"[ file ... ]" - "\n\n" -"[+EXIT STATUS?]" - "{" - "[+0?All files copied successfully.]" - "[+>0?One or more files did not copy.]" - "}" -"[+SEE ALSO?\bcat\b(1), \btail\b(1)]" -; - -#include <cmd.h> - -int -b_head(int argc, register char** argv, void* context) -{ - static const char header_fmt[] = "\n==> %s <==\n"; - - register Sfio_t* fp; - register char* cp; - register off_t keep = 10; - register off_t skip = 0; - register int delim = '\n'; - int header = 1; - char* format = (char*)header_fmt+1; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - for (;;) - { - switch (optget(argv, usage)) - { - case 'c': - delim = -1; - /*FALLTHROUGH*/ - case 'n': - if (opt_info.offset && argv[opt_info.index][opt_info.offset] == 'c') - { - delim = -1; - opt_info.offset++; - } - if ((keep = opt_info.number) <=0) - error(2, "%s: %I*d: positive numeric option argument expected", opt_info.name, sizeof(keep), keep); - continue; - case 'q': - header = argc; - continue; - case 'v': - header = 0; - continue; - case 's': - skip = opt_info.number; - continue; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - continue; - case ':': - error(2, "%s", opt_info.arg); - continue; - } - break; - } - argv += opt_info.index; - argc -= opt_info.index; - if (error_info.errors) - error(ERROR_usage(2), "%s", optusage(NiL)); - if (cp = *argv) - argv++; - do - { - if (!cp || streq(cp, "-")) - { - cp = "/dev/stdin"; - fp = sfstdin; - sfset(fp, SF_SHARE, 1); - } - else if (!(fp = sfopen(NiL, cp, "r"))) - { - error(ERROR_system(0), "%s: cannot open", cp); - continue; - } - if (argc > header) - sfprintf(sfstdout, format, cp); - format = (char*)header_fmt; - if (skip > 0) - sfmove(fp, NiL, skip, delim); - if (sfmove(fp, sfstdout, keep, delim) < 0 && errno != EPIPE) - error(ERROR_system(0), "%s: read error", cp); - if (fp != sfstdin) - sfclose(fp); - } while (cp = *argv++); - if (sfsync(sfstdout)) - error(ERROR_system(0), "write error"); - return error_info.errors != 0; -} diff --git a/usr/src/lib/libcmd/common/id.c b/usr/src/lib/libcmd/common/id.c deleted file mode 100644 index 1465d76b7b..0000000000 --- a/usr/src/lib/libcmd/common/id.c +++ /dev/null @@ -1,468 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * Glenn Fowler - * AT&T Research - * - * id - */ - -static const char usage[] = -"[-?\n@(#)$Id: id (AT&T Research) 2004-06-11 $\n]" -USAGE_LICENSE -"[+NAME?id - return user identity]" -"[+DESCRIPTION?If no \auser\a operand is specified \bid\b writes user and " - "group IDs and the corresponding user and group names of the " - "invoking process to standard output. If the effective and " - "real IDs do not match, both are written. Any supplementary " - "groups the current process belongs to will also be written.]" -"[+?If a \auser\a operand is specified and the process has permission, " - "the user and group IDs and any supplementary group IDs of the " - "selected user will be written to standard output.]" -"[+?If any options are specified, then only a portion of the information " - "is written.]" -"[n:name?Write the name instead of the numeric ID.]" -"[r:real?Writes real ID instead of the effective ID.]" -"[[a?This option is ignored.]" -"[g:group?Writes only the group ID.]" -"[u:user?Writes only the user ID.]" -"[G:groups?Writes only the supplementary group IDs.]" -"[s:fair-share?Writes fair share scheduler IDs and groups on systems that " - "support fair share scheduling.]" -"\n" -"\n[user]\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?Successful completion.]" - "[+>0?An error occurred.]" -"}" -"[+SEE ALSO?\blogname\b(1), \bwho\b(1), \bgetgroups\b(2)]" -; - -#include <cmd.h> - -#include "FEATURE/ids" - -#include <grp.h> -#include <pwd.h> - -#if _lib_fsid -#if _lib_getfsgid && ( _sys_fss || _hdr_fsg ) -#define fss_grp fs_grp -#define fss_id fs_id -#define fss_mem fs_mem -#define fss_passwd fs_passwd -#define fss_shares fs_shares -#if _sys_fss -#include <sys/fss.h> -#endif -#if _hdr_fsg -#include <fsg.h> -#endif -#if !_lib_isfsg && !defined(isfsg) -#define isfsg(p) (!(p)->fs_id&&!(p)->fs_shares&&(!(p)->fs_passwd||!*(p)->fs_passwd)) -#endif -#else -#undef _lib_fsid -#endif -#endif - -#define power2(n) (!((n)&((n)-1))) - -#define GG_FLAG (1<<0) -#define G_FLAG (1<<1) -#define N_FLAG (1<<2) -#define R_FLAG (1<<3) -#define U_FLAG (1<<4) -#define S_FLAG (1<<5) -#define O_FLAG (1<<6) -#define X_FLAG (1<<7) - -#if _lib_fsid -static void -getfsids(Sfio_t* sp, const char* name, int flags, register int lastchar) -{ - register struct fsg* fs; - register char* s; - register char** p; - char** x; - - if (lastchar) - { - if (flags & O_FLAG) flags = 1; - else flags = 0; - } - else if (flags & N_FLAG) flags = 1; - else flags = -1; - setfsgent(); - while (fs = getfsgnam(name)) - if (!isfsg(fs)) - { - if (p = fs->fs_mem) - { - if (flags > 0) x = 0; - else - { - register char** q; - register char* t; - register int n; - - n = 0; - q = p; - while (s = *q++) - n += strlen(s) + 1; - if (!(x = newof(0, char*, q - p, n))) - break; - s = (char*)(x + (q - p)); - q = x; - while (t = *p++) - { - *q++ = s; - while (*s++ = *t++); - } - *q = 0; - p = x; - } - while (s = *p++) - { - if (lastchar == '=') - { - lastchar = ','; - sfputr(sp, " fsid=", -1); - } - else if (!lastchar) lastchar = ' '; - else sfputc(sp, lastchar); - if (flags > 0) sfprintf(sp, "%s", s); - else - { - setfsgent(); - while (fs = getfsgnam(s)) - if (isfsg(fs)) - { - if (flags < 0) sfprintf(sp, "%u", fs->fs_id); - else sfprintf(sp, "%u(%s)", fs->fs_id, s); - break; - } - } - } - if (x) free(x); - } - break; - } - endfsgent(); - if (lastchar == ' ') sfputc(sp, '\n'); -} -#endif - -static void -putid(Sfio_t* sp, int flags, const char* label, const char* name, long number) -{ - sfprintf(sp, "%s=", label); - if (flags & O_FLAG) - { - if (name) sfputr(sp, name, -1); - else sfprintf(sp, "%lu", number); - } - else - { - sfprintf(sp, "%u", number); - if (name) sfprintf(sp, "(%s)", name); - } -} - -static int -getids(Sfio_t* sp, const char* name, register int flags) -{ - register struct passwd* pw; - register struct group* grp; - register int i; - register int j; - register int k; -#if _lib_fsid - register struct fsg* fs; - const char* fs_name; - int fs_id; -#endif - char** p; - char* s; - int lastchar; - int ngroups = 0; - const char* gname; - uid_t user; - uid_t euid; - gid_t group; - gid_t egid; - - static gid_t* groups; - - if (flags & GG_FLAG) - { - static int maxgroups; - - /* - * get supplemental groups if required - */ - - if (!maxgroups) - { - /* - * first time - */ - - if ((maxgroups = getgroups(0, groups)) <= 0) - maxgroups = NGROUPS_MAX; - if (!(groups = newof(0, gid_t, maxgroups + 1, 0))) - error(ERROR_exit(1), "out of space [group array]"); - } - ngroups = getgroups(maxgroups, groups); - for (i = j = 0; i < ngroups; i++) - { - for (k = 0; k < j && groups[k] != groups[i]; k++); - if (k >= j) groups[j++] = groups[i]; - } - ngroups = j; - } - if (name) - { - flags |= X_FLAG; - if (!(flags & N_FLAG) || (flags & (G_FLAG|GG_FLAG))) - { - if (!(pw = getpwnam(name))) - { - user = strtol(name, &s, 0); - if (*s || !(pw = getpwuid(user))) - error(ERROR_exit(1), "%s: name not found", name); - name = pw->pw_name; - } - user = pw->pw_uid; - group = pw->pw_gid; - } -#if _lib_fsid - if (!(flags & N_FLAG) || (flags & S_FLAG)) - { - setfsgent(); - do - { - if (!(fs = getfsgnam(name))) - error(ERROR_exit(1), "%u: fss name not found", name); - } while (isfsg(fs)); - fs_id = fs->fs_id; - } -#endif - } - else - { - if (flags & G_FLAG) - group = (flags & R_FLAG) ? getgid() : getegid(); - if (flags & (GG_FLAG|N_FLAG|U_FLAG)) - user = (flags & R_FLAG) ? getuid() : geteuid(); -#if _lib_fsid - if (flags & S_FLAG) - fs_id = fsid(0); -#endif - if (flags & N_FLAG) - name = (pw = getpwuid(user)) ? pw->pw_name : (char*)0; - } - if (ngroups == 1 && groups[0] == group) - ngroups = 0; - if ((flags & N_FLAG) && (flags & G_FLAG)) - gname = (grp = getgrgid(group)) ? grp->gr_name : (char*)0; -#if _lib_fsid - if ((flags & N_FLAG) && (flags & S_FLAG)) - { - setfsgent(); - fs_name = (fs = getfsgid(fs_id)) ? fs->fs_grp : (char*)0; - } -#endif - if ((flags & (U_FLAG|G_FLAG|S_FLAG)) == (U_FLAG|G_FLAG|S_FLAG)) - { - putid(sp, flags, "uid", name, user); - putid(sp, flags, " gid", gname, group); - if ((flags & X_FLAG) && name) - { -#if _lib_getgrent -#if _lib_setgrent - setgrent(); -#endif - lastchar = '='; - while (grp = getgrent()) - if (p = grp->gr_mem) - while (s = *p++) - if (streq(s, name)) - { - if (lastchar == '=') - sfputr(sp, " groups", -1); - sfputc(sp, lastchar); - lastchar = ','; - if (flags & O_FLAG) - sfprintf(sp, "%s", grp->gr_name); - else sfprintf(sp, "%u(%s)", grp->gr_gid, grp->gr_name); - } -#if _lib_endgrent - endgrent(); -#endif -#endif -#if _lib_fsid - getfsids(sp, name, flags, '='); -#endif - } - else - { - if ((euid = geteuid()) != user) - putid(sp, flags, " euid", (pw = getpwuid(euid)) ? pw->pw_name : (char*)0, euid); - if ((egid = getegid()) != group) - putid(sp, flags, " egid", (grp = getgrgid(egid)) ? grp->gr_name : (char*)0, egid); - if (ngroups > 0) - { - sfputr(sp, " groups", -1); - lastchar = '='; - for (i = 0; i < ngroups; i++) - { - group = groups[i]; - sfputc(sp, lastchar); - if (grp = getgrgid(group)) - { - if (flags & O_FLAG) sfprintf(sp, "%s", grp->gr_name); - else sfprintf(sp, "%u(%s)", group, grp->gr_name); - } - else sfprintf(sp, "%u", group); - lastchar = ','; - } - } -#if _lib_fsid - putid(sp, flags, " fsid", fs_name, fs_id); -#endif - } - sfputc(sp,'\n'); - return(0); - } - if (flags & U_FLAG) - { - if ((flags & N_FLAG) && name) sfputr(sp, name, '\n'); - else sfprintf(sp, "%u\n", user); - } - else if (flags & G_FLAG) - { - if ((flags & N_FLAG) && gname) sfputr(sp, gname, '\n'); - else sfprintf(sp, "%u\n", group); - } - else if (flags & GG_FLAG) - { - if ((flags & X_FLAG) && name) - { -#if _lib_getgrent -#if _lib_setgrent - setgrent(); -#endif - i = 0; - while (grp = getgrent()) - if (p = grp->gr_mem) - while (s = *p++) - if (streq(s, name)) - { - if (i++) sfputc(sp, ' '); - if (flags & N_FLAG) sfprintf(sp, "%s", grp->gr_name); - else sfprintf(sp, "%u", grp->gr_gid); - } -#if _lib_endgrent - endgrent(); -#endif - if (i) sfputc(sp, '\n'); -#endif - } - else if (ngroups > 0) - { - for (i = 0;;) - { - group = groups[i]; - if ((flags & N_FLAG) && (grp = getgrgid(group))) - sfprintf(sp, "%s", grp->gr_name); - else sfprintf(sp, "%u", group); - if (++i >= ngroups) break; - sfputc(sp, ' '); - } - sfputc(sp, '\n'); - } - } -#if _lib_fsid - else if (flags & S_FLAG) - { - if ((flags & X_FLAG) && name) getfsids(sp, name, flags, 0); - else if ((flags & N_FLAG) && fs_name) sfputr(sp, fs_name, '\n'); - else sfprintf(sp, "%u\n", fs_id); - } -#endif - return(0); -} - -int -b_id(int argc, char *argv[], void* context) -{ - register int flags = 0; - register int n; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - while (n = optget(argv, usage)) switch (n) - { - case 'a': - break; - case 'G': - flags |= GG_FLAG; - break; - case 'g': - flags |= G_FLAG; - break; - case 'n': - flags |= N_FLAG; - break; - case 'r': - flags |= R_FLAG; - break; - case 's': - flags |= S_FLAG; - break; - case 'u': - flags |= U_FLAG; - break; - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - argv += opt_info.index; - argc -= opt_info.index; - n = (flags & (GG_FLAG|G_FLAG|S_FLAG|U_FLAG)); - if (!power2(n)) - error(2, "incompatible options selected"); - if (error_info.errors || argc > 1) - error(ERROR_usage(2), "%s", optusage(NiL)); - if (!(flags & ~(N_FLAG|R_FLAG))) - { - if (flags & N_FLAG) flags |= O_FLAG; - flags |= (U_FLAG|G_FLAG|N_FLAG|R_FLAG|S_FLAG|GG_FLAG); - } - error_info.errors = getids(sfstdout, *argv, flags); - return(error_info.errors); -} diff --git a/usr/src/lib/libcmd/common/join.c b/usr/src/lib/libcmd/common/join.c deleted file mode 100644 index 4ef3c40860..0000000000 --- a/usr/src/lib/libcmd/common/join.c +++ /dev/null @@ -1,996 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * Glenn Fowler - * AT&T Research - * - * join - */ - -static const char usage[] = -"[-?\n@(#)$Id: join (AT&T Research) 2009-12-10 $\n]" -USAGE_LICENSE -"[+NAME?join - relational database operator]" -"[+DESCRIPTION?\bjoin\b performs an \aequality join\a on the files \afile1\a " - "and \afile2\a and writes the resulting joined files to standard " - "output. By default, a field is delimited by one or more spaces " - "and tabs with leading spaces and/or tabs ignored. The \b-t\b option " - "can be used to change the field delimiter.]" -"[+?The \ajoin field\a is a field in each file on which files are compared. " - "By default \bjoin\b writes one line in the output for each pair " - "of lines in \afiles1\a and \afiles2\a that have identical join " - "fields. The default output line consists of the join field, " - "then the remaining fields from \afile1\a, then the remaining " - "fields from \afile2\a, but this can be changed with the \b-o\b " - "option. The \b-a\b option can be used to add unmatched lines " - "to the output. The \b-v\b option can be used to output only " - "unmatched lines.]" -"[+?The files \afile1\a and \afile2\a must be ordered in the collating " - "sequence of \bsort -b\b on the fields on which they are to be " - "joined otherwise the results are unspecified.]" -"[+?If either \afile1\a or \afile2\a is \b-\b, \bjoin\b " - "uses standard input starting at the current location.]" - -"[e:empty]:[string?Replace empty output fields in the list selected with" -" \b-o\b with \astring\a.]" -"[o:output]:[list?Construct the output line to comprise the fields specified " - "in a blank or comma separated list \alist\a. Each element in " - "\alist\a consists of a file number (either 1 or 2), a period, " - "and a field number or \b0\b representing the join field. " - "As an obsolete feature multiple occurrences of \b-o\b can " - "be specified.]" -"[t:separator|tabs]:[delim?Use \adelim\a as the field separator for both input" -" and output.]" -"[1:j1]#[field?Join on field \afield\a of \afile1\a. Fields start at 1.]" -"[2:j2]#[field?Join on field \afield\a of \afile2\a. Fields start at 1.]" -"[j:join]#[field?Equivalent to \b-1\b \afield\a \b-2\b \afield\a.]" -"[a:unpairable]#[fileno?Write a line for each unpairable line in file" -" \afileno\a, where \afileno\a is either 1 or 2, in addition to the" -" normal output. If \b-a\b options appear for both 1 and 2, then " - "all unpairable lines will be output.]" -"[v:suppress]#[fileno?Write a line for each unpairable line in file" -" \afileno\a, where \afileno\a is either 1 or 2, instead of the normal " - "output. If \b-v\b options appear for both 1 and 2, then " - "all unpairable lines will be output.] ]" -"[i:ignorecase?Ignore case in field comparisons.]" -"[B!:mmap?Enable memory mapped reads instead of buffered.]" - -"[+?The following obsolete option forms are also recognized: \b-j\b \afield\a" -" is equivalent to \b-1\b \afield\a \b-2\b \afield\a, \b-j1\b \afield\a" -" is equivalent to \b-1\b \afield\a, and \b-j2\b \afield\a is" -" equivalent to \b-2\b \afield\a.]" - -"\n" -"\nfile1 file2\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?Both files processed successfully.]" - "[+>0?An error occurred.]" -"}" -"[+SEE ALSO?\bcut\b(1), \bcomm\b(1), \bpaste\b(1), \bsort\b(1), \buniq\b(1)]" -; - -#include <cmd.h> -#include <sfdisc.h> - -#if _hdr_wchar && _hdr_wctype && _lib_iswctype - -#include <wchar.h> -#include <wctype.h> - -#else - -#include <ctype.h> - -#ifndef iswspace -#define iswspace(x) isspace(x) -#endif - -#endif - -#define C_FILE1 001 -#define C_FILE2 002 -#define C_COMMON 004 -#define C_ALL (C_FILE1|C_FILE2|C_COMMON) - -#define NFIELD 10 -#define JOINFIELD 2 - -#define S_DELIM 1 -#define S_SPACE 2 -#define S_NL 3 -#define S_WIDE 4 - -typedef struct Field_s -{ - char* beg; - char* end; -} Field_t; - -typedef struct File_s -{ - Sfio_t* iop; - char* name; - char* recptr; - int reclen; - int field; - int fieldlen; - int nfields; - int maxfields; - int spaces; - int hit; - int discard; - Field_t* fields; -} File_t; - -typedef struct Join_s -{ - unsigned char state[1<<CHAR_BIT]; - Sfio_t* outfile; - int* outlist; - int outmode; - int ooutmode; - char* nullfield; - char* delimstr; - int delim; - int delimlen; - int buffered; - int ignorecase; - int mb; - char* same; - int samesize; - void* context; - File_t file[2]; -} Join_t; - -static void -done(register Join_t* jp) -{ - if (jp->file[0].iop && jp->file[0].iop != sfstdin) - sfclose(jp->file[0].iop); - if (jp->file[1].iop && jp->file[1].iop != sfstdin) - sfclose(jp->file[1].iop); - if (jp->outlist) - free(jp->outlist); - if (jp->file[0].fields) - free(jp->file[0].fields); - if (jp->file[1].fields) - free(jp->file[1].fields); - if (jp->same) - free(jp->same); - free(jp); -} - -static Join_t* -init(void) -{ - register Join_t* jp; - register int i; - - setlocale(LC_ALL, ""); - if (jp = newof(0, Join_t, 1, 0)) - { - if (jp->mb = mbwide()) - for (i = 0x80; i <= 0xff; i++) - jp->state[i] = S_WIDE; - jp->state[' '] = jp->state['\t'] = S_SPACE; - jp->state['\n'] = S_NL; - jp->delim = -1; - jp->nullfield = 0; - if (!(jp->file[0].fields = newof(0, Field_t, NFIELD + 1, 0)) || - !(jp->file[1].fields = newof(0, Field_t, NFIELD + 1, 0))) - { - done(jp); - return 0; - } - jp->file[0].maxfields = NFIELD; - jp->file[1].maxfields = NFIELD; - jp->outmode = C_COMMON; - } - return jp; -} - -static int -getolist(Join_t* jp, const char* first, char** arglist) -{ - register const char* cp = first; - char** argv = arglist; - register int c; - int* outptr; - int* outmax; - int nfield = NFIELD; - char* str; - - outptr = jp->outlist = newof(0, int, NFIELD + 1, 0); - outmax = outptr + NFIELD; - while (c = *cp++) - { - if (c==' ' || c=='\t' || c==',') - continue; - str = (char*)--cp; - if (*cp=='0' && ((c=cp[1])==0 || c==' ' || c=='\t' || c==',')) - { - str++; - c = JOINFIELD; - goto skip; - } - if (cp[1]!='.' || (*cp!='1' && *cp!='2') || (c=strtol(cp+2,&str,10)) <=0) - { - error(2,"%s: invalid field list",first); - break; - } - c--; - c <<=2; - if (*cp=='2') - c |=1; - skip: - if (outptr >= outmax) - { - jp->outlist = newof(jp->outlist, int, 2 * nfield + 1, 0); - outptr = jp->outlist + nfield; - nfield *= 2; - outmax = jp->outlist + nfield; - } - *outptr++ = c; - cp = str; - } - /* need to accept obsolescent command syntax */ - while (1) - { - if (!(cp= *argv) || cp[1]!='.' || (*cp!='1' && *cp!='2')) - { - if (*cp=='0' && cp[1]==0) - { - c = JOINFIELD; - goto skip2; - } - break; - } - str = (char*)cp; - c = strtol(cp+2, &str,10); - if (*str || --c<0) - break; - argv++; - c <<= 2; - if (*cp=='2') - c |=1; - skip2: - if (outptr >= outmax) - { - jp->outlist = newof(jp->outlist, int, 2 * nfield + 1, 0); - outptr = jp->outlist + nfield; - nfield *= 2; - outmax = jp->outlist + nfield; - } - *outptr++ = c; - } - *outptr = -1; - return argv-arglist; -} - -/* - * read in a record from file <index> and split into fields - */ -static unsigned char* -getrec(Join_t* jp, int index, int discard) -{ - register unsigned char* sp = jp->state; - register File_t* fp = &jp->file[index]; - register Field_t* field = fp->fields; - register Field_t* fieldmax = field + fp->maxfields; - register char* cp; - register int n; - char* tp; - - if (sh_checksig(jp->context)) - return 0; - if (discard && fp->discard) - sfraise(fp->iop, SFSK_DISCARD, NiL); - fp->spaces = 0; - fp->hit = 0; - if (!(cp = sfgetr(fp->iop, '\n', 0))) - { - jp->outmode &= ~(1<<index); - return 0; - } - fp->recptr = cp; - fp->reclen = sfvalue(fp->iop); - if (jp->delim == '\n') /* handle new-line delimiter specially */ - { - field->beg = cp; - cp += fp->reclen; - field->end = cp - 1; - field++; - } - else - do /* separate into fields */ - { - if (field >= fieldmax) - { - n = 2 * fp->maxfields; - fp->fields = newof(fp->fields, Field_t, n + 1, 0); - field = fp->fields + fp->maxfields; - fp->maxfields = n; - fieldmax = fp->fields + n; - } - field->beg = cp; - if (jp->delim == -1) - { - switch (sp[*(unsigned char*)cp]) - { - case S_SPACE: - cp++; - break; - case S_WIDE: - tp = cp; - if (iswspace(mbchar(tp))) - { - cp = tp; - break; - } - /*FALLTHROUGH*/ - default: - goto next; - } - fp->spaces = 1; - if (jp->mb) - for (;;) - { - switch (sp[*(unsigned char*)cp++]) - { - case S_SPACE: - continue; - case S_WIDE: - tp = cp - 1; - if (iswspace(mbchar(tp))) - { - cp = tp; - continue; - } - break; - } - break; - } - else - while (sp[*(unsigned char*)cp++]==S_SPACE); - cp--; - } - next: - if (jp->mb) - { - for (;;) - { - tp = cp; - switch (n = sp[*(unsigned char*)cp++]) - { - case 0: - continue; - case S_WIDE: - cp--; - n = mbchar(cp); - if (n == jp->delim) - { - n = S_DELIM; - break; - } - if (jp->delim == -1 && iswspace(n)) - { - n = S_SPACE; - break; - } - continue; - } - break; - } - field->end = tp; - } - else - { - while (!(n = sp[*(unsigned char*)cp++])); - field->end = cp - 1; - } - field++; - } while (n != S_NL); - fp->nfields = field - fp->fields; - if ((n = fp->field) < fp->nfields) - { - cp = fp->fields[n].beg; - /* eliminate leading spaces */ - if (fp->spaces) - { - if (jp->mb) - for (;;) - { - switch (sp[*(unsigned char*)cp++]) - { - case S_SPACE: - continue; - case S_WIDE: - tp = cp - 1; - if (iswspace(mbchar(tp))) - { - cp = tp; - continue; - } - break; - } - break; - } - else - while (sp[*(unsigned char*)cp++]==S_SPACE); - cp--; - } - fp->fieldlen = fp->fields[n].end - cp; - return (unsigned char*)cp; - } - fp->fieldlen = 0; - return (unsigned char*)""; -} - -static unsigned char* -_trace_getrec(Join_t* jp, int index, int discard) -{ - unsigned char* r; - - r = getrec(jp, index, discard); - return r; -} -#define getrec _trace_getrec - -#if DEBUG_TRACE -static unsigned char* u1,u2,u3; -#define getrec(p,n,d) (u1 = getrec(p, n, d), sfprintf(sfstdout, "[G%d#%d@%I*d:%-.8s]", __LINE__, n, sizeof(Sfoff_t), sftell(p->file[n].iop), u1), u1) -#endif - -/* - * print field <n> from file <index> - */ -static int -outfield(Join_t* jp, int index, register int n, int last) -{ - register File_t* fp = &jp->file[index]; - register char* cp; - register char* cpmax; - register int size; - register Sfio_t* iop = jp->outfile; - char* tp; - - if (n < fp->nfields) - { - cp = fp->fields[n].beg; - cpmax = fp->fields[n].end + 1; - } - else - cp = 0; - if ((n = jp->delim) == -1) - { - if (cp && fp->spaces) - { - register unsigned char* sp = jp->state; - - /*eliminate leading spaces */ - if (jp->mb) - for (;;) - { - switch (sp[*(unsigned char*)cp++]) - { - case S_SPACE: - continue; - case S_WIDE: - tp = cp - 1; - if (iswspace(mbchar(tp))) - { - cp = tp; - continue; - } - break; - } - break; - } - else - while (sp[*(unsigned char*)cp++]==S_SPACE); - cp--; - } - n = ' '; - } - else if (jp->delimstr) - n = -1; - if (last) - n = '\n'; - if (cp) - size = cpmax - cp; - else - size = 0; - if (n == -1) - { - if (size<=1) - { - if (jp->nullfield && sfputr(iop, jp->nullfield, -1) < 0) - return -1; - } - else if (sfwrite(iop, cp, size) < 0) - return -1; - if (sfwrite(iop, jp->delimstr, jp->delimlen) < 0) - return -1; - } - else if (size <= 1) - { - if (!jp->nullfield) - sfputc(iop, n); - else if (sfputr(iop, jp->nullfield, n) < 0) - return -1; - } - else - { - last = cp[size-1]; - cp[size-1] = n; - if (sfwrite(iop, cp, size) < 0) - return -1; - cp[size-1] = last; - } - return 0; -} - -#if DEBUG_TRACE -static int i1,i2,i3; -#define outfield(p,i,n,f) (sfprintf(sfstdout, "[F%d#%d:%d,%d]", __LINE__, i1=i, i2=n, i3=f), outfield(p, i1, i2, i3)) -#endif - -static int -outrec(register Join_t* jp, int mode) -{ - register File_t* fp; - register int i; - register int j; - register int k; - register int n; - int* out; - - if (mode < 0 && jp->file[0].hit++) - return 0; - if (mode > 0 && jp->file[1].hit++) - return 0; - if (out = jp->outlist) - { - while ((n = *out++) >= 0) - { - if (n == JOINFIELD) - { - i = mode >= 0; - j = jp->file[i].field; - } - else - { - i = n & 1; - j = (mode<0 && i || mode>0 && !i) ? - jp->file[i].nfields : - n >> 2; - } - if (outfield(jp, i, j, *out < 0) < 0) - return -1; - } - return 0; - } - k = jp->file[0].nfields; - if (mode >= 0) - k += jp->file[1].nfields - 1; - for (i=0; i<2; i++) - { - fp = &jp->file[i]; - if (mode>0 && i==0) - { - k -= (fp->nfields - 1); - continue; - } - n = fp->field; - if (mode||i==0) - { - /* output join field first */ - if (outfield(jp,i,n,!--k) < 0) - return -1; - if (!k) - return 0; - for (j=0; j<n; j++) - { - if (outfield(jp,i,j,!--k) < 0) - return -1; - if (!k) - return 0; - } - j = n + 1; - } - else - j = 0; - for (;j<fp->nfields; j++) - { - if (j!=n && outfield(jp,i,j,!--k) < 0) - return -1; - if (!k) - return 0; - } - } - return 0; -} - -#if DEBUG_TRACE -#define outrec(p,n) (sfprintf(sfstdout, "[R#%d,%d,%lld,%lld:%-.*s{%d}:%-.*s{%d}]", __LINE__, i1=n, lo, hi, jp->file[0].fieldlen, cp1, jp->file[0].hit, jp->file[1].fieldlen, cp2, jp->file[1].hit), outrec(p, i1)) -#endif - -static int -join(Join_t* jp) -{ - register unsigned char* cp1; - register unsigned char* cp2; - register int n1; - register int n2; - register int n; - register int cmp; - register int same; - int o2; - Sfoff_t lo = -1; - Sfoff_t hi = -1; - - if ((cp1 = getrec(jp, 0, 0)) && (cp2 = getrec(jp, 1, 0)) || (cp2 = 0)) - { - n1 = jp->file[0].fieldlen; - n2 = jp->file[1].fieldlen; - same = 0; - for (;;) - { - n = n1 < n2 ? n1 : n2; -#if DEBUG_TRACE - if (!n && !(cmp = n1 < n2 ? -1 : (n1 > n2)) || n && !(cmp = (int)*cp1 - (int)*cp2) && !(cmp = jp->ignorecase ? strncasecmp((char*)cp1, (char*)cp2, n) : memcmp(cp1, cp2, n))) - cmp = n1 - n2; -sfprintf(sfstdout, "[C#%d:%d(%c-%c),%d,%lld,%lld%s]", __LINE__, cmp, *cp1, *cp2, same, lo, hi, (jp->outmode & C_COMMON) ? ",COMMON" : ""); - if (!cmp) -#else - if (!n && !(cmp = n1 < n2 ? -1 : (n1 > n2)) || n && !(cmp = (int)*cp1 - (int)*cp2) && !(cmp = jp->ignorecase ? strncasecmp((char*)cp1, (char*)cp2, n) : memcmp(cp1, cp2, n)) && !(cmp = n1 - n2)) -#endif - { - if (!(jp->outmode & C_COMMON)) - { - if (cp1 = getrec(jp, 0, 1)) - { - n1 = jp->file[0].fieldlen; - same = 1; - continue; - } - if ((jp->ooutmode & (C_FILE1|C_FILE2)) != C_FILE2) - break; - if (sfseek(jp->file[0].iop, (Sfoff_t)-jp->file[0].reclen, SEEK_CUR) < 0 || !(cp1 = getrec(jp, 0, 0))) - { - error(ERROR_SYSTEM|2, "%s: seek error", jp->file[0].name); - return -1; - } - } - else if (outrec(jp, 0) < 0) - return -1; - else if (lo < 0 && (jp->outmode & C_COMMON)) - { - if ((lo = sfseek(jp->file[1].iop, (Sfoff_t)0, SEEK_CUR)) < 0) - { - error(ERROR_SYSTEM|2, "%s: seek error", jp->file[1].name); - return -1; - } - lo -= jp->file[1].reclen; - } - if (cp2 = getrec(jp, 1, lo < 0)) - { - n2 = jp->file[1].fieldlen; - continue; - } -#if DEBUG_TRACE -sfprintf(sfstdout, "[2#%d:0,%lld,%lld]", __LINE__, lo, hi); -#endif - } - else if (cmp > 0) - { - if (same) - { - same = 0; - next: - if (n2 > jp->samesize) - { - jp->samesize = roundof(n2, 16); - if (!(jp->same = newof(jp->same, char, jp->samesize, 0))) - { - error(ERROR_SYSTEM|2, "out of space"); - return -1; - } - } - memcpy(jp->same, cp2, o2 = n2); - if (!(cp2 = getrec(jp, 1, 0))) - break; - n2 = jp->file[1].fieldlen; - if (n2 == o2 && *cp2 == *jp->same && !memcmp(cp2, jp->same, n2)) - goto next; - continue; - } - if (hi >= 0) - { - if (sfseek(jp->file[1].iop, hi, SEEK_SET) != hi) - { - error(ERROR_SYSTEM|2, "%s: seek error", jp->file[1].name); - return -1; - } - hi = -1; - } - else if ((jp->outmode & C_FILE2) && outrec(jp, 1) < 0) - return -1; - lo = -1; - if (cp2 = getrec(jp, 1, 1)) - { - n2 = jp->file[1].fieldlen; - continue; - } -#if DEBUG_TRACE -sfprintf(sfstdout, "[2#%d:0,%lld,%lld]", __LINE__, lo, hi); -#endif - } - else if (same) - { - same = 0; - if (!(cp1 = getrec(jp, 0, 0))) - break; - n1 = jp->file[0].fieldlen; - continue; - } - if (lo >= 0) - { - if ((hi = sfseek(jp->file[1].iop, (Sfoff_t)0, SEEK_CUR)) < 0 || - (hi -= jp->file[1].reclen) < 0 || - sfseek(jp->file[1].iop, lo, SEEK_SET) != lo || - !(cp2 = getrec(jp, 1, 0))) - { - error(ERROR_SYSTEM|2, "%s: seek error", jp->file[1].name); - return -1; - } - n2 = jp->file[1].fieldlen; - lo = -1; - if (jp->file[1].discard) - sfseek(jp->file[1].iop, (Sfoff_t)-1, SEEK_SET); - } - else if (!cp2) - break; - else if ((jp->outmode & C_FILE1) && outrec(jp, -1) < 0) - return -1; - if (!(cp1 = getrec(jp, 0, 1))) - break; - n1 = jp->file[0].fieldlen; - } - } -#if DEBUG_TRACE -sfprintf(sfstdout, "[X#%d:?,%p,%p,%d%,%d,%d%s]", __LINE__, cp1, cp2, cmp, lo, hi, (jp->outmode & C_COMMON) ? ",COMMON" : ""); -#endif - if (cp2) - { - if (hi >= 0 && - sfseek(jp->file[1].iop, (Sfoff_t)0, SEEK_CUR) < hi && - sfseek(jp->file[1].iop, hi, SEEK_SET) != hi) - { - error(ERROR_SYSTEM|2, "%s: seek error", jp->file[1].name); - return -1; - } -#if DEBUG_TRACE -sfprintf(sfstdout, "[O#%d:%02o:%02o]", __LINE__, jp->ooutmode, jp->outmode); -#endif - cp1 = (!cp1 && cmp && hi < 0 && !jp->file[1].hit && ((jp->ooutmode ^ C_ALL) <= 1 || jp->outmode == 2)) ? cp2 : getrec(jp, 1, 0); - cmp = 1; - n = 1; - } - else - { - cmp = -1; - n = 0; - } -#if DEBUG_TRACE -sfprintf(sfstdout, "[X#%d:%d,%p,%p,%d,%02o,%02o%s]", __LINE__, n, cp1, cp2, cmp, jp->ooutmode, jp->outmode, (jp->outmode & C_COMMON) ? ",COMMON" : ""); -#endif - if (!cp1 || !(jp->outmode & (1<<n))) - { - if (cp1 && jp->file[n].iop == sfstdin) - sfseek(sfstdin, (Sfoff_t)0, SEEK_END); - return 0; - } - if (outrec(jp, cmp) < 0) - return -1; - do - { - if (!getrec(jp, n, 1)) - return 0; - } while (outrec(jp, cmp) >= 0); - return -1; -} - -int -b_join(int argc, char** argv, void* context) -{ - register int n; - register char* cp; - register Join_t* jp; - char* e; - -#if !DEBUG_TRACE - cmdinit(argc, argv, context, ERROR_CATALOG, ERROR_NOTIFY); -#endif - if (!(jp = init())) - error(ERROR_system(1),"out of space"); - jp->context = context; - for (;;) - { - switch (n = optget(argv, usage)) - { - case 0: - break; - case 'j': - /* - * check for obsolete "-j1 field" and "-j2 field" - */ - - if (opt_info.offset == 0) - { - cp = argv[opt_info.index - 1]; - for (n = strlen(cp) - 1; n > 0 && cp[n] != 'j'; n--); - n = cp[n] == 'j'; - } - else - n = 0; - if (n) - { - if (opt_info.num!=1 && opt_info.num!=2) - error(2,"-jfileno field: fileno must be 1 or 2"); - n = '0' + opt_info.num; - if (!(cp = argv[opt_info.index])) - { - argc = 0; - break; - } - opt_info.num = strtol(cp, &e, 10); - if (*e) - { - argc = 0; - break; - } - opt_info.index++; - } - else - { - jp->file[0].field = (int)(opt_info.num-1); - n = '2'; - } - /*FALLTHROUGH*/ - case '1': - case '2': - if (opt_info.num <=0) - error(2,"field number must positive"); - jp->file[n-'1'].field = (int)(opt_info.num-1); - continue; - case 'v': - jp->outmode &= ~C_COMMON; - /*FALLTHROUGH*/ - case 'a': - if (opt_info.num!=1 && opt_info.num!=2) - error(2,"%s: file number must be 1 or 2", opt_info.name); - jp->outmode |= 1<<(opt_info.num-1); - continue; - case 'e': - jp->nullfield = opt_info.arg; - continue; - case 'o': - /* need to accept obsolescent command syntax */ - n = getolist(jp, opt_info.arg, argv+opt_info.index); - opt_info.index += n; - continue; - case 't': - jp->state[' '] = jp->state['\t'] = 0; - if (jp->mb) - { - cp = opt_info.arg; - jp->delim = mbchar(cp); - if ((n = cp - opt_info.arg) > 1) - { - jp->delimlen = n; - jp->delimstr = opt_info.arg; - continue; - } - } - n = *(unsigned char*)opt_info.arg; - jp->state[n] = S_DELIM; - jp->delim = n; - continue; - case 'i': - jp->ignorecase = !opt_info.num; - continue; - case 'B': - jp->buffered = !opt_info.num; - continue; - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - done(jp); - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - break; - } - argv += opt_info.index; - argc -= opt_info.index; - if (error_info.errors || argc!=2) - { - done(jp); - error(ERROR_usage(2),"%s", optusage(NiL)); - } - jp->ooutmode = jp->outmode; - jp->file[0].name = cp = *argv++; - if (streq(cp,"-")) - { - if (sfseek(sfstdin,(Sfoff_t)0,SEEK_CUR) < 0) - { - if (sfdcseekable(sfstdin)) - error(ERROR_warn(0),"%s: seek may fail",cp); - else - jp->file[0].discard = 1; - } - jp->file[0].iop = sfstdin; - } - else if (!(jp->file[0].iop = sfopen(NiL, cp, "r"))) - { - done(jp); - error(ERROR_system(1),"%s: cannot open",cp); - } - jp->file[1].name = cp = *argv; - if (streq(cp,"-")) - { - if (sfseek(sfstdin,(Sfoff_t)0,SEEK_CUR) < 0) - { - if (sfdcseekable(sfstdin)) - error(ERROR_warn(0),"%s: seek may fail",cp); - else - jp->file[1].discard = 1; - } - jp->file[1].iop = sfstdin; - } - else if (!(jp->file[1].iop = sfopen(NiL, cp, "r"))) - { - done(jp); - error(ERROR_system(1),"%s: cannot open",cp); - } - if (jp->buffered) - { - sfsetbuf(jp->file[0].iop, jp->file[0].iop, SF_UNBOUND); - sfsetbuf(jp->file[1].iop, jp->file[1].iop, SF_UNBOUND); - } - jp->outfile = sfstdout; - if (!jp->outlist) - jp->nullfield = 0; - if (join(jp) < 0) - { - done(jp); - error(ERROR_system(1),"write error"); - } - else if (jp->file[0].iop==sfstdin || jp->file[1].iop==sfstdin) - sfseek(sfstdin,(Sfoff_t)0,SEEK_END); - done(jp); - return error_info.errors; -} diff --git a/usr/src/lib/libcmd/common/ln.c b/usr/src/lib/libcmd/common/ln.c deleted file mode 100644 index c898e7fb05..0000000000 --- a/usr/src/lib/libcmd/common/ln.c +++ /dev/null @@ -1,35 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * Glenn Fowler - * AT&T Research - * - * cp/ln/mv -- copy/link/move files - */ - -#include <cmd.h> - -int -b_ln(int argc, register char** argv, void* context) -{ - return b_cp(argc, argv, context); -} diff --git a/usr/src/lib/libcmd/common/logname.c b/usr/src/lib/libcmd/common/logname.c deleted file mode 100644 index d23f694c7f..0000000000 --- a/usr/src/lib/libcmd/common/logname.c +++ /dev/null @@ -1,78 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * AT&T Research - * - * logname - */ - -static const char usage[] = -"[-?\n@(#)$Id: logname (AT&T Research) 1999-04-30 $\n]" -USAGE_LICENSE -"[+NAME?logname - return the user's login name]" -"[+DESCRIPTION?\blogname\b writes the users's login name to standard " - "output. The login name is the string that is returned by the " - "\bgetlogin\b(2) function. If \bgetlogin\b(2) does not return " - "successfully, the corresponding to the real user id of the calling " - "process is used instead.]" - -"\n" -"\n\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?Successful Completion.]" - "[+>0?An error occurred.]" -"}" -"[+SEE ALSO?\bgetlogin\b(2)]" -; - - -#include <cmd.h> - -int -b_logname(int argc, char** argv, void* context) -{ - register char* logname; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - for (;;) - { - switch (optget(argv, usage)) - { - case ':': - error(2, "%s", opt_info.arg); - continue; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - continue; - } - break; - } - if (error_info.errors) - error(ERROR_usage(2), "%s", optusage(NiL)); - if (!(logname = getlogin())) - logname = fmtuid(getuid()); - sfputr(sfstdout, logname, '\n'); - return 0; -} - diff --git a/usr/src/lib/libcmd/common/md5sum.c b/usr/src/lib/libcmd/common/md5sum.c deleted file mode 100644 index 28a1c435e4..0000000000 --- a/usr/src/lib/libcmd/common/md5sum.c +++ /dev/null @@ -1,35 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * Glenn Fowler - * AT&T Research - * - * md5sum -- implemented by cksum - */ - -#include <cmd.h> - -int -b_md5sum(int argc, register char** argv, void* context) -{ - return b_cksum(argc, argv, context); -} diff --git a/usr/src/lib/libcmd/common/mkdir.c b/usr/src/lib/libcmd/common/mkdir.c deleted file mode 100644 index 491d990f64..0000000000 --- a/usr/src/lib/libcmd/common/mkdir.c +++ /dev/null @@ -1,181 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * AT&T Bell Laboratories - * - * mkdir - */ - -static const char usage[] = -"[-?\n@(#)$Id: mkdir (AT&T Research) 2009-12-03 $\n]" -USAGE_LICENSE -"[+NAME?mkdir - make directories]" -"[+DESCRIPTION?\bmkdir\b creates one or more directories. By " - "default, the mode of created directories is \ba=rwx\b minus the " - "bits set in the \bumask\b(1).]" -"[m:mode]:[mode?Set the mode of created directories to \amode\a. " - "\amode\a is symbolic or octal mode as in \bchmod\b(1). Relative " - "modes assume an initial mode of \ba=rwx\b.]" -"[p:parents?Create any missing intermediate pathname components. For " - "each dir operand that does not name an existing directory, effects " - "equivalent to those caused by the following command shall occur: " - "\vmkdir -p -m $(umask -S),u+wx $(dirname dir) && mkdir [-m mode]] " - "dir\v where the \b-m\b mode option represents that option supplied to " - "the original invocation of \bmkdir\b, if any. Each dir operand that " - "names an existing directory shall be ignored without error.]" -"[v:verbose?Print a message on the standard error for each created " - "directory.]" -"\n" -"\ndirectory ...\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?All directories created successfully, or the \b-p\b option " - "was specified and all the specified directories now exist.]" - "[+>0?An error occurred.]" -"}" -"[+SEE ALSO?\bchmod\b(1), \brmdir\b(1), \bumask\b(1)]" -; - -#include <cmd.h> -#include <ls.h> - -#define DIRMODE (S_IRWXU|S_IRWXG|S_IRWXO) - -int -b_mkdir(int argc, char** argv, void* context) -{ - register char* arg; - register int n; - register mode_t mode = DIRMODE; - register mode_t mask = 0; - register int mflag = 0; - register int pflag = 0; - register int vflag = 0; - char* name; - mode_t dmode; - struct stat st; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - for (;;) - { - switch (optget(argv, usage)) - { - case 0: - break; - case 'm': - mflag = 1; - mode = strperm(arg = opt_info.arg, &opt_info.arg, mode); - if (*opt_info.arg) - error(ERROR_exit(0), "%s: invalid mode", arg); - continue; - case 'p': - pflag = 1; - continue; - case 'v': - vflag = 1; - continue; - case ':': - error(2, "%s", opt_info.arg); - continue; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - continue; - } - break; - } - argv += opt_info.index; - if (error_info.errors || !*argv) - error(ERROR_usage(2), "%s", optusage(NiL)); - mask = umask(0); - if (mflag || pflag) - { - dmode = DIRMODE & ~mask; - if (!mflag) - mode = dmode; - dmode |= S_IWUSR | S_IXUSR; - } - else - { - mode &= ~mask; - umask(mask); - mask = 0; - } - while (arg = *argv++) - { - if (mkdir(arg, mode) < 0) - { - if (!pflag || !(errno == ENOENT || errno == EEXIST || errno == ENOTDIR)) - { - error(ERROR_system(0), "%s:", arg); - continue; - } - if (errno == EEXIST) - continue; - - /* - * -p option, preserve intermediates - * first eliminate trailing /'s - */ - - n = strlen(arg); - while (n > 0 && arg[--n] == '/'); - arg[n + 1] = 0; - for (name = arg, n = *arg; n;) - { - /* skip over slashes */ - while (*arg == '/') - arg++; - /* skip to next component */ - while ((n = *arg) && n != '/') - arg++; - *arg = 0; - if (mkdir(name, n ? dmode : mode) < 0 && errno != EEXIST && access(name, F_OK) < 0) - { - *arg = n; - error(ERROR_system(0), "%s:", name); - break; - } - if (vflag) - error(0, "%s: directory created", name); - if (!(*arg = n) && (mode & (S_ISVTX|S_ISUID|S_ISGID))) - { - if (stat(name, &st)) - { - error(ERROR_system(0), "%s: cannot stat", name); - break; - } - if ((st.st_mode & (S_ISVTX|S_ISUID|S_ISGID)) != (mode & (S_ISVTX|S_ISUID|S_ISGID)) && chmod(name, mode)) - { - error(ERROR_system(0), "%s: cannot change mode from %s to %s", name, fmtperm(st.st_mode & (S_ISVTX|S_ISUID|S_ISGID)), fmtperm(mode)); - break; - } - } - } - } - else if (vflag) - error(0, "%s: directory created", arg); - } - if (mask) - umask(mask); - return error_info.errors != 0; -} diff --git a/usr/src/lib/libcmd/common/mkfifo.c b/usr/src/lib/libcmd/common/mkfifo.c deleted file mode 100644 index f44e10aa01..0000000000 --- a/usr/src/lib/libcmd/common/mkfifo.c +++ /dev/null @@ -1,98 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * AT&T Bell Laboratories - * - * mkfifo - */ - -static const char usage[] = -"[-?\n@(#)$Id: mkfifo (AT&T Research) 2009-01-02 $\n]" -USAGE_LICENSE -"[+NAME?mkfifo - make FIFOs (named pipes)]" -"[+DESCRIPTION?\bmkfifo\b creates one or more FIFO's. By " - "default, the mode of created FIFO is \ba=rw\b minus the " - "bits set in the \bumask\b(1).]" -"[m:mode]:[mode?Set the mode of created FIFO to \amode\a. " - "\amode\a is symbolic or octal mode as in \bchmod\b(1). Relative " - "modes assume an initial mode of \ba=rw\b.]" -"\n" -"\nfile ...\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?All FIFO's created successfully.]" - "[+>0?One or more FIFO's could not be created.]" -"}" -"[+SEE ALSO?\bchmod\b(1), \bumask\b(1)]" -; - -#include <cmd.h> -#include <ls.h> - -int -b_mkfifo(int argc, char *argv[], void* context) -{ - register char* arg; - register mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH; - register mode_t mask = 0; - register int mflag = 0; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - for (;;) - { - switch (optget(argv, usage)) - { - case 0: - break; - case 'm': - mflag = 1; - mode = strperm(arg = opt_info.arg, &opt_info.arg, mode); - if (*opt_info.arg) - error(ERROR_exit(0), "%s: invalid mode", arg); - continue; - case ':': - error(2, "%s", opt_info.arg); - continue; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - continue; - } - break; - } - argv += opt_info.index; - if (error_info.errors || !*argv) - error(ERROR_usage(2), "%s", optusage(NiL)); - mask = umask(0); - if (!mflag) - { - mode &= ~mask; - umask(mask); - mask = 0; - } - while (arg = *argv++) - if (mkfifo(arg, mode) < 0) - error(ERROR_system(0), "%s:", arg); - if (mask) - umask(mask); - return error_info.errors != 0; -} diff --git a/usr/src/lib/libcmd/common/mktemp.c b/usr/src/lib/libcmd/common/mktemp.c deleted file mode 100644 index a9444045de..0000000000 --- a/usr/src/lib/libcmd/common/mktemp.c +++ /dev/null @@ -1,171 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped - -static const char usage[] = -"[-?\n@(#)$Id: mktemp (AT&T Research) 2010-03-05 $\n]" -USAGE_LICENSE -"[+NAME?mktemp - make temporary file or directory]" -"[+DESCRIPTION?\bmktemp\b creates a temporary file with optional base " - "name prefix \aprefix\a. If \aprefix\a is omitted then \btmp_\b is used " - "and \b--tmp\b is implied. If \aprefix\a contains a directory prefix " - "then that directory overrides any of the directories described below. A " - "temporary file will have mode \brw-------\b and a temporary directory " - "will have mode \brwx------\b, subject to \bumask\b(1). Generated paths " - "have these attributes:]" - "{" - "[+*?Lower case to avoid clashes on case ignorant filesystems.]" - "[+*?Pseudo-random part to deter denial of service attacks.]" - "[+*?Default pseudo-random part (no specific \bX...\b template) " - "formatted to accomodate 8.3 filesystems.]" - "}" -"[+?A consecutive trailing sequence of \bX\b's in \aprefix\a is replaced " - "by the pseudo-random part. If there are no \bX\b's then the " - "pseudo-random part is appended to the prefix.]" -"[d:directory?Create a directory instead of a regular file.]" -"[m:mode]:[mode?Set the mode of the created temporary to \amode\a. " - "\amode\a is symbolic or octal mode as in \bchmod\b(1). Relative modes " - "assume an initial mode of \bu=rwx\b.]" -"[p:default?Use \adirectory\a if the \bTMPDIR\b environment variable is " - "not defined. Implies \b--tmp\b.]:[directory]" -"[q:quiet?Suppress file and directory error diagnostics.]" -"[R:regress?The pseudo random generator is seeded with \aseed\a instead " - "of process/system specific transient data. Use for testing " - "only. A seed of \b0\b is silently changed to \b1\b.]#[seed]" -"[t:tmp|temporary-directory?Create a path rooted in a temporary " - "directory.]" -"[u:unsafe|dry-run?Check for file/directory existence but do not create. " - "Use this for testing only.]" -"\n" -"\n[ prefix ]\n" -"\n" -"[+SEE ALSO?\bmkdir\b(1), \bpathtemp\b(3), \bmktemp\b(3)]" -; - -#include <cmd.h> -#include <ls.h> - -int -b_mktemp(int argc, char** argv, void* context) -{ - mode_t mode = 0; - mode_t mask; - int fd; - int i; - int quiet = 0; - int unsafe = 0; - int* fdp = &fd; - char* dir = ""; - char* pfx; - char* t; - char path[PATH_MAX]; - - cmdinit(argc, argv, context, ERROR_CATALOG, ERROR_NOTIFY); - for (;;) - { - switch (optget(argv, usage)) - { - case 0: - break; - case 'd': - fdp = 0; - continue; - case 'm': - mode = strperm(pfx = opt_info.arg, &opt_info.arg, S_IRWXU); - if (*opt_info.arg) - error(ERROR_exit(0), "%s: invalid mode", pfx); - continue; - case 'p': - if ((t = getenv("TMPDIR")) && *t) - dir = 0; - else - dir = opt_info.arg; - continue; - case 'q': - quiet = 1; - continue; - case 't': - dir = 0; - continue; - case 'u': - unsafe = 1; - fdp = 0; - continue; - case 'R': - if (!pathtemp(NiL, 0, opt_info.arg, "/seed", NiL)) - error(2, "%s: regression test initializtion failed", opt_info.arg); - continue; - case ':': - error(2, "%s", opt_info.arg); - continue; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - continue; - } - break; - } - argv += opt_info.index; - if (error_info.errors || (pfx = *argv++) && *argv) - error(ERROR_usage(2), "%s", optusage(NiL)); - mask = umask(0); - if (!mode) - mode = (fdp ? (S_IRUSR|S_IWUSR) : S_IRWXU) & ~mask; - umask(~mode & (S_IRWXU|S_IRWXG|S_IRWXO)); - if (!pfx) - { - pfx = "tmp_"; - if (dir && !*dir) - dir = 0; - } - if (t = strrchr(pfx, '/')) - { - i = ++t - pfx; - dir = fmtbuf(i); - memcpy(dir, pfx, i); - dir[i] = 0; - pfx = t; - } - for (;;) - { - if (!pathtemp(path, sizeof(path), dir, pfx, fdp)) - { - if (quiet) - error_info.errors++; - else - error(ERROR_SYSTEM|2, "cannot create temporary path"); - break; - } - if (fdp || unsafe || !mkdir(path, mode)) - { - if (fdp) - close(*fdp); - sfputr(sfstdout, path, '\n'); - break; - } - if (sh_checksig(context)) - { - error_info.errors++; - break; - } - } - umask(mask); - return error_info.errors != 0; -} diff --git a/usr/src/lib/libcmd/common/mv.c b/usr/src/lib/libcmd/common/mv.c deleted file mode 100644 index 1055a9c553..0000000000 --- a/usr/src/lib/libcmd/common/mv.c +++ /dev/null @@ -1,35 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * Glenn Fowler - * AT&T Research - * - * cp/ln/mv -- copy/link/move files - */ - -#include <cmd.h> - -int -b_mv(int argc, register char** argv, void* context) -{ - return b_cp(argc, argv, context); -} diff --git a/usr/src/lib/libcmd/common/paste.c b/usr/src/lib/libcmd/common/paste.c deleted file mode 100644 index 0c20109dda..0000000000 --- a/usr/src/lib/libcmd/common/paste.c +++ /dev/null @@ -1,278 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * AT&T Bell Laboratories - * - * paste [-s] [-d delim] [file] ... - * - * paste lines from files together - */ - -static const char usage[] = -"[-?\n@(#)$Id: paste (AT&T Research) 2009-11-28 $\n]" -USAGE_LICENSE -"[+NAME?paste - merge lines of files]" -"[+DESCRIPTION?\bpaste\b concatenates the corresponding lines of a " - "given input file and writes the resulting lines to standard " - "output. By default \bpaste\b replaces the newline character of " - "every line other than the last input file with the TAB character.]" -"[+?Unless the \b-s\b option is specified, if an end-of-file is encountered " - "on one or more input files, but not all input files, \bpaste\b " - "behaves as if empty lines were read from the file(s) on which " - "end-of-file was detected.]" -"[+?Unless the \b-s\b option is specified, \bpaste\b is limited by " - "the underlying operating system on how many \afile\a operands " - "can be specified.]" -"[+?If no \afile\a operands are given or if the \afile\a is \b-\b, \bpaste\b " - "reads from standard input. The start of the file is defined as the " - "current offset.]" - -"[s:serial?Paste the lines of one file at a time rather than one line " - "from each file. In this case if the \b-d\b option is " - "specified the delimiter will be reset to the first in the " - "list at the beginning of each file.]" -"[d:delimiters]:[list?\alist\a specifies a list of delimiters. These " - "delimiters are used circularly instead of TAB to replace " - "the newline character of the input lines. Unless the \b-s\b " - "option is specified, the delimiter will be reset to the first " - "element of \alist\a each time a line is processed from each file. " - "The delimiter characters corresponding to \alist\a will be found " - "by treating \alist\a as an ANSI-C string, except that the \b\\0\b " - "sequence will insert the empty string instead of the null character.]" -"\n" -"\n[file ...]\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?All files processed successfully.]" - "[+>0?An error occurred.]" -"}" -"[+SEE ALSO?\bcut\b(1), \bcat\b(1), \bjoin\b(1)]" -; - -#include <cmd.h> - -typedef struct Delim_s -{ - const char* chr; - size_t len; -} Delim_t; - -/* - * paste the lines of the <nstreams> defined in <streams> and put results - * to <out> - */ - -static int paste(int nstream,Sfio_t* streams[],Sfio_t *out, register const char *delim, int dsiz, int dlen, Delim_t* mp) -{ - register const char *cp; - register int d, n, i, z, more=1; - register Sfio_t *fp; - do - { - d = (dlen>0?0:-1); - for(n=more-1,more=0; n < nstream;) - { - if(fp=streams[n]) - { - if(cp = sfgetr(fp,'\n',0)) - { - if(n==0) - more = 1; - else if(!more) /* first stream with output */ - { - if(dsiz == 1) - sfnputc(out, *delim, n); - else if(dlen>0) - { - for(d=n; d>dlen; d-=dlen) - sfwrite(out,delim,dsiz); - if(d) - { - if(mp) - for (i = z = 0; i < d; i++) - z += mp[i].len; - else - z = d; - sfwrite(out,delim,z); - } - } - more = n+1; - } - if(sfwrite(out,cp,sfvalue(fp)-((n+1)<nstream)) < 0) - return(-1); - } - else - streams[n] = 0; - } - if(++n<nstream && more && d>=0) - { - register int c; - if(d >= dlen) - d = 0; - if(mp) - sfwrite(out,mp[d].chr,mp[d].len); - else if(c=delim[d]) - sfputc(out,c); - d++; - } - else if(n==nstream && !streams[n-1] && more) - sfputc(out,'\n'); - } - } while(more); - return(0); -} - -/* - * Handles paste -s, for file <in> to file <out> using delimiters <delim> - */ -static int spaste(Sfio_t *in,register Sfio_t* out,register const char *delim,int dsiz,int dlen,Delim_t* mp) -{ - register const char *cp; - register int d=0; - if((cp = sfgetr(in,'\n',0)) && sfwrite(out,cp,sfvalue(in)-1) < 0) - return(-1); - while(cp=sfgetr(in, '\n',0)) - { - if(dlen) - { - register int c; - if(d >= dlen) - d = 0; - if(mp) - sfwrite(out,mp[d].chr,mp[d].len); - else if(c=delim[d]) - sfputc(out,c); - d++; - } - if(sfwrite(out,cp,sfvalue(in)-1) < 0) - return(-1); - } - sfputc(out,'\n'); - return(0); -} - -int -b_paste(int argc,register char *argv[], void* context) -{ - register int n, sflag=0; - register Sfio_t *fp, **streams; - register char *cp, *delim; - char *ep; - Delim_t *mp; - int dlen, dsiz; - char defdelim[2]; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - delim = 0; - while (n = optget(argv, usage)) switch (n) - { - case 'd': - delim = opt_info.arg; - break; - case 's': - sflag++; - break; - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - argv += opt_info.index; - if(error_info.errors) - error(ERROR_usage(2),"%s", optusage(NiL)); - if(!delim || !*delim) - { - delim = defdelim; - delim[0] = '\t'; - delim[1] = 0; - } - dlen = dsiz = stresc(delim); - mp = 0; - if (mbwide()) - { - cp = delim; - ep = delim + dlen; - dlen = 0; - while (cp < ep) - { - mbchar(cp); - dlen++; - } - if(dlen < dsiz) - { - if (!(mp = newof(0, Delim_t, dlen, 0))) - error(ERROR_system(1), "out of space"); - cp = delim; - dlen = 0; - while (cp < ep) - { - mp[dlen].chr = cp; - mbchar(cp); - mp[dlen].len = cp - mp[dlen].chr; - dlen++; - } - } - } - if(cp = *argv) - { - n = argc - opt_info.index; - argv++; - } - else - n = 1; - if(!sflag) - { - if (!(streams = (Sfio_t**)stakalloc(n*sizeof(Sfio_t*)))) - error(ERROR_exit(1), "out of space"); - n = 0; - } - do - { - if(!cp || streq(cp,"-")) - fp = sfstdin; - else if(!(fp = sfopen(NiL,cp,"r"))) - error(ERROR_system(0),"%s: cannot open",cp); - if(fp && sflag) - { - if(spaste(fp,sfstdout,delim,dsiz,dlen,mp) < 0) - error(ERROR_system(0),"write failed"); - if(fp!=sfstdin) - sfclose(fp); - } - else if(!sflag) - streams[n++] = fp; - } while(cp= *argv++); - if(!sflag) - { - if(error_info.errors==0 && paste(n,streams,sfstdout,delim,dsiz,dlen,mp) < 0) - error(ERROR_system(0),"write failed"); - while(--n>=0) - if((fp=streams[n]) && fp!=sfstdin) - sfclose(fp); - } - if (mp) - free(mp); - return(error_info.errors); -} diff --git a/usr/src/lib/libcmd/common/pathchk.c b/usr/src/lib/libcmd/common/pathchk.c deleted file mode 100644 index 6fafac4feb..0000000000 --- a/usr/src/lib/libcmd/common/pathchk.c +++ /dev/null @@ -1,267 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * pathchk - * - * Written by David Korn - */ - -static const char usage[] = -"[-?\n@(#)$Id: pathchk (AT&T Research) 2009-07-24 $\n]" -USAGE_LICENSE -"[+NAME?pathchk - check pathnames for portability]" -"[+DESCRIPTION?\bpathchk\b checks each \apathname\a to see if it is " - "valid and/or portable. A \apathname\a is valid if it can be used to " - "access or create a file without causing syntax errors. A file is " - "portable if no truncation will result on any conforming POSIX.1 " - "implementation.]" -"[+?By default \bpathchk\b checks each component of each \apathname\a " - "based on the underlying file system. A diagnostic is written to " - "standard error for each pathname that:]" - "{" - "[+-?Is longer than \b$(getconf PATH_MAX)\b bytes.]" - "[+-?Contains any component longer than \b$(getconf NAME_MAX)\b " - "bytes.]" - "[+-?Contains any directory component in a directory that is not " - "searchable.]" - "[+-?Contains any character in any component that is not valid " - "in its containing directory.]" - "[+-?Is empty.]" - "}" -"[p:components?Instead of performing length checks on the underlying " - "file system, write a diagnostic for each pathname operand that:]" - "{" - "[+-?Is longer than \b$(getconf _POSIX_PATH_MAX)\b bytes.]" - "[+-?Contains any component longer than \b$(getconf " - "_POSIX_NAME_MAX)\b bytes.]" - "[+-?Contains any character in any component that is not in the " - "portable filename character set.]" - "}" -"[P:path?Write a diagnostic for each pathname operand that:]" - "{" - "[+-?Contains any component with \b-\b as the first character.]" - "[+-?Is empty.]" - "}" -"[a:all|portability?Equivalent to \b--components\b \b--path\b.]" -"\n" -"\npathname ...\n" -"\n" -"[+EXIT STATUS?]" - "{" - "[+0?All \apathname\a operands passed all of the checks.]" - "[+>0?An error occurred.]" - "}" -"[+SEE ALSO?\bgetconf\b(1), \bcreat\b(2), \bpathchk\b(2)]" -; - - -#include <cmd.h> -#include <ls.h> - -#define COMPONENTS 0x1 -#define PATH 0x2 - -#define isport(c) (((c)>='a' && (c)<='z') || ((c)>='A' && (c)<='Z') || ((c)>='0' && (c)<='9') || (strchr("._-",(c))!=0) ) - -/* - * call pathconf and handle unlimited sizes - */ -static long mypathconf(const char *path, int op) -{ - register long r; - - static const char* const ops[] = { "NAME_MAX", "PATH_MAX" }; - - errno = 0; - if ((r = strtol(astconf(ops[op], path, NiL), NiL, 0)) < 0 && !errno) - return LONG_MAX; - return r; -} - -/* - * returns 1 if <path> passes test - */ -static int pathchk(char* path, int mode) -{ - register char *cp=path, *cpold; - register int c; - register long r,name_max,path_max; - char buf[2]; - - if(!*path) - { - if (mode & PATH) - error(2,"path is empty"); - return -1; - } - if(mode & COMPONENTS) - { - name_max = _POSIX_NAME_MAX; - path_max = _POSIX_PATH_MAX; - } - else - { - char tmp[2]; - name_max = path_max = 0; - tmp[0] = (*cp=='/'? '/': '.'); - tmp[1] = 0; - if((r=mypathconf(tmp, 0)) > _POSIX_NAME_MAX) - name_max = r; - if((r=mypathconf(tmp, 1)) > _POSIX_PATH_MAX) - path_max = r; - if(*cp!='/') - { - if(name_max==0||path_max==0) - { - if(!(cpold = getcwd((char*)0, 0)) && errno == EINVAL && (cpold = newof(0, char, PATH_MAX, 0)) && !getcwd(cpold, PATH_MAX)) - { - free(cpold); - cpold = 0; - } - if(cpold) - { - cp = cpold + strlen(cpold); - while(name_max==0 || path_max==0) - { - if(cp>cpold) - while(--cp>cpold && *cp=='/'); - *++cp = 0; - if(name_max==0 && (r=mypathconf(cpold, 0)) > _POSIX_NAME_MAX) - name_max = r; - if(path_max==0 && (r=mypathconf(cpold, 1)) > _POSIX_PATH_MAX) - path_max=r; - if(--cp==cpold) - { - free(cpold); - break; - } - while(*cp!='/') - cp--; - } - cp=path; - } - } - while(*cp=='/') - cp++; - } - if(name_max==0) - name_max=_POSIX_NAME_MAX; - if(path_max==0) - path_max=_POSIX_PATH_MAX; - while(*(cpold=cp)) - { - while((c= *cp++) && c!='/'); - if((cp-cpold) > name_max) - goto err; - errno=0; - cp[-1] = 0; - r = mypathconf(path, 0); - if((cp[-1]=c)==0) - cp--; - else while(*cp=='/') - cp++; - if(r>=0) - name_max=(r<_POSIX_NAME_MAX?_POSIX_NAME_MAX:r); - else if(errno==EINVAL) - continue; -#ifdef ENAMETOOLONG - else if(errno==ENAMETOOLONG) - { - error(2,"%s: pathname too long",path); - return -1; - } -#endif /*ENAMETOOLONG*/ - else - break; - } - } - while(*(cpold=cp)) - { - if((mode & PATH) && *cp == '-') - { - error(2,"%s: path component begins with '-'",path,fmtquote(buf, NiL, "'", 1, 0)); - return -1; - } - while((c= *cp++) && c!='/') - if((mode & COMPONENTS) && !isport(c)) - { - buf[0] = c; - buf[1] = 0; - error(2,"%s: '%s' not in portable character set",path,fmtquote(buf, NiL, "'", 1, 0)); - return -1; - } - if((cp-cpold) > name_max) - goto err; - if(c==0) - break; - while(*cp=='/') - cp++; - } - if((cp-path) >= path_max) - { - error(2, "%s: pathname too long", path); - return -1; - } - return 0; - err: - error(2, "%s: component name %.*s too long", path, cp-cpold-1, cpold); - return -1; -} - -int -b_pathchk(int argc, char** argv, void* context) -{ - register int mode = 0; - register char* s; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - for (;;) - { - switch (optget(argv, usage)) - { - case 0: - break; - case 'a': - mode |= COMPONENTS|PATH; - continue; - case 'p': - mode |= COMPONENTS; - continue; - case 'P': - mode |= PATH; - continue; - case ':': - error(2, "%s", opt_info.arg); - continue; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - continue; - } - break; - } - argv += opt_info.index; - if (!*argv || error_info.errors) - error(ERROR_usage(2),"%s", optusage(NiL)); - while (s = *argv++) - pathchk(s, mode); - return error_info.errors != 0; -} diff --git a/usr/src/lib/libcmd/common/pids.c b/usr/src/lib/libcmd/common/pids.c deleted file mode 100644 index e88ac96ce3..0000000000 --- a/usr/src/lib/libcmd/common/pids.c +++ /dev/null @@ -1,120 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped - -#define FORMAT "PID=%(pid)d PPID=%(ppid)d PGID=%(pgid)d TID=%(tid)d SID=%(sid)d" - -static const char usage[] = -"[-?\n@(#)$Id: pids (AT&T Research) 2008-04-01 $\n]" -USAGE_LICENSE -"[+NAME?pids - list calling shell process ids]" -"[+DESCRIPTION?When invoked as a shell builtin, \bpids\b lists one or " - "more of the calling process ids determined by \bgetpid\b(2), " - "\bgetppid\b(2), \bgetpgrp\b(2), \btcgetpgrp\b(2) and \bgetsid\b(2). " - "Unknown or invalid ids have the value \b-1\b.]" -"[f:format?List the ids specified by \aformat\a. \aformat\a follows " - "\bprintf\b(3) conventions, except that \bsfio\b(3) inline ids are used " - "instead of arguments: " - "%[-+]][\awidth\a[.\aprecis\a[.\abase\a]]]]]](\aid\a)\achar\a. The " - "supported \aid\as are:]:[format:=" FORMAT "]" - "{" - "[+pid?The process id.]" - "[+pgid?The process group id.]" - "[+ppid?The parent process id.]" - "[+tid|tty?The controlling terminal id.]" - "[+sid?The session id.]" - "}" -"[+SEE ALSO?\bgetpid\b(2), \bgetppid\b(2), \bgetpgrp\b(2), " - "\btcgetpgrp\b(2), \bgetsid\b(2)]" -; - -#include <cmd.h> -#include <ast_tty.h> -#include <sfdisc.h> - -/* - * sfkeyprintf() lookup - * handle==0 for heading - */ - -static int -key(void* handle, Sffmt_t* fp, const char* arg, char** ps, Sflong_t* pn) -{ - register char* s; - int fd; - long tid; - - if (!(s = fp->t_str) || streq(s, "pid")) - *pn = getpid(); - else if (streq(s, "pgid")) - *pn = getpgid(0); - else if (streq(s, "ppid")) - *pn = getppid(); - else if (streq(s, "tid") || streq(s, "tty")) - { - for (fd = 0; fd < 3; fd++) - if ((tid = tcgetpgrp(fd)) >= 0) - break; - *pn = tid; - } - else if (streq(s, "sid")) - *pn = getsid(0); - else if (streq(s, "format")) - *ps = (char*)handle; - else - { - error(2, "%s: unknown format identifier", s); - return 0; - } - return 1; -} - -int -b_pids(int argc, char** argv, void* context) -{ - char* format = 0; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - for (;;) - { - switch (optget(argv, usage)) - { - case 'f': - format = opt_info.arg; - continue; - case '?': - error(ERROR_USAGE|4, "%s", opt_info.arg); - continue; - case ':': - error(2, "%s", opt_info.arg); - continue; - } - break; - } - argv += opt_info.index; - if (error_info.errors || *argv) - error(ERROR_USAGE|4, "%s", optusage(NiL)); - if (!format) - format = FORMAT; - sfkeyprintf(sfstdout, format, format, key, NiL); - sfprintf(sfstdout, "\n"); - return 0; -} diff --git a/usr/src/lib/libcmd/common/readlink.c b/usr/src/lib/libcmd/common/readlink.c deleted file mode 100644 index 4fc6fcc666..0000000000 --- a/usr/src/lib/libcmd/common/readlink.c +++ /dev/null @@ -1,111 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1982-2007 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped - -static const char usage[] = -"[-?\n@(#)$Id: readlink (AT&T Research) 2008-06-08 $\n]" -USAGE_LICENSE -"[+NAME?readlink - read the contents of a symbolic link]" -"[+DESCRIPTION?\breadlink\b returns the contents of the symbolic " - "link referred to by the path argument. Unless the \b-f\b " - "option is specified an error will be returned when the path " - "is not a symbolic link.]" -"[f:canonicalize?The returned value will be an absolute pathname that names " - "the same file, whose resolution does not involve \".\", \"..\", or " - "symbolic links, otherwise only the exact (relative) value will be returned.]" -"[n:no-newline?Supress newline at the end.]" -"[v:verbose?Verbose - print errors.]" -"[+SEE ALSO?\bbasename\b(1),\bdirname\b(2),\breadlink\b(2),\breadpath\n(2)]" -; - -#include <cmd.h> - -int -b_readlink(int argc, char** argv, void* context) -{ - register char* s; - register int i; - register char* m; - register char* x; - int canonicalize = 0, - nonewline = 0, - verbose = 0; - char buf[PATH_MAX+2]; - int len = 0; - char *filename, - *resolvedname = NULL; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - for (;;) - { - switch (optget(argv, usage)) - { - case 'f': - canonicalize = opt_info.num; - continue; - case 'n': - nonewline = opt_info.num; - continue; - case 'v': - verbose = opt_info.num; - continue; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - continue; - case ':': - error(2, "%s", opt_info.arg); - continue; - } - break; - } - argv += opt_info.index; - argc -= opt_info.index; - if(error_info.errors || argc != 1) - error(ERROR_usage(2),"%s", optusage(NiL)); - filename = argv[0]; - - if (canonicalize) - { - len = resolvepath(filename, buf, sizeof(buf)-2); - } - else - { - len = readlink(filename, buf, sizeof(buf)-2); - } - - if (len != -1) - resolvedname = buf; - - if (!resolvedname) - { - if (verbose) - error(ERROR_system(1),"%s: readlink failed", filename); - else - return 1; - } - - if (!nonewline) - resolvedname[len++] = '\n'; - - sfwrite(sfstdout, resolvedname, len); - - return 0; -} diff --git a/usr/src/lib/libcmd/common/rev.c b/usr/src/lib/libcmd/common/rev.c deleted file mode 100644 index 5f0a98f4c7..0000000000 --- a/usr/src/lib/libcmd/common/rev.c +++ /dev/null @@ -1,160 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * rev [-l] [file ...] - * - * reverse the characters or lines of one or more files - * - * David Korn - * AT&T Laboratories - * dgk@research.att.com - * - */ - -static const char usage[] = -"[-?\n@(#)$Id: rev (AT&T Research) 2007-11-29 $\n]" -USAGE_LICENSE -"[+NAME?rev - reverse the characters or lines of one or more files]" -"[+DESCRIPTION?\brev\b copies one or more files to standard output " - "reversing the order of characters on every line of the file " - "or reversing the order of lines of the file if \b-l\b is specified.]" -"[+?If no \afile\a is given, or if the \afile\a is \b-\b, \brev\b " - "copies from standard input starting at the current offset.]" -"[l:line?Reverse the lines of the file.]" - -"\n" -"\n[file ...]\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?All files copied successfully.]" - "[+>0?One or more files did not copy.]" -"}" -"[+SEE ALSO?\bcat\b(1), \btail\b(1)]" -; - -#include <cmd.h> -#include <rev.h> - -/* - * reverse the characters within a line - */ -static int rev_char(Sfio_t *in, Sfio_t *out) -{ - register int c; - register char *ep, *bp, *cp; - register wchar_t *wp, *xp; - register size_t n; - register size_t w; - if (mbwide()) - { - wp = 0; - w = 0; - while(cp = bp = sfgetr(in,'\n',0)) - { - ep = bp + (n=sfvalue(in)) - 1; - if (n > w) - { - w = roundof(n + 1, 1024); - if (!(wp = newof(wp, wchar_t, w, 0))) - { - error(ERROR_SYSTEM|2, "out of space"); - return 0; - } - } - xp = wp; - while (cp < ep) - *xp++ = mbchar(cp); - cp = bp; - while (xp > wp) - cp += mbconv(cp, *--xp); - *cp++ = '\n'; - if (sfwrite(out, bp, cp - bp) < 0) - return -1; - } - if (wp) - free(wp); - } - else - while(cp = bp = sfgetr(in,'\n',0)) - { - ep = bp + (n=sfvalue(in)) -1; - while(ep > bp) - { - c = *--ep; - *ep = *bp; - *bp++ = c; - } - if(sfwrite(out,cp,n)<0) - return(-1); - } - return(0); -} - -int -b_rev(int argc, register char** argv, void* context) -{ - register Sfio_t *fp; - register char *cp; - register int n, line=0; - NOT_USED(argc); - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - while (n = optget(argv, usage)) switch (n) - { - case 'l': - line=1; - break; - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - argv += opt_info.index; - if(error_info.errors) - error(ERROR_usage(2),"%s",optusage((char*)0)); - n=0; - if(cp = *argv) - argv++; - do - { - if(!cp || streq(cp,"-")) - fp = sfstdin; - else if(!(fp = sfopen((Sfio_t*)0,cp,"r"))) - { - error(ERROR_system(0),"%s: cannot open",cp); - n=1; - continue; - } - if(line) - line = rev_line(fp,sfstdout,sftell(fp)); - else - line = rev_char(fp,sfstdout); - if(fp!=sfstdin) - sfclose(fp); - if(line < 0) - error(ERROR_system(1),"write failed"); - } - while(cp= *argv++); - return(n); -} diff --git a/usr/src/lib/libcmd/common/rev.h b/usr/src/lib/libcmd/common/rev.h deleted file mode 100644 index 2d37ede916..0000000000 --- a/usr/src/lib/libcmd/common/rev.h +++ /dev/null @@ -1,34 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped - -/* - * rev common definitions - */ - -#ifndef _REVLIB_H -#define _REVLIB_H - -#define rev_line _cmd_revline - -extern int rev_line(Sfio_t*, Sfio_t*, off_t); - -#endif diff --git a/usr/src/lib/libcmd/common/revlib.c b/usr/src/lib/libcmd/common/revlib.c deleted file mode 100644 index 90b44a0128..0000000000 --- a/usr/src/lib/libcmd/common/revlib.c +++ /dev/null @@ -1,112 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * common support for tail and rev - */ - -#include <cmd.h> -#include <rev.h> - -#define BUFSIZE SF_BUFSIZE -#define rounddown(n,size) (((n)-1)&~((size)-1)) - -/* - * copy the lines starting at offset <start> from in <in> to <out> - * in reverse order - */ -int rev_line(Sfio_t *in, Sfio_t *out, off_t start) -{ - register char *cp, *cpold; - register int n, nleft=0; - char buff[BUFSIZE]; - off_t offset; - if(sfseek(in,(off_t)0,SEEK_CUR) < 0) - { - Sfio_t *tmp = sftmp(4*SF_BUFSIZE); - if(!tmp) - return(-1); - if(start>0 && sfmove(in, (Sfio_t*)0, start, -1) != start) - return(-1); - if(sfmove(in, tmp, SF_UNBOUND, -1) < 0 || !sfeof(in) || sferror(tmp)) - return(-1); - in = tmp; - start=0; - } - if((offset = sfseek(in,(off_t)0,SEEK_END)) <= start) - return(0); - offset = rounddown(offset,BUFSIZE); - while(1) - { - n = BUFSIZE; - if(offset < start) - { - n -= (start-offset); - offset = start; - } - sfseek(in, offset, SEEK_SET); - if((n=sfread(in, buff, n)) <=0) - break; - cp = buff+n; - n = *buff; - *buff = '\n'; - while(1) - { - cpold = cp; - if(nleft==0) - cp--; - if(cp==buff) - { - nleft= 1; - break; - } - while(*--cp != '\n'); - if(cp==buff && n!='\n') - { - *cp = n; - nleft += cpold-cp; - break; - } - else - cp++; - if(sfwrite(out,cp,cpold-cp) < 0) - return(-1); - if(nleft) - { - if(nleft==1) - sfputc(out,'\n'); - else if(sfmove(in,out,nleft,-1) != nleft) - return(-1); - nleft = 0; - } - } - if(offset <= start) - break; - offset -= BUFSIZE; - } - if(nleft) - { - sfseek(in, start, SEEK_SET); - if(sfmove(in,out,nleft,-1) != nleft) - return(-1); - } - return(0); -} diff --git a/usr/src/lib/libcmd/common/rm.c b/usr/src/lib/libcmd/common/rm.c deleted file mode 100644 index dfcb13f3fc..0000000000 --- a/usr/src/lib/libcmd/common/rm.c +++ /dev/null @@ -1,424 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * Glenn Fowler - * AT&T Research - * - * rm [-fir] [file ...] - */ - -static const char usage[] = -"[-?\n@(#)$Id: rm (AT&T Research) 2009-06-18 $\n]" -USAGE_LICENSE -"[+NAME?rm - remove files]" -"[+DESCRIPTION?\brm\b removes the named \afile\a arguments. By default it" -" does not remove directories. If a file is unwritable, the" -" standard input is a terminal, and the \b--force\b option is not" -" given, \brm\b prompts the user for whether to remove the file." -" An affirmative response (\by\b or \bY\b) removes the file, a quit" -" response (\bq\b or \bQ\b) causes \brm\b to exit immediately, and" -" all other responses skip the current file.]" - -"[c|F:clear|clobber?Clear the contents of each file before removing by" -" writing a 0 filled buffer the same size as the file, executing" -" \bfsync\b(2) and closing before attempting to remove. Implemented" -" only on systems that support \bfsync\b(2).]" -"[d:directory?\bremove\b(3) (or \bunlink\b(2)) directories rather than" -" \brmdir\b(2), and don't require that they be empty before removal." -" The caller requires sufficient privilege, not to mention a strong" -" constitution, to use this option. Even though the directory must" -" not be empty, \brm\b still attempts to empty it before removal.]" -"[f:force?Ignore nonexistent files and never prompt the user.]" -"[i:interactive|prompt?Prompt whether to remove each file." -" An affirmative response (\by\b or \bY\b) removes the file, a quit" -" response (\bq\b or \bQ\b) causes \brm\b to exit immediately, and" -" all other responses skip the current file.]" -"[r|R:recursive?Remove the contents of directories recursively.]" -"[u:unconditional?If \b--recursive\b and \b--force\b are also enabled then" -" the owner read, write and execute modes are enabled (if not already" -" enabled) for each directory before attempting to remove directory" -" contents.]" -"[v:verbose?Print the name of each file before removing it.]" - -"\n" -"\nfile ...\n" -"\n" - -"[+SEE ALSO?\bmv\b(1), \brmdir\b(2), \bunlink\b(2), \bremove\b(3)]" -; - -#include <cmd.h> -#include <ls.h> -#include <fts_fix.h> -#include <fs3d.h> - -#define RM_ENTRY 1 - -#define beenhere(f) (((f)->fts_number>>1)==(f)->fts_statp->st_nlink) -#define isempty(f) (!((f)->fts_number&RM_ENTRY)) -#define nonempty(f) ((f)->fts_parent->fts_number|=RM_ENTRY) -#define pathchunk(n) roundof(n,1024) -#define retry(f) ((f)->fts_number=((f)->fts_statp->st_nlink<<1)) - -typedef struct State_s /* program state */ -{ - void* context; /* builtin context */ - int clobber; /* clear out file data first */ - int directory; /* remove(dir) not rmdir(dir) */ - int force; /* force actions */ - int fs3d; /* 3d enabled */ - int interactive; /* prompt for approval */ - int recursive; /* remove subtrees too */ - int terminal; /* attached to terminal */ - int uid; /* caller uid */ - int unconditional; /* enable dir rwx on preorder */ - int verbose; /* display each file */ -#if _lib_fsync - char buf[SF_BUFSIZE];/* clobber buffer */ -#endif -} State_t; - -/* - * remove a single file - */ - -static int -rm(State_t* state, register FTSENT* ent) -{ - register char* path; - register int n; - int v; - struct stat st; - - if (ent->fts_info == FTS_NS || ent->fts_info == FTS_ERR || ent->fts_info == FTS_SLNONE) - { - if (!state->force) - error(2, "%s: not found", ent->fts_path); - } - else if (state->fs3d && iview(ent->fts_statp)) - fts_set(NiL, ent, FTS_SKIP); - else switch (ent->fts_info) - { - case FTS_DNR: - case FTS_DNX: - if (state->unconditional) - { - if (!chmod(ent->fts_name, (ent->fts_statp->st_mode & S_IPERM)|S_IRWXU)) - { - fts_set(NiL, ent, FTS_AGAIN); - break; - } - error_info.errors++; - } - else if (!state->force) - error(2, "%s: cannot %s directory", ent->fts_path, (ent->fts_info & FTS_NR) ? "read" : "search"); - else - error_info.errors++; - fts_set(NiL, ent, FTS_SKIP); - nonempty(ent); - break; - case FTS_D: - case FTS_DC: - path = ent->fts_name; - if (path[0] == '.' && (!path[1] || path[1] == '.' && !path[2]) && (ent->fts_level > 0 || path[1])) - { - fts_set(NiL, ent, FTS_SKIP); - if (!state->force) - error(2, "%s: cannot remove", ent->fts_path); - else - error_info.errors++; - break; - } - if (!state->recursive) - { - fts_set(NiL, ent, FTS_SKIP); - error(2, "%s: directory", ent->fts_path); - break; - } - if (!beenhere(ent)) - { - if (state->unconditional && (ent->fts_statp->st_mode ^ S_IRWXU)) - chmod(path, (ent->fts_statp->st_mode & S_IPERM)|S_IRWXU); - if (ent->fts_level > 0) - { - char* s; - - if (ent->fts_accpath == ent->fts_name || !(s = strrchr(ent->fts_accpath, '/'))) - v = !stat(".", &st); - else - { - path = ent->fts_accpath; - *s = 0; - v = !stat(path, &st); - *s = '/'; - } - if (v) - v = st.st_nlink <= 2 || st.st_ino == ent->fts_parent->fts_statp->st_ino && st.st_dev == ent->fts_parent->fts_statp->st_dev || strchr(astconf("PATH_ATTRIBUTES", path, NiL), 'l'); - } - else - v = 1; - if (v) - { - if (state->interactive) - { - if ((v = astquery(-1, "remove directory %s? ", ent->fts_path)) < 0 || sh_checksig(state->context)) - return -1; - if (v > 0) - { - fts_set(NiL, ent, FTS_SKIP); - nonempty(ent); - } - } - if (ent->fts_info == FTS_D) - break; - } - else - { - ent->fts_info = FTS_DC; - error(1, "%s: hard link to directory", ent->fts_path); - } - } - else if (ent->fts_info == FTS_D) - break; - /*FALLTHROUGH*/ - case FTS_DP: - if (isempty(ent) || state->directory) - { - path = ent->fts_name; - if (path[0] != '.' || path[1]) - { - path = ent->fts_accpath; - if (state->verbose) - sfputr(sfstdout, ent->fts_path, '\n'); - if ((ent->fts_info == FTS_DC || state->directory) ? remove(path) : rmdir(path)) - switch (errno) - { - case ENOENT: - break; - case EEXIST: -#if defined(ENOTEMPTY) && (ENOTEMPTY) != (EEXIST) - case ENOTEMPTY: -#endif - if (ent->fts_info == FTS_DP && !beenhere(ent)) - { - retry(ent); - fts_set(NiL, ent, FTS_AGAIN); - break; - } - /*FALLTHROUGH*/ - default: - nonempty(ent); - if (!state->force) - error(ERROR_SYSTEM|2, "%s: directory not removed", ent->fts_path); - else - error_info.errors++; - break; - } - } - else if (!state->force) - error(2, "%s: cannot remove", ent->fts_path); - else - error_info.errors++; - } - else - { - nonempty(ent); - if (!state->force) - error(2, "%s: directory not removed", ent->fts_path); - else - error_info.errors++; - } - break; - default: - path = ent->fts_accpath; - if (state->verbose) - sfputr(sfstdout, ent->fts_path, '\n'); - if (state->interactive) - { - if ((v = astquery(-1, "remove %s? ", ent->fts_path)) < 0 || sh_checksig(state->context)) - return -1; - if (v > 0) - { - nonempty(ent); - break; - } - } - else if (!state->force && state->terminal && S_ISREG(ent->fts_statp->st_mode)) - { - if ((n = open(path, O_RDWR)) < 0) - { - if ( -#ifdef ENOENT - errno != ENOENT && -#endif -#ifdef EROFS - errno != EROFS && -#endif - (v = astquery(-1, "override protection %s for %s? ", -#ifdef ETXTBSY - errno == ETXTBSY ? "``running program''" : -#endif - ent->fts_statp->st_uid != state->uid ? "``not owner''" : - fmtmode(ent->fts_statp->st_mode & S_IPERM, 0) + 1, ent->fts_path)) < 0 || - sh_checksig(state->context)) - return -1; - if (v > 0) - { - nonempty(ent); - break; - } - } - else - close(n); - } -#if _lib_fsync - if (state->clobber && S_ISREG(ent->fts_statp->st_mode) && ent->fts_statp->st_size > 0) - { - if ((n = open(path, O_WRONLY)) < 0) - error(ERROR_SYSTEM|2, "%s: cannot clear data", ent->fts_path); - else - { - off_t c = ent->fts_statp->st_size; - - for (;;) - { - if (write(n, state->buf, sizeof(state->buf)) != sizeof(state->buf)) - { - error(ERROR_SYSTEM|2, "%s: data clear error", ent->fts_path); - break; - } - if (c <= sizeof(state->buf)) - break; - c -= sizeof(state->buf); - } - fsync(n); - close(n); - } - } -#endif - if (remove(path)) - { - nonempty(ent); - switch (errno) - { - case ENOENT: - break; - default: - if (!state->force || state->interactive) - error(ERROR_SYSTEM|2, "%s: not removed", ent->fts_path); - else - error_info.errors++; - break; - } - } - break; - } - return 0; -} - -int -b_rm(int argc, register char** argv, void* context) -{ - State_t state; - FTS* fts; - FTSENT* ent; - int set3d; - - cmdinit(argc, argv, context, ERROR_CATALOG, ERROR_NOTIFY); - memset(&state, 0, sizeof(state)); - state.context = context; - state.fs3d = fs3d(FS3D_TEST); - state.terminal = isatty(0); - for (;;) - { - switch (optget(argv, usage)) - { - case 'd': - state.directory = 1; - continue; - case 'f': - state.force = 1; - state.interactive = 0; - continue; - case 'i': - state.interactive = 1; - state.force = 0; - continue; - case 'r': - case 'R': - state.recursive = 1; - continue; - case 'F': -#if _lib_fsync - state.clobber = 1; -#else - error(1, "%s not implemented on this system", opt_info.name); -#endif - continue; - case 'u': - state.unconditional = 1; - continue; - case 'v': - state.verbose = 1; - continue; - case '?': - error(ERROR_USAGE|4, "%s", opt_info.arg); - continue; - case ':': - error(2, "%s", opt_info.arg); - continue; - } - break; - } - argv += opt_info.index; - if (*argv && streq(*argv, "-") && !streq(*(argv - 1), "--")) - argv++; - if (error_info.errors || !*argv) - error(ERROR_USAGE|4, "%s", optusage(NiL)); - - /* - * do it - */ - - if (state.interactive) - state.verbose = 0; - state.uid = geteuid(); - state.unconditional = state.unconditional && state.recursive && state.force; - if (state.recursive && state.fs3d) - { - set3d = state.fs3d; - state.fs3d = 0; - fs3d(0); - } - else - set3d = 0; - if (fts = fts_open(argv, FTS_PHYSICAL, NiL)) - { - while (!sh_checksig(context) && (ent = fts_read(fts)) && !rm(&state, ent)); - fts_close(fts); - } - else if (!state.force) - error(ERROR_SYSTEM|2, "%s: cannot remove", argv[0]); - if (set3d) - fs3d(set3d); - return error_info.errors != 0; -} diff --git a/usr/src/lib/libcmd/common/rmdir.c b/usr/src/lib/libcmd/common/rmdir.c deleted file mode 100644 index b57eebb60b..0000000000 --- a/usr/src/lib/libcmd/common/rmdir.c +++ /dev/null @@ -1,122 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * Glenn Fowler - * AT&T Research - * - * rmdir - */ - -static const char usage[] = -"[-?\n@(#)$Id: rmdir (AT&T Research) 2006-08-24 $\n]" -USAGE_LICENSE -"[+NAME?rmdir - remove empty directories]" -"[+DESCRIPTION?\brmdir\b deletes each given directory. The directory " - "must be empty; containing no entries other than \b.\b or \b..\b. " - "If a directory and a subdirectory of that directory are specified " - "as operands, the subdirectory must be specified before the parent " - "so that the parent directory will be empty when \brmdir\b attempts " - "to remove it.]" -"[e:ignore-fail-on-non-empty?Ignore each non-empty directory failure.]" -"[p:parents?Remove each explicit \adirectory\a argument directory that " - "becomes empty after its child directories are removed.]" -"[s:suppress?Suppress the message printed on the standard error when " - "\b-p\b is in effect.]" -"\n" -"\ndirectory ...\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?All directories deleted successfully.]" - "[+>0?One or more directories could not be deleted.]" -"}" -"[+SEE ALSO?\bmkdir\b(1), \brm\b(1), \brmdir\b(2), \bunlink\b(2)]" -; - -#include <cmd.h> - -int -b_rmdir(int argc, char** argv, void* context) -{ - register char* dir; - register char* end; - register int n; - int eflag = 0; - int pflag = 0; - int sflag = 0; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - while (n = optget(argv, usage)) switch (n) - { - case 'e': - eflag = 1; - break; - case 'p': - pflag = 1; - break; - case 's': - sflag = 1; - break; - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - argv += opt_info.index; - if (error_info.errors || !*argv) - error(ERROR_usage(2), "%s", optusage(NiL)); - if (!pflag) - sflag = 0; - while (dir = *argv++) - { - end = dir; - if (pflag) end += strlen(dir); - n = 0; - for (;;) - { - if (rmdir(dir) < 0) - { - if (!eflag || errno != EEXIST -#ifdef ENOTEMPTY - && errno != ENOTEMPTY -#endif - ) - { - if (sflag) - error_info.errors++; - else - error(ERROR_system(0), "%s: cannot remove", dir); - } - break; - } - if (n) *end = '/'; - else n = 1; - do if (end <= dir) goto next; while (*--end != '/'); - do if (end <= dir) goto next; while (*(end - 1) == '/' && end--); - *end = 0; - } - next: ; - } - return(error_info.errors != 0); -} - diff --git a/usr/src/lib/libcmd/common/stty.c b/usr/src/lib/libcmd/common/stty.c deleted file mode 100644 index 1a696a78b4..0000000000 --- a/usr/src/lib/libcmd/common/stty.c +++ /dev/null @@ -1,965 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * stty.c - * Written by David Korn - * Tue Apr 4 10:46:00 EDT 1995 - */ - -static const char usage[] = -"[-?@(#)$Id: stty (AT&T Research) 2008-11-10 $\n]" -USAGE_LICENSE -"[+NAME?stty - set or get terminal modes]" -"[+DESCRIPTION?\bstty\b sets certain terminal I/O modes for the device " - "that is the current standard input; without arguments, it writes " - "the settings of certain modes to standard output.]" - -"[a:all?Writes to standard output all of the mode settings.]" -"[g:save?Writes the current settings to standard output in a form that can " - "be used as an argument to another \bstty\b command. The \brows\b " - "and \bcolumns\b values are not included.]" -"[t:terminal-group?Print the terminal group id of the device, -1 if unknown.]" -"\n" -"\n[mode ...]\n" -"\n" -"[+EXTENDED DESCRIPTION?Modes are specified either as a single name or " - "as a name followed by a value. As indicated below, many of the " - "mode names can be preceded by a \b-\b to negate its meaning. " - "Modes are listed by group corresponding to field in the " - "\btermios\b structure defined in \b<termios.h>\b. Modes " - "in the last group are implemented using options in the previous " - "groups. Note that many combinations of modes make no sense, but " - "no sanity checking is performed. The modes are selected from the " - "following:]{\fabc\f}" - -"[+EXIT STATUS?]{" - "[+0?All modes reported or set successfully.]" - "[+>0?Standard input not a terminaol or one or more modes failed.]" -"}" -"[+SEE ALSO?\btegetattr\b(2), \btcsetattr\b(2), \bioctl\b(2)]" -; - -#include <cmd.h> -#include <ccode.h> -#include <ctype.h> -#include <ast_tty.h> -#if _sys_ioctl -#include <sys/ioctl.h> -#endif - -#define C(x) ERROR_catalog(x) - -#ifndef _POSIX_VDISABLE -# define _POSIX_VDISABLE 0 -#endif - -#ifndef NCCS -# ifdef NCC -# define NCCS NCC -# else -# define NCCS elementsof(((struct termio*)0)->c_cc) -# endif -#endif - -/* command options */ -#define A_FLAG 1 -#define G_FLAG 2 -#define T_FLAG 4 - -/* termios fields */ -#define C_FLAG 1 -#define C_LINE 2 -#define C_SPEED 3 -#define I_FLAG 4 -#define O_FLAG 5 -#define L_FLAG 6 -#define T_CHAR 7 -#define W_SIZE 8 - -#define BIT 1 -#define BITS 2 -#define NUM 3 -#define CHAR 4 -#define SPEED 5 -#define SIZE 6 -#define MIXED 7 -#define SANE 8 -#define COOKED 9 -#define CASE 10 -#define TABS 11 -#define WIND 12 - -#undef SS /* who co-opted this namespace? */ - -#define IG 0x0001 /* ignore display */ -#define NL 0x0002 /* entry ends line of display */ -#define SS 0x0004 /* set in sane mode */ -#define US 0x0010 /* unset in sane mode */ - -typedef struct tty_s -{ - const char name[8]; - unsigned char type; - unsigned char field; - short flags; - unsigned long mask; - unsigned long val; - const char description[76]; -} Tty_t; - -static const Tty_t Ttable[] = -{ -#ifdef CBAUD -{ "ispeed", NUM, C_SPEED,0, CBAUD, 0, C("\an\a is the input baud rate") }, -{ "ospeed", NUM, C_SPEED,0, CBAUD, 0, C("\an\a is the output baud rate") }, -{ "speed", NUM, C_SPEED,IG, CBAUD }, -#endif -{ "0", SPEED, C_FLAG, 0, B0 }, -{ "50", SPEED, C_FLAG, 0, B50 }, -{ "75", SPEED, C_FLAG, 0, B75 }, -{ "110", SPEED, C_FLAG, 0, B110 }, -{ "134", SPEED, C_FLAG, 0, B134 }, -{ "150", SPEED, C_FLAG, 0, B150 }, -{ "200", SPEED, C_FLAG, 0, B200 }, -{ "300", SPEED, C_FLAG, 0, B300 }, -{ "600", SPEED, C_FLAG, 0, B600 }, -{ "1200", SPEED, C_FLAG, 0, B1200 }, -{ "1800", SPEED, C_FLAG, 0, B1800 }, -{ "2400", SPEED, C_FLAG, 0, B2400 }, -{ "4800", SPEED, C_FLAG, 0, B4800 }, -{ "9600", SPEED, C_FLAG, 0, B9600 }, -{ "19200", SPEED, C_FLAG, 0, B19200 }, -{ "38400", SPEED, C_FLAG, 0, B38400 }, - -#ifdef TIOCSWINSZ -{ "rows", WIND, W_SIZE, IG, 0, 24, C("\an\a is the number of lines for display") }, -{ "cols", WIND, W_SIZE, IG, 1, 80, C("\an\a is the number of columns for display") }, -{ "columns", WIND, W_SIZE, IG, 1, 80, C("Same as \bcols\b") }, -#endif -{ "intr", CHAR, T_CHAR, SS, VINTR, 'C', C("Send an interrupt signal") }, -{ "quit", CHAR, T_CHAR, SS, VQUIT, '|', C("Send a quit signal") }, -{ "erase", CHAR, T_CHAR, SS, VERASE, 'H', C("Erase the last character entered") }, -{ "kill", CHAR, T_CHAR, NL|SS, VKILL, 'U', C("Erase the current line") }, -{ "eof", CHAR, T_CHAR, SS, VEOF, 'D', C("Send an end of file") }, -#ifdef VEOL2 -{ "eol2", CHAR, T_CHAR, US, VEOL2, _POSIX_VDISABLE, C("Alternate character to end the line") }, -#endif /* VEOL2 */ -#ifdef VSWTCH -{ "swtch", CHAR, T_CHAR, US, VSWTCH, _POSIX_VDISABLE, C("Switch to a different shell layer") }, -#endif /* VSWTCH */ -{ "eol", CHAR, T_CHAR, NL|US, VEOL, _POSIX_VDISABLE, C("End the line") }, -#ifdef VSTART -{ "start", CHAR, T_CHAR, SS, VSTART, 'Q', C("Restart the output after stopping it") }, -#endif /* VSTART */ -#ifdef VSTOP -{ "stop", CHAR, T_CHAR, SS, VSTOP, 'S', C("Stop the output") }, -#endif /* VSTOP */ -#ifdef VDSUSP -{ "dsusp", CHAR, T_CHAR, SS, VDSUSP, 'Y', C("Send a terminal stop signal after flushing the input") }, -#endif /* VDSUSP */ -#ifdef VSUSP -{ "susp", CHAR, T_CHAR, NL|SS, VSUSP, 'Z', C("Send a terminal stop signal") }, -#endif /* VSUSP */ -#ifdef VREPRINT -{ "rprnt", CHAR, T_CHAR, SS, VREPRINT, 'R', C("Redraw the current line") }, -#endif /* VREPRINT */ -#ifdef VDISCARD -{ "flush", CHAR, T_CHAR, SS, VDISCARD, 'O', C("Discard output") }, -#endif /* VDISCARD */ -#ifdef VWERASE -{ "werase", CHAR, T_CHAR, SS, VWERASE, 'W', C("Erase the last word entered") }, -#endif /* VWERASE */ -#ifdef VLNEXT -{ "lnext", CHAR, T_CHAR, NL|SS, VLNEXT, 'V', C("Enter the next input character literally") }, -#endif /* VLNEXT */ - -#if _mem_c_line_termios -{ "line", NUM, C_LINE, 0, 0, 0, C("Line discipline number") }, -#endif -{ "min", NUM, T_CHAR, 0, VMIN, 0, C("Mininmum number of characters to read in raw mode") }, -{ "time", NUM, T_CHAR, 0, VTIME, 0, C("Number of .1 second intervals with raw mode") }, - -{ "parenb", BIT, C_FLAG, 0, PARENB, PARENB, C("Enable (disable) parity generation and detection") }, -{ "parodd", BIT, C_FLAG, 0, PARODD, PARODD, C("Use odd (even) parity") }, -#ifdef PAREXT -{ "parext", BIT, C_FLAG, 0, PAREXT, PAREXT }, -#endif /* PAREXT */ -#ifdef CREAD -{ "cread", BIT, C_FLAG, SS, CREAD, CREAD, C("Enable (disable) input") }, -#endif /* CREAD */ -{ "cs5", SIZE, C_FLAG, 0, CSIZE, CS5 , C("Char size 5") }, -{ "cs6", SIZE, C_FLAG, 0, CSIZE, CS6 , C("Char size 6") }, -{ "cs7", SIZE, C_FLAG, 0, CSIZE, CS7 , C("Char size 7") }, -{ "cs8", SIZE, C_FLAG, 0, CSIZE, CS8 , C("Char size 8") }, -{ "hupcl", BIT, C_FLAG, 0, HUPCL, HUPCL, C("Hangup (do not hangup) connection on last close") }, -{ "hup", BIT, C_FLAG, IG, HUPCL, HUPCL, C("Same as \bhupcl\b") }, -{ "cstopb", BIT, C_FLAG, 0, CSTOPB, CSTOPB, C("Use two (one) stop bits") }, -#ifdef CRTSCTS -{ "crtscts", BIT, C_FLAG, 0, CRTSCTS, CRTSCTS, C("Enable (disable) RTS/CTS handshaking") }, -#endif /* CRTSCTS */ -{ "clocal", BIT, C_FLAG, NL, CLOCAL, CLOCAL, C("Disable (enable) modem control signals") }, - -{ "ignbrk", BIT, I_FLAG, US, IGNBRK, IGNBRK, C("Ignore (do not ignore) break characters") }, -{ "brkint", BIT, I_FLAG, SS, BRKINT, BRKINT, C("Generate (do not generate) INTR signal on break") }, -{ "ignpar", BIT, I_FLAG, 0, IGNPAR, IGNPAR, C("Ignore (do not ignore) characters with parity errors") }, -{ "parmrk", BIT, I_FLAG, 0, PARMRK, PARMRK, C("Mark (do not mark) parity errors") }, -{ "inpck", BIT, I_FLAG, 0, INPCK, INPCK, C("Enable (disable) input parity checking") }, -{ "istrip", BIT, I_FLAG, 0, ISTRIP, ISTRIP, C("Clear (do not clear) high bit of input characters") }, -{ "inlcr", BIT, I_FLAG, US, INLCR, INLCR, C("Translate (do not translate) carriage return to newline") }, -{ "igncr", BIT, I_FLAG, US, IGNCR, IGNCR, C("Ignore (do not ignore) carriage return") }, -#ifdef IUCLC -{ "iuclc", BIT, I_FLAG, US, IUCLC, IUCLC, C("Map (do not map) upper-case to lower case") }, -#endif /* IUCLC */ -{ "ixon", BIT, I_FLAG, 0, IXON, IXON, C("Enable (disable) XON/XOFF flow control. \bstop\b character stops output") }, -#ifdef IXANY -{ "ixany", BIT, I_FLAG, US, IXANY, IXANY, C("Any character (only start character) can restart output.") }, -{ "decctlq", BIT, I_FLAG, IG, IXANY, 0, C("Same as \b-ixany\b") }, -#endif /* IXANY */ -{ "ixoff", BIT, I_FLAG, US, IXOFF, IXOFF, C("Disable (enable) XON/XOFF flow control") }, -#ifdef IMAXBEL -{ "imaxbel", BIT, I_FLAG, SS, IMAXBEL, IMAXBEL, C("Beep (do not beep) if a character arrives with full input buffer") }, -#endif /* IMAXBEL */ -{ "icrnl", BIT, I_FLAG, NL|SS, ICRNL, ICRNL, C("Translate (do not translate) carriage return to newline") }, - -{ "isig", BIT, L_FLAG, SS, ISIG, ISIG, C("Enable (disable) \bintr\b, \bquit\b, and \bsusp\b special characters") }, -{ "icanon", BIT, L_FLAG, SS, ICANON, ICANON, C("Enable (disable) \berase\b, \bkill\b, \bwerase\b, and \brprnt\b special characters") }, -{ "icannon", BIT, L_FLAG, SS, ICANON, ICANON }, -#ifdef IEXTEN -{ "iexten", BIT, L_FLAG, SS, IEXTEN, IEXTEN, C("Enable (disable) non-POSIX special characters") }, -#endif /* IEXTEN */ -{ "echo", BIT, L_FLAG, SS, ECHO|ECHONL, ECHO|ECHONL, C("Echo (do not echo) input characters") }, -{ "echoe", BIT, L_FLAG, SS, ECHOE, ECHOE, C("Echo (do not echo) erase characters as backspace-space-backspace") }, -{ "echok", BIT, L_FLAG, SS, ECHOK, ECHOK, C("Echo (do not echo) a newline after a kill character") }, -#ifdef ECHOKE -{ "echoke", BIT, L_FLAG, SS, ECHOKE, ECHOKE, C("Echo (do not echo) a newline after a kill character") }, -#endif -{ "lfkc", BIT, L_FLAG, IG, ECHOK, ECHOK, C("Same as \bechok\b (\b-echok\b); obsolete") }, -{ "echonl", BIT, L_FLAG, SS, ECHONL, ECHONL,"Echo (do not echo) newline even if not echoing other character" }, -#ifdef ECHOCTL -{ "echoctl", BIT, L_FLAG, SS, ECHOCTL, ECHOCTL, C("Echo (do not echo) control characters as \b^\b\ac\a") }, -#else -#define ECHOCTL 0 -#endif /* ECHOCTL */ -#ifdef ECHOPRT -{ "echoprt", BIT, L_FLAG, US, ECHOPRT, ECHOPRT, C("Echo (do not echo) erased characters backward, between '\\' and '/'") }, -#else -#define ECHOPRT 0 -#endif /* ECHOPRT */ -#ifdef XCASE -{ "xcase", BIT, L_FLAG, US, XCASE, XCASE, C("Enable (disable) \bicanon\b uppercase as lowercase with '\\' prefix") }, -#endif /* XCASE */ -#ifdef DEFECHO -{ "defecho", BIT, L_FLAG, 0, DEFECHO, DEFECHO }, -#endif /* DEFECHO */ -#ifdef FLUSHO -{ "flusho", BIT, L_FLAG, 0, FLUSHO, FLUSHO, C("Discard (do not discard) written data. Cleared by subsequent input") }, -#endif /* FLUSHO */ -#ifdef PENDIN -{ "pendin", BIT, L_FLAG, 0, PENDIN, PENDIN, C("Redisplay pending input at next read and then automatically clear \bpendin\b") }, -#endif /* PENDIN */ -{ "noflsh", BIT, L_FLAG, US, NOFLSH, NOFLSH, C("Disable (enable) flushing after \bintr\b and \bquit\b special characters") }, -#ifdef TOSTOP -{ "tostop", BIT, L_FLAG, NL|US, TOSTOP, TOSTOP, C("Stop (do not stop) background jobs that try to write to the terminal") }, -#endif /* TOSTOP */ -#ifdef OLCUC -{ "olcuc", BIT, O_FLAG, US, OLCUC, OLCUC, C("Translate (do not translate) lowercase characters to uppercase") }, -#endif /* OLCUC */ -#ifdef ONLCR -{ "onlcr", BIT, O_FLAG, SS, ONLCR, ONLCR, C("Translate (do not translate) newline to carriage return-newline") }, -#endif /* ONLCR */ -#ifdef ONLRET -{ "onlret", BIT, O_FLAG, US, ONLRET, ONLRET, C("Newline performs (does not perform) a carriage return") }, -#endif /* ONLRET */ -#ifdef OCRNL -{ "ocrnl", BIT, O_FLAG, US, OCRNL, OCRNL, C("Translate (do not translate) carriage return to newline") }, -#endif /* OCRNL */ -#ifdef ONOCR -{ "onocr", BIT, O_FLAG, US, ONOCR, ONOCR, C("Do not (do) print carriage returns in the first column") }, -#endif /* ONOCR */ -#ifdef OFILL -{ "ofill", BIT, O_FLAG, US, OFILL, OFILL, C("Use fill characters (use timing) for delays") }, -#endif /* OFILL */ -#ifdef OFDEL -{ "ofdel", BIT, O_FLAG, US, OFDEL, OFDEL, C("Use DEL (NUL) as fill characters for delays") }, -#endif /* OFDEL */ -{ "opost", BIT, O_FLAG, SS, OPOST, OPOST, C(" Postprocess (do not postprocess) output") }, -#ifdef CRDLY -{ "cr0", BITS, O_FLAG, IG|SS, CRDLY, CR0 }, -{ "cr1", BITS, O_FLAG, US, CRDLY, CR1 }, -{ "cr2", BITS, O_FLAG, US, CRDLY, CR2 }, -{ "cr3", BITS, O_FLAG, US, CRDLY, CR3 }, -#endif -#ifdef NLDLY -{ "nl0", BITS, O_FLAG, IG|US, NLDLY, NL0 }, -{ "nl1", BITS, O_FLAG, US, NLDLY, NL1 }, -#endif -#ifdef TABDLY -{ "tabs", TABS, O_FLAG, IG, TABDLY, TAB3, C("Preserve (expand to spaces) tabs") }, -#ifdef TAB0 -{ "tab0", BITS, O_FLAG, IG|SS, TABDLY, TAB0 }, -#endif -#ifdef TAB1 -{ "tab1", BITS, O_FLAG, US, TABDLY, TAB1 }, -#endif -#ifdef TAB2 -{ "tab2", BITS, O_FLAG, US, TABDLY, TAB2 }, -#endif -{ "tab3", BITS, O_FLAG, US, TABDLY, TAB3 }, -#endif -#ifdef BSDLY -{ "bs0", BITS, O_FLAG, IG|SS, BSDLY, BS0 }, -{ "bs1", BITS, O_FLAG, US, BSDLY, BS1 }, -#endif -#ifdef VTDLY -{ "vt0", BITS, O_FLAG, IG|SS, VTDLY, VT0 }, -{ "vt1", BITS, O_FLAG, US, VTDLY, VT1 }, -#endif -#ifdef FFDLY -{ "ff0", BITS, O_FLAG, IG|SS, FFDLY, FF0 }, -{ "ff1", BITS, O_FLAG, US, FFDLY, FF1 }, -#endif -{ "", MIXED, O_FLAG, NL|IG }, - -{ "evenp", MIXED, C_FLAG, IG, PARENB, 0, C("Same as \bparenb -parodd cs7\b") }, -{ "oddp", MIXED, C_FLAG, IG, PARODD, 0, C("Same as \bparenb parodd cs7\b") }, -{ "parity", MIXED, C_FLAG, IG, 0, 0, C("Same as parenb \b-parodd cs7\b") }, -{ "ek", MIXED, C_FLAG, IG, 0, 0, C("Reset the \berase\b and \bkill\b special characters to their default values") }, -{ "sane", SANE, C_FLAG, IG, 0, 0, C("Reset all modes to some reasonable values") }, -{ "cooked", COOKED, C_FLAG, IG, 0, 0, C("Disable raw input and output") }, -{ "raw", COOKED, C_FLAG, IG, 0, 0, C("Enable raw input and output") }, -{ "lcase", CASE, C_FLAG, IG, 0 , 0, C("Set \bxcase\b, \biuclc\b, and \bolcuc\b") }, -{ "LCASE", CASE, C_FLAG, IG, 0 , 0, C("Same as \blcase\b") } -}; - -#if CC_NATIVE == CC_ASCII -#define cntl(x) (((x)=='?')?0177:((x)&037)) -#else -#define cntl(x) (((x)=='?')?ccmapc(0177,CC_ASCII,CC_NATIVE):ccmapc(ccmapc(x,CC_NATIVE,CC_ASCII)&037,CC_ASCII,CC_NATIVE)) -#endif - -static void sane(register struct termios *sp) -{ - register const Tty_t* tp; - - for (tp = Ttable; tp < &Ttable[elementsof(Ttable)]; tp++) - if (tp->flags & (SS|US)) - switch (tp->type) - { - case BIT: - case BITS: - switch (tp->field) - { - case C_FLAG: - if (tp->flags & SS) - sp->c_cflag |= tp->mask; - else - sp->c_cflag &= ~tp->mask; - break; - case I_FLAG: - if (tp->flags & SS) - sp->c_iflag |= tp->mask; - else - sp->c_iflag &= ~tp->mask; - break; - case O_FLAG: - if (tp->flags & SS) - sp->c_oflag |= tp->mask; - else - sp->c_oflag &= ~tp->mask; - break; - case L_FLAG: - if (tp->flags & SS) - sp->c_lflag |= tp->mask; - else - sp->c_lflag &= ~tp->mask; - break; - } - break; - case CHAR: - sp->c_cc[tp->mask] = cntl(tp->val); - break; - } -} - -static int gin(char *arg,struct termios *sp) -{ - register int i; - if(*arg++ != ':') - return(0); - sp->c_iflag = strtol(arg,&arg,16); - if(*arg++ != ':') - return(0); - sp->c_oflag = strtol(arg,&arg,16); - if(*arg++ != ':') - return(0); - sp->c_cflag = strtol(arg,&arg,16); - if(*arg++ != ':') - return(0); - sp->c_lflag = strtol(arg,&arg,16); - if(*arg++ != ':') - return(0); - for(i=0;i< NCCS; i++) - { - sp->c_cc[i] = strtol(arg,&arg,16); - if(*arg++ != ':') - return(0); - } -#if _mem_c_line_termios - sp->c_line = -#endif - strtol(arg,&arg,16); - if(*arg++ != ':') - return(0); - i = strtol(arg,&arg,16); - if(*arg++ != ':') - return(0); - cfsetispeed(sp, i); - i = strtol(arg,&arg,16); - if(*arg++ != ':') - return(0); - cfsetospeed(sp, i); - if(*arg) - return(0); - return(1); -} - -static void gout(struct termios *sp) -{ - register int i; - sfprintf(sfstdout,":%x",sp->c_iflag); - sfprintf(sfstdout,":%x",sp->c_oflag); - sfprintf(sfstdout,":%x",sp->c_cflag); - sfprintf(sfstdout,":%x",sp->c_lflag); - for(i=0;i< NCCS; i++) - sfprintf(sfstdout,":%x",sp->c_cc[i]); -#if _mem_c_line_termios - sfprintf(sfstdout,":%x", sp->c_line); -#else - sfprintf(sfstdout,":%x", 0); -#endif - sfprintf(sfstdout,":%x",cfgetispeed(sp)); - sfprintf(sfstdout,":%x",cfgetospeed(sp)); - sfprintf(sfstdout,":\n"); -} - -static void output(struct termios *sp, int flags) -{ - const Tty_t *tp; - struct termios tty; - register int delim = ' '; - register int i,off,off2; - char schar[2]; - unsigned int ispeed = cfgetispeed(sp); - unsigned int ospeed = cfgetospeed(sp); - if(flags&G_FLAG) - { - gout(sp); - return; - } - tty = *sp; - sane(&tty); - for(i=0; i < elementsof(Ttable); i++) - { - tp= &Ttable[i]; - if(tp->flags&IG) - { - if(tp->flags&NL) - sfputc(sfstdout,'\n'); - continue; - } - switch(tp->type) - { - case BIT: - case BITS: - off = off2 = 1; - switch(tp->field) - { - case C_FLAG: - if(sp->c_cflag&tp->mask) - off = 0; - if(tty.c_cflag&tp->mask) - off2 = 0; - break; - case I_FLAG: - if(sp->c_iflag&tp->mask) - off = 0; - if(tty.c_iflag&tp->mask) - off2 = 0; - break; - case O_FLAG: - if((sp->c_oflag&tp->mask)==tp->val) - off = 0; - if(tty.c_oflag&tp->mask) - off2 = 0; - break; - case L_FLAG: - if(sp->c_lflag&tp->mask) - off = 0; - if(tty.c_lflag&tp->mask) - off2 = 0; - } - if(tp->flags&NL) - delim = '\n'; - if(!flags && off==off2) - continue; - if(!off) - sfprintf(sfstdout,"%s%c",tp->name,delim); - else if(tp->type==BIT) - sfprintf(sfstdout,"-%s%c",tp->name,delim); - delim = ' '; - break; - - case CHAR: - off = sp->c_cc[tp->mask]; - if(tp->flags&NL) - delim = '\n'; - if(!flags && off==(unsigned char)tty.c_cc[tp->mask]) - continue; - if(off==_POSIX_VDISABLE) - sfprintf(sfstdout,"%s = <undef>;%c",tp->name,delim); - else if(isprint(off&0xff)) - sfprintf(sfstdout,"%s = %c;%c",tp->name,off,delim); - else -#if CC_NATIVE == CC_ASCII - sfprintf(sfstdout,"%s = ^%c;%c",tp->name,off==0177?'?':(off^0100),delim); -#else - { - off = ccmapc(off, CC_NATIVE, CC_ASCII); - sfprintf(sfstdout,"%s = ^%c;%c",tp->name,off==0177?'?':ccmapc(off^0100,CC_ASCII,CC_NATIVE),delim); - } -#endif - delim = ' '; - break; - case SIZE: - if((sp->c_cflag&CSIZE)!=tp->mask) - continue; - if(flags || (sp->c_cflag&CSIZE) != (tty.c_cflag&CSIZE)) - sfprintf(sfstdout,"%s ",tp->name); - break; - case SPEED: - if(tp->mask==ispeed) - { - if(ispeed!=ospeed) - schar[0]='i'; - else - schar[0]=0; - } - else if(tp->mask==ospeed) - schar[0]='o'; - else - continue; - schar[1] = 0; -#ifdef TIOCSWINSZ - { - struct winsize win; - off = ioctl(0,TIOCGWINSZ,&win); - if(off>=0) - sfprintf(sfstdout,"%sspeed %s baud; rows %d; columns %d;\n",schar,tp->name,win.ws_row,win.ws_col); - } - if(off<0) -#endif - sfprintf(sfstdout,"%sspeed %s baud;\n",schar,tp->name); - } - } - if(delim=='\n') - sfputc(sfstdout,'\n'); -} - -static const Tty_t *lookup(const char *name) -{ - register int i; - for(i=0; i < elementsof(Ttable); i++) - { - if(strcmp(Ttable[i].name,name)==0) - return(&Ttable[i]); - } - return(0); - -} - -static const Tty_t *getspeed(unsigned long val) -{ - register int i; - for(i=0; i < elementsof(Ttable); i++) - { - if(Ttable[i].type==SPEED && Ttable[i].mask==val) - return(&Ttable[i]); - } - return(0); -} - -static int gettchar(register const char *cp) -{ - if(*cp==0) - return(-1); - if(cp[1]==0) - return((unsigned)cp[0]); - if(*cp=='^' && cp[1] && cp[2]==0) - { - switch(cp[1]) - { - case '-': - return(-1); - default: - return(cntl(cp[1])); - } - } - if(streq(cp,"undef") || streq(cp,"<undef>")) - return(-1); - return(*((unsigned char*)cp)); -} - -static void set(char *argv[], struct termios *sp) -{ - const Tty_t *tp; - register int c,off; - char *cp; - char *ep; - while(cp = *argv++) - { - off = 0; - if(*cp=='-') - { - cp++; - off=1; - } - if(!(tp=lookup(cp)) || (off && (tp->type!=BIT) && (tp->type!=TABS))) - error(ERROR_exit(1),"%s: unknown mode",cp); - switch(tp->type) - { - case CHAR: - if(off) - error(ERROR_exit(1),"%s: unknown mode",cp); - if(!*argv) - error(ERROR_exit(1),"missing argument to %s",cp); - c = gettchar(*argv++); - if(c>=0) - sp->c_cc[tp->mask] = c; - else - sp->c_cc[tp->mask] = _POSIX_VDISABLE; - break; - case BIT: case BITS: - switch(tp->field) - { - case C_FLAG: - if(off) - sp->c_cflag &= ~tp->mask; - else - sp->c_cflag |= tp->mask; - break; - case I_FLAG: - if(off) - sp->c_iflag &= ~tp->mask; - else - sp->c_iflag |= tp->mask; - break; - case O_FLAG: - sp->c_oflag &= ~tp->mask; - sp->c_oflag |= tp->val; - break; - case L_FLAG: - if(off) - sp->c_lflag &= ~tp->mask; - else - sp->c_lflag |= tp->mask; - break; - } - break; - case TABS: - sp->c_oflag &= ~tp->mask; - if(off) - sp->c_oflag |= tp->val; - break; -#ifdef TIOCSWINSZ - case WIND: - { - struct winsize win; - int n; - if(ioctl(0,TIOCGWINSZ,&win)<0) - error(ERROR_system(1),"cannot set %s",tp->name); - if(!(cp= *argv)) - { - sfprintf(sfstdout,"%d\n",tp->mask?win.ws_col:win.ws_row); - break; - } - argv++; - n=strtol(cp,&cp,10); - if(*cp) - error(ERROR_system(1),"%d: invalid number of %s",argv[-1],tp->name); - if(tp->mask) - win.ws_col = n; - else - win.ws_row = n; - if(ioctl(0,TIOCSWINSZ,&win)<0) - error(ERROR_system(1),"cannot set %s",tp->name); - break; - } -#endif - case NUM: - cp = *argv; - if (!cp) - { - if (tp->field == C_SPEED) - { - if (tp = getspeed(*tp->name == 'i' ? cfgetispeed(sp) : cfgetospeed(sp))) - sfprintf(sfstdout, "%s\n", tp->name); - break; - } - error(ERROR_exit(1), "%s: missing numeric argument", tp->name); - } - argv++; - c = (int)strtol(cp, &ep, 10); - if (*ep) - error(ERROR_exit(1), "%s: %s: numeric argument expected", tp->name, cp); - switch (tp->field) - { -#if _mem_c_line_termios - case C_LINE: - sp->c_line = c; - break; -#endif - case C_SPEED: - if(getspeed(c)) - { - if (*tp->name != 'o') - cfsetispeed(sp, c); - if (*tp->name != 'i') - cfsetospeed(sp, c); - } - else - error(ERROR_exit(1), "%s: %s: invalid speed", tp->name, cp); - break; - case T_CHAR: - sp->c_cc[tp->mask] = c; - break; - } - break; - case SPEED: - cfsetospeed(sp, tp->mask); - cfsetispeed(sp, tp->mask); - break; - case SIZE: - sp->c_cflag &= ~CSIZE; - sp->c_cflag |= tp->mask; - break; - case SANE: - sane(sp); - break; -#if defined(OLCUC) && defined(IUCLC) - case CASE: - if(off) - { - sp->c_iflag |= IUCLC; - sp->c_oflag |= OLCUC; - } - else - { - sp->c_iflag &= ~IUCLC; - sp->c_oflag &= ~OLCUC; - } - break; -#endif /* OLCUC && IUCLC */ - } - } -} - - -static void listchars(Sfio_t *sp,int type) -{ - int i,c; - c = (type==CHAR?'c':'n'); - for(i=0; i < elementsof(Ttable); i++) - { - if(Ttable[i].type==type && *Ttable[i].description) - sfprintf(sp,"[+%s \a%c\a?%s.]",Ttable[i].name,c,Ttable[i].description); - } -} - -static void listgroup(Sfio_t *sp,int type, const char *description) -{ - int i; - sfprintf(sp,"[+"); - for(i=0; i < elementsof(Ttable); i++) - { - if(Ttable[i].type==type) - sfprintf(sp,"%s ",Ttable[i].name); - } - sfprintf(sp,"?%s.]",description); -} - -static void listmask(Sfio_t *sp,unsigned int mask,const char *description) -{ - int i; - sfprintf(sp,"[+"); - for(i=0; i < elementsof(Ttable); i++) - { - if(Ttable[i].mask==mask && Ttable[i].type==BITS) - sfprintf(sp,"%s ",Ttable[i].name); - } - sfprintf(sp,"?%s.]",description); -} - -static void listfields(Sfio_t *sp,int field) -{ - int i; - for(i=0; i < elementsof(Ttable); i++) - { - if(Ttable[i].field==field && Ttable[i].type==BIT && *Ttable[i].description) - sfprintf(sp,"[+%s (-%s)?%s.]",Ttable[i].name,Ttable[i].name,Ttable[i].description); - } -} - -static void listmode(Sfio_t *sp,const char *name) -{ - sfprintf(sp,"[+%s?%s.]",name,lookup(name)->description); -} - -static int infof(Opt_t* op, Sfio_t* sp, const char* s, Optdisc_t* dp) -{ - NoP(op); - NoP(s); - NoP(dp); - sfprintf(sp,"[+Control Modes.]{"); - listfields(sp,C_FLAG); - listgroup(sp,SPEED,"Attempt to set input and output baud rate to number given. A value of \b0\b causes immediate hangup"); - listchars(sp,NUM); - listgroup(sp,SIZE,"Number of bits in a character"); - sfprintf(sp,"}[+Input Modes.]{"); - listfields(sp,I_FLAG); - sfprintf(sp,"}[+Output Modes.]{"); - listfields(sp,O_FLAG); -#ifdef CRDLY - listmask(sp,CRDLY,"Carriage return delay style"); -#endif -#ifdef NLDLY - listmask(sp,NLDLY,"Newline delay style"); -#endif -#ifdef TABDLY - listmask(sp,TABDLY,"Horizontal tab delay style"); -#endif -#ifdef BSDLY - listmask(sp,BSDLY,"Backspace delay style"); -#endif -#ifdef FFDLY - listmask(sp,FFDLY,"Form feed delay style"); -#endif -#ifdef VTDLY - listmask(sp,VTDLY,"Vertical tab delay style"); -#endif - sfprintf(sp,"}[+Local Modes.]{"); - listfields(sp,L_FLAG); - sfprintf(sp,"}[+Control Assignments.?If \ac\a is \bundef\b or an empty " - "string then the control assignment is disabled.]{"); - listchars(sp,WIND); - listchars(sp,CHAR); - sfprintf(sp,"}[+Combination Modes.]{"); - listmode(sp,"ek"); - listmode(sp,"evenp"); - listmode(sp,"lcase"); - listmode(sp,"oddp"); - listmode(sp,"parity"); - listmode(sp,"sane"); - listmode(sp,"tabs"); - listmode(sp,"LCASE"); - sfputc(sp,'}'); - return(1); -} - -#ifndef _lib_tcgetpgrp -# ifdef TIOCGPGRP - static int _i_; -# define tcgetpgrp(a) (ioctl(a, TIOCGPGRP, &_i_)>=0?_i_:-1) -# else -# define tcgetpgrp(a) (-1) -# endif /* TIOCGPGRP */ -#endif /* _lib_tcgetpgrp */ - -int -b_stty(int argc, char** argv, void* context) -{ - struct termios tty; - register int n; - register int flags = 0; - const Tty_t* tp; - Optdisc_t disc; - - cmdinit(argc, argv, context, ERROR_CATALOG, ERROR_INTERACTIVE); - if (tcgetattr(0, &tty) < 0) - error(ERROR_system(1),"not a tty"); - memset(&disc, 0, sizeof(disc)); - disc.version = OPT_VERSION; - disc.infof = infof; - opt_info.disc = &disc; - for (;;) - { - switch (n = optget(argv, usage)) - { - case 'a': - case 'g': - case 't': - if (!opt_info.offset || !argv[opt_info.index][opt_info.offset]) - { - switch (n) - { - case 'a': - flags |= A_FLAG; - break; - case 'g': - flags |= G_FLAG; - break; - case 't': - flags |= T_FLAG; - break; - } - continue; - } - /*FALLTHROUGH*/ - case ':': - if (!opt_info.offset) - error(2, "%s", opt_info.arg); - else if (!(tp = lookup(argv[opt_info.index]+1)) || (tp->type != BIT && tp->type != TABS)) - error(ERROR_exit(1), "%s: unknown mode", argv[opt_info.index]); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - break; - } - argv += opt_info.index; - if (error_info.errors || (flags && *argv) || (flags&(flags-1))) - error(ERROR_usage(2), "%s", optusage(NiL)); - if (flags & T_FLAG) - sfprintf(sfstdout, "%d\n", tcgetpgrp(0)); - else if (*argv) - { - if (!argv[1] && **argv == ':') - gin(*argv, &tty); - else - set(argv, &tty); - if (tcsetattr(0, TCSANOW, &tty) < 0) - error(ERROR_system(1), "cannot set tty"); - } - else - output(&tty, flags); - return error_info.errors; -} diff --git a/usr/src/lib/libcmd/common/sum.c b/usr/src/lib/libcmd/common/sum.c deleted file mode 100644 index 9f26249153..0000000000 --- a/usr/src/lib/libcmd/common/sum.c +++ /dev/null @@ -1,35 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * Glenn Fowler - * AT&T Research - * - * sum -- implemented by cksum - */ - -#include <cmd.h> - -int -b_sum(int argc, register char** argv, void* context) -{ - return b_cksum(argc, argv, context); -} diff --git a/usr/src/lib/libcmd/common/sync.c b/usr/src/lib/libcmd/common/sync.c deleted file mode 100644 index 16ccfeb718..0000000000 --- a/usr/src/lib/libcmd/common/sync.c +++ /dev/null @@ -1,79 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * Glenn Fowler - * AT&T Research - */ - -static const char usage[] = -"[-?\n@(#)$Id: sync (AT&T Research) 2006-10-04 $\n]" -USAGE_LICENSE -"[+NAME?sync - schedule file system updates]" -"[+DESCRIPTION?\bsync\b calls \bsync\b(2), which causes all information " - "in memory that updates file systems to be scheduled for writing out to " - "all file systems. The writing, although scheduled, is not necessarily " - "complete upon return from \bsync\b.]" -"[+?Since \bsync\b(2) has no failure indication, \bsync\b only fails for " - "option/operand syntax errors, or when \bsync\b(2) does not return, in " - "which case \bsync\b also does not return.]" -"[+?At minimum \bsync\b should be called before halting the system. Most " - "systems provide graceful shutdown procedures that include \bsync\b -- " - "use them if possible.]" -"[+EXIT STATUS?]" - "{" - "[+0?\bsync\b(2) returned.]" - "[+>0?Option/operand syntax error.]" - "}" -"[+SEE ALSO?\bsync\b(2), \bshutdown\b(8)]" -; - -#include <cmd.h> -#include <ls.h> - -int -b_sync(int argc, char** argv, void* context) -{ - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - for (;;) - { - switch (optget(argv, usage)) - { - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - break; - } - argv += opt_info.index; - if (error_info.errors || *argv) - error(ERROR_usage(2), "%s", optusage(NiL)); -#if _lib_sync - sync(); -#else - error(ERROR_usage(2), "failed -- the native system does not provide a sync(2) call"); -#endif - return 0; -} diff --git a/usr/src/lib/libcmd/common/tail.c b/usr/src/lib/libcmd/common/tail.c deleted file mode 100644 index b65ec1a9f3..0000000000 --- a/usr/src/lib/libcmd/common/tail.c +++ /dev/null @@ -1,775 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped - -/* - * print the tail of one or more files - * - * David Korn - * Glenn Fowler - */ - -static const char usage[] = -"+[-?\n@(#)$Id: tail (AT&T Research) 2010-03-23 $\n]" -USAGE_LICENSE -"[+NAME?tail - output trailing portion of one or more files ]" -"[+DESCRIPTION?\btail\b copies one or more input files to standard output " - "starting at a designated point for each file. Copying starts " - "at the point indicated by the options and is unlimited in size.]" -"[+?By default a header of the form \b==> \b\afilename\a\b <==\b " - "is output before all but the first file but this can be changed " - "with the \b-q\b and \b-v\b options.]" -"[+?If no \afile\a is given, or if the \afile\a is \b-\b, \btail\b " - "copies from standard input. The start of the file is defined " - "as the current offset.]" -"[+?The option argument for \b-c\b can optionally be " - "followed by one of the following characters to specify a different " - "unit other than a single byte:]{" - "[+b?512 bytes.]" - "[+k?1 KiB.]" - "[+m?1 MiB.]" - "[+g?1 GiB.]" - "}" -"[+?For backwards compatibility, \b-\b\anumber\a is equivalent to " - "\b-n\b \anumber\a and \b+\b\anumber\a is equivalent to " - "\b-n -\b\anumber\a. \anumber\a may also have these option " - "suffixes: \bb c f g k l m r\b.]" - -"[n:lines]:[lines:=10?Copy \alines\a lines from each file. A negative value " - "for \alines\a indicates an offset from the end of the file.]" -"[b:blocks?Copy units of 512 bytes.]" -"[c:bytes]:?[chars?Copy \achars\a bytes from each file. A negative value " - "for \achars\a indicates an offset from the end of the file.]" -"[f:forever|follow?Loop forever trying to read more characters as the " - "end of each file to copy new data. Ignored if reading from a pipe " - "or fifo.]" -"[h!:headers?Output filename headers.]" -"[l:lines?Copy units of lines. This is the default.]" -"[L:log?When a \b--forever\b file times out via \b--timeout\b, verify that " - "the curent file has not been renamed and replaced by another file " - "of the same name (a common log file practice) before giving up on " - "the file.]" -"[q:quiet?Don't output filename headers. For GNU compatibility.]" -"[r:reverse?Output lines in reverse order.]" -"[s:silent?Don't warn about timeout expiration and log file changes.]" -"[t:timeout?Stop checking after \atimeout\a elapses with no additional " - "\b--forever\b output. A separate elapsed time is maintained for " - "each file operand. There is no timeout by default. The default " - "\atimeout\a unit is seconds. \atimeout\a may be a catenation of 1 " - "or more integers, each followed by a 1 character suffix. The suffix " - "may be omitted from the last integer, in which case it is " - "interpreted as seconds. The supported suffixes are:]:[timeout]{" - "[+s?seconds]" - "[+m?minutes]" - "[+h?hours]" - "[+d?days]" - "[+w?weeks]" - "[+M?months]" - "[+y?years]" - "[+S?scores]" - "}" -"[v:verbose?Always ouput filename headers.]" - -"\n" -"\n[file ...]\n" -"\n" - -"[+EXIT STATUS?]{" - "[+0?All files copied successfully.]" - "[+>0?One or more files did not copy.]" -"}" -"[+SEE ALSO?\bcat\b(1), \bhead\b(1), \brev\b(1)]" -; - -#include <cmd.h> -#include <ctype.h> -#include <ls.h> -#include <tm.h> -#include <rev.h> - -#define COUNT (1<<0) -#define ERROR (1<<1) -#define FOLLOW (1<<2) -#define HEADERS (1<<3) -#define LINES (1<<4) -#define LOG (1<<5) -#define NEGATIVE (1<<6) -#define POSITIVE (1<<7) -#define REVERSE (1<<8) -#define SILENT (1<<9) -#define TIMEOUT (1<<10) -#define VERBOSE (1<<11) - -#define NOW (unsigned long)time(NiL) - -#define DEFAULT 10 - -#ifdef S_ISSOCK -#define FIFO(m) (S_ISFIFO(m)||S_ISSOCK(m)) -#else -#define FIFO(m) S_ISFIFO(m) -#endif - -struct Tail_s; typedef struct Tail_s Tail_t; - -struct Tail_s -{ - Tail_t* next; - char* name; - Sfio_t* sp; - Sfoff_t cur; - Sfoff_t end; - unsigned long expire; - long dev; - long ino; - int fifo; -}; - -static const char header_fmt[] = "\n==> %s <==\n"; - -/* - * if file is seekable, position file to tail location and return offset - * otherwise, return -1 - */ - -static Sfoff_t -tailpos(register Sfio_t* fp, register Sfoff_t number, int delim) -{ - register size_t n; - register Sfoff_t offset; - register Sfoff_t first; - register Sfoff_t last; - register char* s; - register char* t; - struct stat st; - - last = sfsize(fp); - if ((first = sfseek(fp, (Sfoff_t)0, SEEK_CUR)) < 0) - return last || fstat(sffileno(fp), &st) || st.st_size || FIFO(st.st_mode) ? -1 : 0; - if (delim < 0) - { - if ((offset = last - number) < first) - return first; - return offset; - } - for (;;) - { - if ((offset = last - SF_BUFSIZE) < first) - offset = first; - sfseek(fp, offset, SEEK_SET); - n = last - offset; - if (!(s = sfreserve(fp, n, SF_LOCKR))) - return -1; - t = s + n; - while (t > s) - if (*--t == delim && number-- <= 0) - { - sfread(fp, s, 0); - return offset + (t - s) + 1; - } - sfread(fp, s, 0); - if (offset == first) - break; - last = offset; - } - return first; -} - -/* - * this code handles tail from a pipe without any size limits - */ - -static void -pipetail(Sfio_t* infile, Sfio_t* outfile, Sfoff_t number, int delim) -{ - register Sfio_t* out; - register Sfoff_t n; - register Sfoff_t nleft = number; - register size_t a = 2 * SF_BUFSIZE; - register int fno = 0; - Sfoff_t offset[2]; - Sfio_t* tmp[2]; - - if (delim < 0 && a > number) - a = number; - out = tmp[0] = sftmp(a); - tmp[1] = sftmp(a); - offset[0] = offset[1] = 0; - while ((n = sfmove(infile, out, number, delim)) > 0) - { - offset[fno] = sftell(out); - if ((nleft -= n) <= 0) - { - out = tmp[fno= !fno]; - sfseek(out, (Sfoff_t)0, SEEK_SET); - nleft = number; - } - } - if (nleft == number) - { - offset[fno] = 0; - fno= !fno; - } - sfseek(tmp[0], (Sfoff_t)0, SEEK_SET); - - /* - * see whether both files are needed - */ - - if (offset[fno]) - { - sfseek(tmp[1], (Sfoff_t)0, SEEK_SET); - if ((n = number - nleft) > 0) - sfmove(tmp[!fno], NiL, n, delim); - if ((n = offset[!fno] - sftell(tmp[!fno])) > 0) - sfmove(tmp[!fno], outfile, n, -1); - } - else - fno = !fno; - sfmove(tmp[fno], outfile, offset[fno], -1); - sfclose(tmp[0]); - sfclose(tmp[1]); -} - -/* - * (re)initialize a tail stream - */ - -static int -init(Tail_t* tp, Sfoff_t number, int delim, int flags, const char** format) -{ - Sfoff_t offset; - Sfio_t* op; - struct stat st; - - tp->fifo = 0; - if (tp->sp) - { - offset = 0; - if (tp->sp == sfstdin) - tp->sp = 0; - } - else if (!number) - offset = 0; - else - offset = 1; - if (!tp->name || streq(tp->name, "-")) - { - tp->name = "/dev/stdin"; - tp->sp = sfstdin; - } - else if (!(tp->sp = sfopen(tp->sp, tp->name, "r"))) - { - error(ERROR_system(0), "%s: cannot open", tp->name); - return -1; - } - sfset(tp->sp, SF_SHARE, 0); - if (offset) - { - if (number < 0 || !number && (flags & POSITIVE)) - { - sfset(tp->sp, SF_SHARE, !(flags & FOLLOW)); - if (number < -1) - { - sfmove(tp->sp, NiL, -number - 1, delim); - offset = sfseek(tp->sp, (Sfoff_t)0, SEEK_CUR); - } - else - offset = 0; - } - else if ((offset = tailpos(tp->sp, number, delim)) >= 0) - sfseek(tp->sp, offset, SEEK_SET); - else if (fstat(sffileno(tp->sp), &st)) - { - error(ERROR_system(0), "%s: cannot stat", tp->name); - goto bad; - } - else if (!FIFO(st.st_mode)) - { - error(ERROR_SYSTEM|2, "%s: cannot position file to tail", tp->name); - goto bad; - } - else - { - tp->fifo = 1; - if (flags & (HEADERS|VERBOSE)) - { - sfprintf(sfstdout, *format, tp->name); - *format = header_fmt; - } - op = (flags & REVERSE) ? sftmp(4*SF_BUFSIZE) : sfstdout; - pipetail(tp->sp ? tp->sp : sfstdin, op, number, delim); - if (flags & REVERSE) - { - sfseek(op, (Sfoff_t)0, SEEK_SET); - rev_line(op, sfstdout, (Sfoff_t)0); - sfclose(op); - } - } - } - tp->cur = tp->end = offset; - if (flags & LOG) - { - if (fstat(sffileno(tp->sp), &st)) - { - error(ERROR_system(0), "%s: cannot stat", tp->name); - goto bad; - } - tp->dev = st.st_dev; - tp->ino = st.st_ino; - } - return 0; - bad: - if (tp->sp != sfstdin) - sfclose(tp->sp); - tp->sp = 0; - return -1; -} - -/* - * convert number with validity diagnostics - */ - -static intmax_t -num(register const char* s, char** e, int* f, int o) -{ - intmax_t number; - char* t; - int c; - - *f &= ~(ERROR|NEGATIVE|POSITIVE); - if ((c = *s) == '-') - { - *f |= NEGATIVE; - s++; - } - else if (c == '+') - { - *f |= POSITIVE; - s++; - } - while (*s == '0' && isdigit(*(s + 1))) - s++; - errno = 0; - number = strtonll(s, &t, NiL, 0); - if (t == s) - number = DEFAULT; - if (o && *t) - { - number = 0; - *f |= ERROR; - error(2, "-%c: %s: invalid numeric argument -- unknown suffix", o, s); - } - else if (errno) - { - *f |= ERROR; - if (o) - error(2, "-%c: %s: invalid numeric argument -- out of range", o, s); - else - error(2, "%s: invalid numeric argument -- out of range", s); - } - else - { - *f |= COUNT; - if (t > s && isalpha(*(t - 1))) - *f &= ~LINES; - if (c == '-') - number = -number; - } - if (e) - *e = t; - return number; -} - -int -b_tail(int argc, char** argv, void* context) -{ - register Sfio_t* ip; - register int n; - register int i; - int delim; - int flags = HEADERS|LINES; - int blocks = 0; - char* s; - char* t; - char* r; - char* file; - Sfoff_t offset; - Sfoff_t number = DEFAULT; - unsigned long timeout = 0; - struct stat st; - const char* format = header_fmt+1; - ssize_t z; - ssize_t w; - Sfio_t* op; - register Tail_t* fp; - register Tail_t* pp; - register Tail_t* hp; - Tail_t* files; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - for (;;) - { - switch (n = optget(argv, usage)) - { - case 0: - if (!(flags & FOLLOW) && argv[opt_info.index] && (argv[opt_info.index][0] == '-' || argv[opt_info.index][0] == '+') && !argv[opt_info.index][1]) - { - number = argv[opt_info.index][0] == '-' ? 10 : -10; - flags |= LINES; - opt_info.index++; - continue; - } - break; - case 'b': - blocks = 512; - flags &= ~LINES; - if (opt_info.option[0] == '+') - number = -number; - continue; - case 'c': - flags &= ~LINES; - if (opt_info.arg == argv[opt_info.index - 1]) - { - strtol(opt_info.arg, &s, 10); - if (*s) - { - opt_info.index--; - t = ""; - goto suffix; - } - } - else if (opt_info.arg && isalpha(*opt_info.arg)) - { - t = opt_info.arg; - goto suffix; - } - /*FALLTHROUGH*/ - case 'n': - flags |= COUNT; - if (s = opt_info.arg) - number = num(s, &s, &flags, n); - else - { - number = DEFAULT; - flags &= ~(ERROR|NEGATIVE|POSITIVE); - s = ""; - } - if (n != 'n' && s && isalpha(*s)) - { - t = s; - goto suffix; - } - if (flags & ERROR) - continue; - if (flags & (NEGATIVE|POSITIVE)) - number = -number; - if (opt_info.option[0]=='+') - number = -number; - continue; - case 'f': - flags |= FOLLOW; - continue; - case 'h': - if (opt_info.num) - flags |= HEADERS; - else - flags &= ~HEADERS; - continue; - case 'l': - flags |= LINES; - if (opt_info.option[0] == '+') - number = -number; - continue; - case 'L': - flags |= LOG; - continue; - case 'q': - flags &= ~HEADERS; - continue; - case 'r': - flags |= REVERSE; - continue; - case 's': - flags |= SILENT; - continue; - case 't': - flags |= TIMEOUT; - timeout = strelapsed(opt_info.arg, &s, 1); - if (*s) - error(ERROR_exit(1), "%s: invalid elapsed time [%s]", opt_info.arg, s); - continue; - case 'v': - flags |= VERBOSE; - continue; - case ':': - /* handle old style arguments */ - if (!(r = argv[opt_info.index]) || !opt_info.offset) - { - error(2, "%s", opt_info.arg); - break; - } - s = r + opt_info.offset - 1; - if (i = *(s - 1) == '-' || *(s - 1) == '+') - s--; - if ((number = num(s, &t, &flags, 0)) && i) - number = -number; - goto compatibility; - suffix: - r = 0; - if (opt_info.option[0] == '+') - number = -number; - compatibility: - for (;;) - { - switch (*t++) - { - case 0: - if (r) - opt_info.offset = t - r - 1; - break; - case 'c': - flags &= ~LINES; - continue; - case 'f': - flags |= FOLLOW; - continue; - case 'l': - flags |= LINES; - continue; - case 'r': - flags |= REVERSE; - continue; - default: - error(2, "%s: invalid suffix", t - 1); - if (r) - opt_info.offset = strlen(r); - break; - } - break; - } - continue; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - break; - } - argv += opt_info.index; - if (!*argv) - { - flags &= ~HEADERS; - if (fstat(0, &st)) - error(ERROR_system(0), "/dev/stdin: cannot stat"); - else if (FIFO(st.st_mode)) - flags &= ~FOLLOW; - } - else if (!*(argv + 1)) - flags &= ~HEADERS; - delim = (flags & LINES) ? '\n' : -1; - if (blocks) - number *= blocks; - if (flags & REVERSE) - { - if (delim < 0) - error(2, "--reverse requires line mode"); - if (!(flags & COUNT)) - number = -1; - flags &= ~FOLLOW; - } - if ((flags & (FOLLOW|TIMEOUT)) == TIMEOUT) - { - flags &= ~TIMEOUT; - timeout = 0; - error(ERROR_warn(0), "--timeout ignored for --noforever"); - } - if ((flags & (LOG|TIMEOUT)) == LOG) - { - flags &= ~LOG; - error(ERROR_warn(0), "--log ignored for --notimeout"); - } - if (error_info.errors) - error(ERROR_usage(2), "%s", optusage(NiL)); - if (flags & FOLLOW) - { - if (!(fp = (Tail_t*)stakalloc(argc * sizeof(Tail_t)))) - error(ERROR_system(1), "out of space"); - files = 0; - s = *argv; - do - { - fp->name = s; - fp->sp = 0; - if (!init(fp, number, delim, flags, &format)) - { - fp->expire = timeout ? (NOW + timeout + 1) : 0; - if (files) - pp->next = fp; - else - files = fp; - pp = fp; - fp++; - } - } while (s && (s = *++argv)); - if (!files) - return error_info.errors != 0; - pp->next = 0; - hp = 0; - n = 1; - while (fp = files) - { - if (n) - n = 0; - else - sleep(1); - pp = 0; - while (fp) - { - if (fstat(sffileno(fp->sp), &st)) - error(ERROR_system(0), "%s: cannot stat", fp->name); - else if (fp->fifo || fp->end < st.st_size) - { - n = 1; - if (timeout) - fp->expire = NOW + timeout; - z = fp->fifo ? SF_UNBOUND : st.st_size - fp->cur; - i = 0; - if ((s = sfreserve(fp->sp, z, SF_LOCKR)) || (z = sfvalue(fp->sp)) && (s = sfreserve(fp->sp, z, SF_LOCKR)) && (i = 1)) - { - z = sfvalue(fp->sp); - for (r = s + z; r > s && *(r - 1) != '\n'; r--); - if ((w = r - s) || i && (w = z)) - { - if ((flags & (HEADERS|VERBOSE)) && hp != fp) - { - hp = fp; - sfprintf(sfstdout, format, fp->name); - format = header_fmt; - } - fp->cur += w; - sfwrite(sfstdout, s, w); - } - else - w = 0; - sfread(fp->sp, s, w); - fp->end += w; - } - goto next; - } - else if (!timeout || fp->expire > NOW) - goto next; - else - { - if (flags & LOG) - { - i = 3; - while (--i && stat(fp->name, &st)) - sleep(1); - if (i && (fp->dev != st.st_dev || fp->ino != st.st_ino) && !init(fp, 0, 0, flags, &format)) - { - if (!(flags & SILENT)) - error(ERROR_warn(0), "%s: log file change", fp->name); - fp->expire = NOW + timeout; - goto next; - } - } - if (!(flags & SILENT)) - error(ERROR_warn(0), "%s: %s timeout", fp->name, fmtelapsed(timeout, 1)); - } - if (fp->sp && fp->sp != sfstdin) - sfclose(fp->sp); - if (pp) - pp = pp->next = fp->next; - else - files = files->next; - fp = fp->next; - continue; - next: - pp = fp; - fp = fp->next; - } - if (sfsync(sfstdout)) - error(ERROR_system(1), "write error"); - } - } - else - { - if (file = *argv) - argv++; - do - { - if (!file || streq(file, "-")) - { - file = "/dev/stdin"; - ip = sfstdin; - } - else if (!(ip = sfopen(NiL, file, "r"))) - { - error(ERROR_system(0), "%s: cannot open", file); - continue; - } - if (flags & (HEADERS|VERBOSE)) - { - sfprintf(sfstdout, format, file); - format = header_fmt; - } - if (number < 0 || !number && (flags & POSITIVE)) - { - sfset(ip, SF_SHARE, 1); - if (number < -1) - sfmove(ip, NiL, -number - 1, delim); - if (flags & REVERSE) - rev_line(ip, sfstdout, sfseek(ip, (Sfoff_t)0, SEEK_CUR)); - else - sfmove(ip, sfstdout, SF_UNBOUND, -1); - } - else - { - sfset(ip, SF_SHARE, 0); - if ((offset = tailpos(ip, number, delim)) >= 0) - { - if (flags & REVERSE) - rev_line(ip, sfstdout, offset); - else - { - sfseek(ip, offset, SEEK_SET); - sfmove(ip, sfstdout, SF_UNBOUND, -1); - } - } - else - { - op = (flags & REVERSE) ? sftmp(4*SF_BUFSIZE) : sfstdout; - pipetail(ip, op, number, delim); - if (flags & REVERSE) - { - sfseek(op, (Sfoff_t)0, SEEK_SET); - rev_line(op, sfstdout, (Sfoff_t)0); - sfclose(op); - } - flags = 0; - } - } - if (ip != sfstdin) - sfclose(ip); - } while (file = *argv++); - } - return error_info.errors != 0; -} diff --git a/usr/src/lib/libcmd/common/tee.c b/usr/src/lib/libcmd/common/tee.c deleted file mode 100644 index 89eb57457f..0000000000 --- a/usr/src/lib/libcmd/common/tee.c +++ /dev/null @@ -1,202 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * AT&T Bell Laboratories - * - * tee - */ - -static const char usage[] = -"[-?\n@(#)$Id: tee (AT&T Research) 2009-06-19 $\n]" -USAGE_LICENSE -"[+NAME?tee - duplicate standard input]" -"[+DESCRIPTION?\btee\b copies standard input to standard output " - "and to zero or more files. The options determine whether " - "the specified files are overwritten or appended to. The " - "\btee\b utility does not buffer output. If writes to any " - "\afile\a fail, writes to other files continue although \btee\b " - "will exit with a non-zero exit status.]" -"[+?The number of \afile\a operands that can be specified is limited " - "by the underlying operating system.]" -"[a:append?Append the standard input to the given files rather " - "than overwriting them.]" -"[i:ignore-interrupts?Ignore SIGINT signal.]" -"[l:linebuffer?Set the standard output to be line buffered.]" -"\n" -"\n[file ...]\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?All files copies successfully.]" - "[+>0?An error occurred.]" -"}" -"[+SEE ALSO?\bcat\b(1), \bsignal\b(3)]" -; - -#include <cmd.h> -#include <ls.h> -#include <sig.h> - -typedef struct Tee_s -{ - Sfdisc_t disc; - int line; - int fd[1]; -} Tee_t; - -/* - * This discipline writes to each file in the list given in handle - */ - -static ssize_t -tee_write(Sfio_t* fp, const void* buf, size_t n, Sfdisc_t* handle) -{ - register const char* bp; - register const char* ep; - register int* hp = ((Tee_t*)handle)->fd; - register int fd = sffileno(fp); - register ssize_t r; - - do - { - bp = (const char*)buf; - ep = bp + n; - while (bp < ep) - { - if ((r = write(fd, bp, ep - bp)) <= 0) - return -1; - bp += r; - } - } while ((fd = *hp++) >= 0); - return n; -} - -static void -tee_cleanup(register Tee_t* tp) -{ - register int* hp; - register int n; - - if (tp) - { - sfdisc(sfstdout, NiL); - if (tp->line >= 0) - sfset(sfstdout, SF_LINE, tp->line); - for (hp = tp->fd; (n = *hp) >= 0; hp++) - close(n); - } -} - -int -b_tee(int argc, register char** argv, void* context) -{ - register Tee_t* tp = 0; - register int oflag = O_WRONLY|O_TRUNC|O_CREAT|O_BINARY; - register int* hp; - register char* cp; - int line; - - if (argc <= 0) - { - if (context && (tp = (Tee_t*)sh_context(context)->data)) - { - sh_context(context)->data = 0; - tee_cleanup(tp); - } - return 0; - } - cmdinit(argc, argv, context, ERROR_CATALOG, ERROR_CALLBACK); - line = -1; - for (;;) - { - switch (optget(argv, usage)) - { - case 'a': - oflag &= ~O_TRUNC; - oflag |= O_APPEND; - continue; - case 'i': - signal(SIGINT, SIG_IGN); - continue; - case 'l': - line = sfset(sfstdout, 0, 0) & SF_LINE; - if ((line == 0) == (opt_info.num == 0)) - line = -1; - else - sfset(sfstdout, SF_LINE, !!opt_info.num); - continue; - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - break; - } - if (error_info.errors) - error(ERROR_usage(2), "%s", optusage(NiL)); - argv += opt_info.index; - argc -= opt_info.index; -#if _ANCIENT_BSD_COMPATIBILITY - if (*argv && streq(*argv, "-")) - { - signal(SIGINT, SIG_IGN); - argv++; - argc--; - } -#endif - if (argc > 0) - { - if (tp = (Tee_t*)stakalloc(sizeof(Tee_t) + argc * sizeof(int))) - { - memset(&tp->disc, 0, sizeof(tp->disc)); - tp->disc.writef = tee_write; - if (context) - sh_context(context)->data = (void*)tp; - tp->line = line; - hp = tp->fd; - while (cp = *argv++) - { - if ((*hp = open(cp, oflag, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) - error(ERROR_system(0), "%s: cannot create", cp); - else - hp++; - } - if (hp == tp->fd) - tp = 0; - else - { - *hp = -1; - sfdisc(sfstdout, &tp->disc); - } - } - else - error(ERROR_exit(0), "out of space"); - } - if ((sfmove(sfstdin, sfstdout, SF_UNBOUND, -1) < 0 || !sfeof(sfstdin)) && errno != EPIPE) - error(ERROR_system(0), "read error"); - if (sfsync(sfstdout)) - error(ERROR_system(0), "write error"); - tee_cleanup(tp); - return error_info.errors; -} diff --git a/usr/src/lib/libcmd/common/tty.c b/usr/src/lib/libcmd/common/tty.c deleted file mode 100644 index 684838578e..0000000000 --- a/usr/src/lib/libcmd/common/tty.c +++ /dev/null @@ -1,97 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * AT&T Bell Laboratories - * - * tty - */ - -static const char usage[] = -"[-?\n@(#)$Id: tty (AT&T Research) 2008-03-13 $\n]" -USAGE_LICENSE -"[+NAME?tty - write the name of the terminal to standard output]" -"[+DESCRIPTION?\btty\b writes the name of the terminal that is connected " - "to standard input onto standard output. If the standard input is not " - "a terminal, \"\bnot a tty\b\" will be written to standard output.]" -"[l:line-number?Write the synchronous line number of the terminal on a " - "separate line following the terminal name line. If the standard " - "input is not a synchronous terminal then " - "\"\bnot on an active synchronous line\b\" is written.]" -"[s:silent|quiet?Disable the terminal name line. Use \b[[ -t 0 ]]]]\b instead.]" -"[+EXIT STATUS?]{" - "[+0?Standard input is a tty.]" - "[+1?Standard input is not a tty.]" - "[+2?Invalid arguments.]" - "[+3?A an error occurred.]" -"}" -; - - -#include <cmd.h> - -#if _mac_STWLINE -#include <sys/stermio.h> -#endif - -int -b_tty(int argc, char *argv[], void* context) -{ - register int n,sflag=0,lflag=0; - register char *tty; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - while (n = optget(argv, usage)) switch (n) - { - case 'l': - lflag++; - break; - case 's': - sflag++; - break; - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - if(error_info.errors) - error(ERROR_usage(2), "%s", optusage(NiL)); - if(!(tty=ttyname(0))) - { - tty = ERROR_translate(0, 0, 0, "not a tty"); - error_info.errors++; - } - if(!sflag) - sfputr(sfstdout,tty,'\n'); - if(lflag) - { -#if _mac_STWLINE - if (n = ioctl(0, STWLINE, 0)) >= 0) - error(ERROR_OUTPUT, 1, "synchronous line %d", n); - else -#endif - error(ERROR_OUTPUT, 1, "not on an active synchronous line"); - } - return(error_info.errors); -} diff --git a/usr/src/lib/libcmd/common/uname.c b/usr/src/lib/libcmd/common/uname.c deleted file mode 100644 index 88ceec400d..0000000000 --- a/usr/src/lib/libcmd/common/uname.c +++ /dev/null @@ -1,514 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * Glenn Fowler - * AT&T Research - * - * uname - */ - -static const char usage[] = -"[-?\n@(#)$Id: uname (AT&T Research) 2007-04-19 $\n]" -USAGE_LICENSE -"[+NAME?uname - identify the current system ]" -"[+DESCRIPTION?By default \buname\b writes the operating system name to" -" standard output. When options are specified, one or more" -" system characteristics are written to standard output, space" -" separated, on a single line. When more than one option is specified" -" the output is in the order specfied by the \b-A\b option below." -" Unsupported option values are listed as \a[option]]\a. If any unknown" -" options are specified then the local \b/usr/bin/uname\b is called.]" -"[+?If any \aname\a operands are specified then the \bsysinfo\b(2) values" -" for each \aname\a are listed, separated by space, on one line." -" \bgetconf\b(1), a pre-existing \astandard\a interface, provides" -" access to the same information; vendors should spend more time" -" using standards than inventing them.]" -"[+?Selected information is printed in the same order as the options below.]" -"[a:all?Equivalent to \b-snrvmpio\b.]" -"[s:system|sysname|kernel-name?The detailed kernel name. This is the default.]" -"[n:nodename?The hostname or nodename.]" -"[r:release|kernel-release?The kernel release level.]" -"[v:version|kernel-version?The kernel version level.]" -"[m:machine?The name of the hardware type the system is running on.]" -"[p:processor?The name of the processor instruction set architecture.]" -"[i:implementation|platform|hardware-platform?The hardware implementation;" -" this is \b--host-id\b on some systems.]" -"[o:operating-system?The generic operating system name.]" -"[h:host-id|id?The host id in hex.]" -"[d:domain?The domain name returned by \agetdomainname\a(2).]" -"[R:extended-release?The extended release name.]" -"[A:everything?Equivalent to \b-snrvmpiohdR\b.]" -"[f:list?List all \bsysinfo\b(2) names and values, one per line.]" -"[S:sethost?Set the hostname or nodename to \aname\a. No output is" -" written to standard output.]:[name]" -"\n" -"\n[ name ... ]\n" -"\n" -"[+SEE ALSO?\bhostname\b(1), \bgetconf\b(1), \buname\b(2)," -" \bsysconf\b(2), \bsysinfo\b(2)]" -; - -#if defined(__STDPP__directive) && defined(__STDPP__hide) -__STDPP__directive pragma pp:hide getdomainname gethostid gethostname sethostname -#else -#define getdomainname ______getdomainname -#define gethostid ______gethostid -#define gethostname ______gethostname -#define sethostname ______sethostname -#endif - -#include <cmd.h> -#include <ctype.h> -#include <proc.h> - -#include "FEATURE/utsname" - -#define MAXHOSTNAME 64 - -#if _lib_uname && _sys_utsname - -#include <sys/utsname.h> - -#endif - -#if defined(__STDPP__directive) && defined(__STDPP__hide) -__STDPP__directive pragma pp:nohide getdomainname gethostid gethostname sethostname -#else -#undef getdomainname -#undef gethostid -#undef gethostname -#undef sethostname -#endif - -#if _lib_getdomainname -extern int getdomainname(char*, size_t); -#endif -#if _lib_gethostid -extern long gethostid(void); -#endif -#if _lib_gethostname -extern int gethostname(char*, size_t); -#endif -#if _lib_sethostname -extern int sethostname(const char*, size_t); -#endif - -#ifndef HOSTTYPE -#define HOSTTYPE "unknown" -#endif - -static const char hosttype[] = HOSTTYPE; - -#if !_lib_uname || !_sys_utsname - -#if defined(__STDPP__) -#define SYSNAME #(getprd machine) -#define RELEASE #(getprd release) -#define VERSION #(getprd version) -#define MACHINE #(getprd architecture) -#else -#define SYSNAME "" -#define RELEASE "" -#define VERSION "" -#define MACHINE "" -#endif - -struct utsname -{ - char* sysname; - char nodename[MAXHOSTNAME]; - char* release; - char* version; - char* machine; -}; - -int -uname(register struct utsname* ut) -{ -#ifdef HOSTTYPE - char* sys = 0; - char* arch = 0; - - if (*hosttype) - { - static char buf[sizeof(hosttype)]; - - strcpy(buf, hosttype); - sys = buf; - if (arch = strchr(sys, '.')) - { - *arch++ = 0; - if (!*arch) - arch = 0; - } - if (!*sys) - sys = 0; - } -#endif -#ifdef _lib_gethostname - if (gethostname(ut->nodename, sizeof(ut->nodename) - 1)) - return -1; -#else - strncpy(ut->nodename, "local", sizeof(ut->nodename) - 1); -#endif -#ifdef HOSTTYPE - if (!(ut->sysname = sys)) -#endif - if (!*(ut->sysname = SYSNAME)) - ut->sysname = ut->nodename; -#ifdef HOSTTYPE - if (!(ut->machine = arch)) -#endif - ut->machine = MACHINE; - ut->release = RELEASE; - ut->version = VERSION; - return 0; -} - -#endif - -#define OPT_system (1<<0) -#define OPT_nodename (1<<1) -#define OPT_release (1<<2) -#define OPT_version (1<<3) -#define OPT_machine (1<<4) -#define OPT_processor (1<<5) - -#define OPT_STANDARD 6 - -#define OPT_implementation (1<<6) -#define OPT_operating_system (1<<7) - -#define OPT_ALL 8 - -#define OPT_hostid (1<<8) -#define OPT_vendor (1<<9) -#define OPT_domain (1<<10) -#define OPT_machine_type (1<<11) -#define OPT_base (1<<12) -#define OPT_extended_release (1<<13) -#define OPT_extra (1<<14) - -#define OPT_TOTAL 15 - -#define OPT_all (1L<<29) -#define OPT_total (1L<<30) -#define OPT_standard ((1<<OPT_STANDARD)-1) - -#ifndef MACHINE -#if defined(__STDPP__) -#define MACHINE #(getprd architecture) -#else -#define MACHINE "" -#endif -#endif - -#ifndef HOSTTYPE -#define HOSTTYPE "unknown" -#endif - -#define extra(m) do \ - { \ - if ((char*)&ut.m[sizeof(ut.m)] > last) \ - last = (char*)&ut.m[sizeof(ut.m)]; \ - } while(0) - -#define output(f,v,u) do \ - { \ - if ((flags&(f))&&(*(v)||(flags&(OPT_all|OPT_total))==OPT_all&&((f)&OPT_standard)||!(flags&(OPT_all|OPT_total)))) \ - { \ - if (sep) \ - sfputc(sfstdout, ' '); \ - else \ - sep = 1; \ - if (*(v)) \ - sfputr(sfstdout, v, -1); \ - else \ - sfprintf(sfstdout, "[%s]", u); \ - } \ - } while (0) - -int -b_uname(int argc, char** argv, void* context) -{ - register long flags = 0; - register int sep = 0; - register int n; - register char* s; - char* t; - char* e; - char* sethost = 0; - int list = 0; - struct utsname ut; - char buf[257]; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - for (;;) - { - switch (optget(argv, usage)) - { - case 'a': - flags |= OPT_all|((1L<<OPT_ALL)-1); - continue; - case 'b': - flags |= OPT_base; - continue; - case 'c': - flags |= OPT_vendor; - continue; - case 'd': - flags |= OPT_domain; - continue; - case 'f': - list = 1; - continue; - case 'h': - flags |= OPT_hostid; - continue; - case 'i': - flags |= OPT_implementation; - continue; - case 'm': - flags |= OPT_machine; - continue; - case 'n': - flags |= OPT_nodename; - continue; - case 'o': - flags |= OPT_operating_system; - continue; - case 'p': - flags |= OPT_processor; - continue; - case 'r': - flags |= OPT_release; - continue; - case 's': - flags |= OPT_system; - continue; - case 't': - flags |= OPT_machine_type; - continue; - case 'v': - flags |= OPT_version; - continue; - case 'x': - flags |= OPT_extra; - continue; - case 'A': - flags |= OPT_total|((1L<<OPT_TOTAL)-1); - continue; - case 'R': - flags |= OPT_extended_release; - continue; - case 'S': - sethost = opt_info.arg; - continue; - case ':': - s = "/usr/bin/uname"; - if (!streq(argv[0], s) && (!eaccess(s, X_OK) || !eaccess(s+=4, X_OK))) - { - argv[0] = s; - return sh_run(context, argc, argv); - } - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - break; - } - argv += opt_info.index; - if (error_info.errors || *argv && (flags || sethost) || sethost && flags) - error(ERROR_usage(2), "%s", optusage(NiL)); - if (sethost) - { -#if _lib_sethostname - if (sethostname(sethost, strlen(sethost) + 1)) -#else -#ifdef ENOSYS - errno = ENOSYS; -#else - errno = EPERM; -#endif -#endif - error(ERROR_system(1), "%s: cannot set host name", sethost); - } - else if (list) - astconflist(sfstdout, NiL, ASTCONF_base|ASTCONF_defined|ASTCONF_lower|ASTCONF_quote|ASTCONF_matchcall, "CS|SI"); - else if (*argv) - { - e = &buf[sizeof(buf)-1]; - while (s = *argv++) - { - t = buf; - *t++ = 'C'; - *t++ = 'S'; - *t++ = '_'; - while (t < e && (n = *s++)) - *t++ = islower(n) ? toupper(n) : n; - *t = 0; - sfprintf(sfstdout, "%s%c", *(t = astconf(buf, NiL, NiL)) ? t : *(t = astconf(buf+3, NiL, NiL)) ? t : "unknown", *argv ? ' ' : '\n'); - } - } - else - { - s = buf; - if (!flags) - flags = OPT_system; - memzero(&ut, sizeof(ut)); - if (uname(&ut) < 0) - error(ERROR_usage(2), "information unavailable"); - output(OPT_system, ut.sysname, "sysname"); - if (flags & OPT_nodename) - { -#if !_mem_nodeext_utsname && _lib_gethostname - if (sizeof(ut.nodename) > 9 || gethostname(s, sizeof(buf))) -#endif - s = ut.nodename; - output(OPT_nodename, s, "nodename"); - } - output(OPT_release, ut.release, "release"); - output(OPT_version, ut.version, "version"); - output(OPT_machine, ut.machine, "machine"); - if (flags & OPT_processor) - { - if (!*(s = astconf("ARCHITECTURE", NiL, NiL))) - s = ut.machine; - output(OPT_processor, s, "processor"); - } - if (flags & OPT_implementation) - { - if (!*(s = astconf("PLATFORM", NiL, NiL)) && !*(s = astconf("HW_NAME", NiL, NiL))) - { - if (t = strchr(hosttype, '.')) - t++; - else - t = (char*)hosttype; - strncpy(s = buf, t, sizeof(buf) - 1); - } - output(OPT_implementation, s, "implementation"); - } - if (flags & OPT_operating_system) - { - s = astconf("OPERATING_SYSTEM", NiL, NiL); - if (!*s) -#ifdef _UNAME_os_DEFAULT - s = _UNAME_os_DEFAULT; -#else - s = ut.sysname; -#endif - output(OPT_operating_system, s, "operating-system"); - } - if (flags & OPT_extended_release) - { - s = astconf("RELEASE", NiL, NiL); - output(OPT_extended_release, s, "extended-release"); - } -#if _mem_idnumber_utsname - output(OPT_hostid, ut.idnumber, "hostid"); -#else - if (flags & OPT_hostid) - { - if (!*(s = astconf("HW_SERIAL", NiL, NiL))) -#if _lib_gethostid - sfsprintf(s = buf, sizeof(buf), "%08x", gethostid()); -#else - /*NOP*/; -#endif - output(OPT_hostid, s, "hostid"); - } -#endif - if (flags & OPT_vendor) - { - s = astconf("HW_PROVIDER", NiL, NiL); - output(OPT_vendor, s, "vendor"); - } - if (flags & OPT_domain) - { - if (!*(s = astconf("SRPC_DOMAIN", NiL, NiL))) -#if _lib_getdomainname - getdomainname(s, sizeof(buf)); -#else - /*NOP*/; -#endif - output(OPT_domain, s, "domain"); - } -#if _mem_m_type_utsname - s = ut.m_type; -#else - s = astconf("MACHINE", NiL, NiL); -#endif - output(OPT_machine_type, s, "m_type"); -#if _mem_base_rel_utsname - s = ut.base_rel; -#else - s = astconf("BASE", NiL, NiL); -#endif - output(OPT_base, s, "base_rel"); - if (flags & OPT_extra) - { - char* last = (char*)&ut; - - extra(sysname); - extra(nodename); - extra(release); - extra(version); - extra(machine); -#if _mem_idnumber_utsname - extra(idnumber); -#endif -#if _mem_m_type_utsname - extra(m_type); -#endif -#if _mem_base_rel_utsname - extra(base_rel); -#endif - if (last < ((char*)(&ut + 1))) - { - s = t = last; - while (s < (char*)(&ut + 1)) - { - if (!(n = *s++)) - { - if ((s - t) > 1) - { - if (sep) - sfputc(sfstdout, ' '); - else - sep = 1; - sfputr(sfstdout, t, -1); - } - t = s; - } - else if (!isprint(n)) - break; - } - } - } - if (sep) - sfputc(sfstdout, '\n'); - } - return error_info.errors; -} diff --git a/usr/src/lib/libcmd/common/uniq.c b/usr/src/lib/libcmd/common/uniq.c deleted file mode 100644 index 78fee1c603..0000000000 --- a/usr/src/lib/libcmd/common/uniq.c +++ /dev/null @@ -1,338 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * uniq - * - * Written by David Korn - */ - -static const char usage[] = -"[-n?\n@(#)$Id: uniq (AT&T Research) 2009-11-28 $\n]" -USAGE_LICENSE -"[+NAME?uniq - Report or filter out repeated lines in a file]" -"[+DESCRIPTION?\buniq\b reads the input, compares adjacent lines, and " - "writes one copy of each input line on the output. The second " - "and succeeding copies of the repeated adjacent lines are not " - "written.]" -"[+?If the output file, \aoutfile\a, is not specified, \buniq\b writes " - "to standard output. If no \ainfile\a is given, or if the \ainfile\a " - "is \b-\b, \buniq\b reads from standard input with the start of " - "the file defined as the current offset.]" -"[c:count?Output the number of times each line occurred along with " - "the line.]" -"[d:repeated|duplicates?Output the first of each duplicate line.]" -"[D:all-repeated?Output all duplicate lines as a group with an empty " - "line delimiter specified by \adelimit\a:]:?[delimit:=none]" - "{" - "[n:none?Do not delimit duplicate groups.]" - "[p:prepend?Prepend an empty line before each group.]" - "[s:separate?Separate each group with an empty line.]" - "}" -"[f:skip-fields]#[fields?\afields\a is the number of fields to skip over " - "before checking for uniqueness. A field is the minimal string matching " - "the BRE \b[[:blank:]]]]*[^[:blank:]]]]*\b. -\anumber\a is equivalent to " - "\b--skip-fields\b=\anumber\a.]" -"[i:ignore-case?Ignore case in comparisons.]" -"[s:skip-chars]#[chars?\achars\a is the number of characters to skip over " - "before checking for uniqueness. If specified along with \b-f\b, " - "the first \achars\a after the first \afields\a are ignored. If " - "the \achars\a specifies more characters than are on the line, " - "an empty string will be used for comparison. +\anumber\a is " - "equivalent to \b--skip-chars\b=\anumber\a.]" -"[u:unique?Output unique lines.]" -"[w:check-chars]#[chars?\achars\a is the number of characters to compare " - "after skipping any specified fields and characters.]" -"\n" -"\n[infile [outfile]]\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?The input file was successfully processed.]" - "[+>0?An error occurred.]" -"}" -"[+SEE ALSO?\bsort\b(1), \bgrep\b(1)]" -; - -#include <cmd.h> - -#define C_FLAG 1 -#define D_FLAG 2 -#define U_FLAG 4 - -#define CWIDTH 4 -#define MAXCNT 9999 - -typedef int (*Compare_f)(const char*, const char*, size_t); - -static int uniq(Sfio_t *fdin, Sfio_t *fdout, int fields, int chars, int width, int mode, int* all, Compare_f compare) -{ - register int n, f, outsize=0, mb = mbwide(); - register char *cp, *ep, *mp, *bufp, *outp; - char *orecp, *sbufp=0, *outbuff; - int reclen,oreclen= -1,count=0,cwidth=0,sep,next; - if(mode&C_FLAG) - cwidth = CWIDTH+1; - while(1) - { - if(bufp = sfgetr(fdin,'\n',0)) - n = sfvalue(fdin); - else if(bufp = sfgetr(fdin,'\n',SF_LASTR)) - { - n = sfvalue(fdin); - bufp = memcpy(fmtbuf(n + 1), bufp, n); - bufp[n++] = '\n'; - } - else - n = 0; - if (n) - { - cp = bufp; - ep = cp + n; - if (f = fields) - while (f-->0 && cp<ep) /* skip over fields */ - { - while (cp<ep && *cp==' ' || *cp=='\t') - cp++; - while (cp<ep && *cp!=' ' && *cp!='\t') - cp++; - } - if (chars) - { - if (mb) - for (f = chars; f; f--) - mbchar(cp); - else - cp += chars; - } - if ((reclen = n - (cp - bufp)) <= 0) - { - reclen = 1; - cp = bufp + n - 1; - } - else if (width >= 0 && width < reclen) - { - if (mb) - { - reclen = 0; - mp = cp; - while (reclen < width && mp < ep) - { - reclen++; - mbchar(mp); - } - reclen = mp - cp; - } - else - reclen = width; - } - } - else - reclen = -2; - if(reclen==oreclen && (!reclen || !(*compare)(cp,orecp,reclen))) - { - count++; - if (!all) - continue; - next = count; - } - else - { - next = 0; - if(outsize>0) - { - if(((mode&D_FLAG)&&count==0) || ((mode&U_FLAG)&&count)) - { - if(outp!=sbufp) - sfwrite(fdout,outp,0); - } - else - { - if(cwidth) - { - if(count<9) - { - f = 0; - while(f < CWIDTH-1) - outp[f++] = ' '; - outp[f++] = '0' + count + 1; - outp[f] = ' '; - } - else if(count<MAXCNT) - { - count++; - f = CWIDTH; - outp[f--] = ' '; - do - { - outp[f--] = '0' + (count % 10); - } while (count /= 10); - while (f >= 0) - outp[f--] = ' '; - } - else - { - outsize -= (CWIDTH+1); - if(outp!=sbufp) - { - if(!(sbufp=fmtbuf(outsize))) - return(1); - memcpy(sbufp,outp+CWIDTH+1,outsize); - sfwrite(fdout,outp,0); - outp = sbufp; - } - else - outp += CWIDTH+1; - sfprintf(fdout,"%4d ",count+1); - } - } - if(sfwrite(fdout,outp,outsize) != outsize) - return(1); - } - } - } - if(n==0) - break; - if(count = next) - { - if(sfwrite(fdout,outp,outsize) != outsize) - return(1); - if(*all >= 0) - *all = 1; - sep = 0; - } - else - sep = all && *all > 0; - /* save current record */ - if (!(outbuff = sfreserve(fdout, 0, 0)) || (outsize = sfvalue(fdout)) < 0) - return(1); - outp = outbuff; - if(outsize < n+cwidth+sep) - { - /* no room in outp, clear lock and use side buffer */ - sfwrite(fdout,outp,0); - if(!(sbufp = outp=fmtbuf(outsize=n+cwidth+sep))) - return(1); - } - else - outsize = n+cwidth+sep; - memcpy(outp+cwidth+sep,bufp,n); - if(sep) - outp[cwidth] = '\n'; - oreclen = reclen; - orecp = outp+cwidth+sep + (cp-bufp); - } - return(0); -} - -int -b_uniq(int argc, char** argv, void* context) -{ - register int n, mode=0; - register char *cp; - int fields=0, chars=0, width=-1; - Sfio_t *fpin, *fpout; - int* all = 0; - int sep; - Compare_f compare = (Compare_f)memcmp; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - while (n = optget(argv, usage)) switch (n) - { - case 'c': - mode |= C_FLAG; - break; - case 'd': - mode |= D_FLAG; - break; - case 'D': - mode |= D_FLAG; - switch ((int)opt_info.num) - { - case 'p': - sep = 1; - break; - case 's': - sep = 0; - break; - default: - sep = -1; - break; - } - all = &sep; - break; - case 'i': - compare = (Compare_f)strncasecmp; - break; - case 'u': - mode |= U_FLAG; - break; - case 'f': - if(*opt_info.option=='-') - fields = opt_info.num; - else - chars = opt_info.num; - break; - case 's': - chars = opt_info.num; - break; - case 'w': - width = opt_info.num; - break; - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - argv += opt_info.index; - if(all && (mode&C_FLAG)) - error(2, "-c and -D are mutually exclusive"); - if(error_info.errors) - error(ERROR_usage(2), "%s", optusage(NiL)); - if((cp = *argv) && (argv++,!streq(cp,"-"))) - { - if(!(fpin = sfopen(NiL,cp,"r"))) - error(ERROR_system(1),"%s: cannot open",cp); - } - else - fpin = sfstdin; - if(cp = *argv) - { - argv++; - if(!(fpout = sfopen(NiL,cp,"w"))) - error(ERROR_system(1),"%s: cannot create",cp); - } - else - fpout = sfstdout; - if(*argv) - { - error(2, "too many arguments"); - error(ERROR_usage(2), "%s", optusage(NiL)); - } - error_info.errors = uniq(fpin,fpout,fields,chars,width,mode,all,compare); - if(fpin!=sfstdin) - sfclose(fpin); - if(fpout!=sfstdout) - sfclose(fpout); - return(error_info.errors); -} - diff --git a/usr/src/lib/libcmd/common/vmstate.c b/usr/src/lib/libcmd/common/vmstate.c deleted file mode 100644 index 79722972d2..0000000000 --- a/usr/src/lib/libcmd/common/vmstate.c +++ /dev/null @@ -1,163 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped - -#define FORMAT "region=%(region)p size=%(size)d segments=%(segments)d busy=(%(busy_size)d,%(busy_blocks)d,%(busy_max)d) free=(%(free_size)d,%(free_blocks)d,%(free_max)d)" - -static const char usage[] = -"[-?\n@(#)$Id: vmstate (AT&T Research) 2010-03-05 $\n]" -USAGE_LICENSE -"[+NAME?vmstate - list the calling process vmalloc region state]" -"[+DESCRIPTION?When invoked as a shell builtin, \bvmstate\b lists the " - "calling process \bvmalloc\b(3) state for all regions.]" -"[f:format?List the ids specified by \aformat\a. \aformat\a follows " - "\bprintf\b(3) conventions, except that \bsfio\b(3) inline ids are used " - "instead of arguments: " - "%[-+]][\awidth\a[.\aprecis\a[.\abase\a]]]]]](\aid\a)\achar\a. The " - "supported \aid\as are:]:[format:=" FORMAT "]" - "{" - "[+size?The total region size.]" - "[+segments?The number of segments in the region.]" - "[+busy_size?The total busy block size.]" - "[+busy_blocks?The number of busy blocks.]" - "[+busy_max?The maximum busy block size.]" - "[+free_size?The total free block size.]" - "[+free_blocks?The number of free blocks.]" - "[+free_max?The maximum free block size.]" - "}" -"[+SEE ALSO?\bvmalloc\b(3)]" -; - -#include <cmd.h> -#include <vmalloc.h> - -typedef struct State_s -{ - char* format; - Vmalloc_t* vm; - Vmstat_t vs; - unsigned int regions; - Vmalloc_t* region[256]; -} State_t; - -/* - * sfkeyprintf() lookup - * handle==0 for heading - */ - -static int -key(void* handle, Sffmt_t* fp, const char* arg, char** ps, Sflong_t* pn) -{ - register State_t* state = (State_t*)handle; - register char* s; - - if (!(s = fp->t_str) || streq(s, "size")) - *pn = state->vs.extent; - else if (streq(s, "region")) - *pn = integralof(state->vm); - else if (streq(s, "segments")) - *pn = state->vs.n_seg; - else if (streq(s, "busy_size")) - *pn = state->vs.s_busy; - else if (streq(s, "busy_blocks")) - *pn = state->vs.n_busy; - else if (streq(s, "busy_max")) - *pn = state->vs.m_busy; - else if (streq(s, "free_size")) - *pn = state->vs.s_free; - else if (streq(s, "free_blocks")) - *pn = state->vs.n_free; - else if (streq(s, "free_max")) - *pn = state->vs.m_free; - else if (streq(s, "format")) - *ps = (char*)state->format; - else - { - error(2, "%s: unknown format identifier", s); - return 0; - } - return 1; -} - -static int -visit(Vmalloc_t* vm, void* addr, size_t size, Vmdisc_t* disc, void* handle) -{ - State_t* state = (State_t*)handle; - Vmstat_t vs; - - if (vm != state->vm) - { - state->vm = vm; - if (state->regions < elementsof(state->region)) - state->region[state->regions++] = vm; - } - return 0; -} - -int -b_vmstate(int argc, char** argv, void* context) -{ - register int i; - State_t state; - - memset(&state, 0, sizeof(state)); - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - for (;;) - { - switch (optget(argv, usage)) - { - case 'f': - state.format = opt_info.arg; - continue; - case '?': - error(ERROR_USAGE|4, "%s", opt_info.arg); - continue; - case ':': - error(2, "%s", opt_info.arg); - continue; - } - break; - } - argv += opt_info.index; - if (error_info.errors || *argv) - error(ERROR_USAGE|4, "%s", optusage(NiL)); - if (!state.format) - state.format = FORMAT; - - /* - * the walk must do no allocations because it locks the regions - */ - - vmwalk(NiL, visit, &state); - - /* - * now we can compute and list the state of each region - */ - - for (i = 0; i < state.regions; i++) - { - state.vm = state.region[i]; - vmstat(state.vm, &state.vs); - sfkeyprintf(sfstdout, &state, state.format, key, NiL); - sfprintf(sfstdout, "\n"); - } - return 0; -} diff --git a/usr/src/lib/libcmd/common/wc.c b/usr/src/lib/libcmd/common/wc.c deleted file mode 100644 index 7c988872db..0000000000 --- a/usr/src/lib/libcmd/common/wc.c +++ /dev/null @@ -1,188 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * AT&T Bell Laboratories - * - * count the number of bytes, words, and lines in a file - */ - -static const char usage[] = -"[-?\n@(#)$Id: wc (AT&T Research) 2009-11-28 $\n]" -USAGE_LICENSE -"[+NAME?wc - print the number of bytes, words, and lines in files]" -"[+DESCRIPTION?\bwc\b reads one or more input files and, by default, " - "for each file writes a line containing the number of newlines, " - "\aword\as, and bytes contained in each file followed by the " - "file name to standard output in that order. A \aword\a is " - "defined to be a non-zero length string delimited by \bisspace\b(3) " - "characters.]" -"[+?If more than one file is specified, \bwc\b writes a total count " - "for all of the named files with \btotal\b written instead " - "of the file name.]" -"[+?By default, \bwc\b writes all three counts. Options can specified " - "so that only certain counts are written. The options \b-c\b " - "and \b-m\b are mutually exclusive.]" -"[+?If no \afile\a is given, or if the \afile\a is \b-\b, \bwc\b " - "reads from standard input and no filename is written to standard " - "output. The start of the file is defined as the current offset.]" -"[l:lines?List the line counts.]" -"[w:words?List the word counts.]" -"[c:bytes|chars:chars?List the byte counts.]" -"[m|C:multibyte-chars?List the character counts.]" -"[q:quiet?Suppress invalid multibyte character warnings.]" -"[L:longest-line|max-line-length?List the longest line length; the newline," - "if any, is not counted in the length.]" -"[N!:utf8?For \bUTF-8\b locales \b--noutf8\b disables \bUTF-8\b " - "optimzations and relies on the native \bmbtowc\b(3).]" -"\n" -"\n[file ...]\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?All files processed successfully.]" - "[+>0?One or more files failed to open or could not be read.]" -"}" -"[+SEE ALSO?\bcat\b(1), \bisspace\b(3)]" -; - - -#include <cmd.h> -#include <wc.h> -#include <ls.h> - -#define ERRORMAX 125 - -static void printout(register Wc_t *wp, register char *name,register int mode) -{ - if (mode&WC_LINES) - sfprintf(sfstdout," %7I*d",sizeof(wp->lines),wp->lines); - if (mode&WC_WORDS) - sfprintf(sfstdout," %7I*d",sizeof(wp->words),wp->words); - if (mode&WC_CHARS) - sfprintf(sfstdout," %7I*d",sizeof(wp->chars),wp->chars); - if (mode&WC_LONGEST) - sfprintf(sfstdout," %7I*d",sizeof(wp->chars),wp->longest); - if (name) - sfprintf(sfstdout," %s",name); - sfputc(sfstdout,'\n'); -} - -int -b_wc(int argc,register char **argv, void* context) -{ - register char *cp; - register int mode=0, n; - register Wc_t *wp; - Sfio_t *fp; - Sfoff_t tlines=0, twords=0, tchars=0; - struct stat statb; - - cmdinit(argc, argv, context, ERROR_CATALOG, 0); - for (;;) - { - switch (optget(argv, usage)) - { - case 'c': - mode |= WC_CHARS; - continue; - case 'l': - mode |= WC_LINES; - continue; - case 'L': - mode |= WC_LONGEST; - continue; - case 'N': - if (!opt_info.num) - mode |= WC_NOUTF8; - continue; - case 'm': - case 'C': - mode |= WC_MBYTE; - continue; - case 'q': - mode |= WC_QUIET; - continue; - case 'w': - mode |= WC_WORDS; - continue; - case ':': - error(2, "%s", opt_info.arg); - break; - case '?': - error(ERROR_usage(2), "%s", opt_info.arg); - break; - } - break; - } - argv += opt_info.index; - if (error_info.errors) - error(ERROR_usage(2), "%s", optusage(NiL)); - if (mode&WC_MBYTE) - { - if (mode&WC_CHARS) - error(2, "-c and -C are mutually exclusive"); - if (!mbwide()) - mode &= ~WC_MBYTE; - mode |= WC_CHARS; - } - if (!(mode&(WC_WORDS|WC_CHARS|WC_LINES|WC_MBYTE|WC_LONGEST))) - mode |= (WC_WORDS|WC_CHARS|WC_LINES); - if (!(wp = wc_init(mode))) - error(3,"internal error"); - if (cp = *argv) - argv++; - n = 0; - do - { - if (!cp || streq(cp,"-")) - fp = sfstdin; - else if (!(fp = sfopen(NiL,cp,"r"))) - { - error(ERROR_system(0),"%s: cannot open",cp); - continue; - } - if (cp) - n++; - if (!(mode&(WC_WORDS|WC_LINES|WC_MBYTE|WC_LONGEST)) && fstat(sffileno(fp),&statb)>=0 - && S_ISREG(statb.st_mode)) - { - wp->chars = statb.st_size - lseek(sffileno(fp),0L,1); - lseek(sffileno(fp),0L,2); - } - else - wc_count(wp, fp, cp); - if (fp!=sfstdin) - sfclose(fp); - tchars += wp->chars; - twords += wp->words; - tlines += wp->lines; - printout(wp,cp,mode); - } while (cp= *argv++); - if (n > 1) - { - wp->lines = tlines; - wp->chars = tchars; - wp->words = twords; - printout(wp,"total",mode); - } - return error_info.errors<ERRORMAX?error_info.errors:ERRORMAX; -} diff --git a/usr/src/lib/libcmd/common/wc.h b/usr/src/lib/libcmd/common/wc.h deleted file mode 100644 index cb2a51ed5f..0000000000 --- a/usr/src/lib/libcmd/common/wc.h +++ /dev/null @@ -1,59 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * AT&T Bell Laboratories - * - * header for wc library interface - */ - -#ifndef _WC_H -#define _WC_H - -#include <ast.h> - -#define WC_LINES 0x01 -#define WC_WORDS 0x02 -#define WC_CHARS 0x04 -#define WC_MBYTE 0x08 -#define WC_LONGEST 0x10 -#define WC_QUIET 0x20 -#define WC_NOUTF8 0x40 - -typedef struct -{ - char type[1<<CHAR_BIT]; - Sfoff_t words; - Sfoff_t lines; - Sfoff_t chars; - Sfoff_t longest; - int mode; - int mb; -} Wc_t; - -#define wc_count _cmd_wccount -#define wc_init _cmd_wcinit - -extern Wc_t* wc_init(int); -extern int wc_count(Wc_t*, Sfio_t*, const char*); - -#endif /* _WC_H */ diff --git a/usr/src/lib/libcmd/common/wclib.c b/usr/src/lib/libcmd/common/wclib.c deleted file mode 100644 index 77732723ab..0000000000 --- a/usr/src/lib/libcmd/common/wclib.c +++ /dev/null @@ -1,505 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * David Korn - * AT&T Bell Laboratories - * - * library interface for word count - */ - -#include <cmd.h> -#include <wc.h> -#include <ctype.h> - -#if _hdr_wchar && _hdr_wctype && _lib_iswctype - -#include <wchar.h> -#include <wctype.h> -#include <lc.h> - -#else - -#ifndef iswspace -#define iswspace(x) isspace(x) -#endif - -#endif - -#define WC_SP 0x08 -#define WC_NL 0x10 -#define WC_MB 0x20 -#define WC_ERR 0x40 - -#define eol(c) ((c)&WC_NL) -#define mbc(c) ((c)&WC_MB) -#define spc(c) ((c)&WC_SP) -#define mb2wc(w,p,n) (*ast.mb_towc)(&w,(char*)p,n) - -Wc_t* wc_init(int mode) -{ - register int n; - register int w; - Wc_t* wp; - - if (!(wp = (Wc_t*)stakalloc(sizeof(Wc_t)))) - return 0; - if (!mbwide()) - wp->mb = 0; -#if _hdr_wchar && _hdr_wctype && _lib_iswctype - else if (!(mode & WC_NOUTF8) && (lcinfo(LC_CTYPE)->lc->flags & LC_utf8)) - wp->mb = 1; -#endif - else - wp->mb = -1; - w = mode & WC_WORDS; - for (n = (1<<CHAR_BIT); --n >= 0;) - wp->type[n] = (w && isspace(n)) ? WC_SP : 0; - wp->type['\n'] = WC_SP|WC_NL; - if ((mode & (WC_MBYTE|WC_WORDS)) && wp->mb > 0) - { - for (n = 0; n < 64; n++) - { - wp->type[0x80+n] |= WC_MB; - if (n<32) - wp->type[0xc0+n] |= WC_MB+1; - else if (n<48) - wp->type[0xc0+n] |= WC_MB+2; - else if (n<56) - wp->type[0xc0+n] |= WC_MB+3; - else if (n<60) - wp->type[0xc0+n] |= WC_MB+4; - else if (n<62) - wp->type[0xc0+n] |= WC_MB+5; - } - wp->type[0xc0] = WC_MB|WC_ERR; - wp->type[0xc1] = WC_MB|WC_ERR; - wp->type[0xfe] = WC_MB|WC_ERR; - wp->type[0xff] = WC_MB|WC_ERR; - } - wp->mode = mode; - return wp; -} - -static int invalid(const char *file, int nlines) -{ - error_info.file = (char*)file; - error_info.line = nlines; - error(ERROR_SYSTEM|1, "invalid multibyte character"); - error_info.file = 0; - error_info.line = 0; - return nlines; -} - -/* - * handle utf space characters - */ - -static int chkstate(int state, register unsigned int c) -{ - switch(state) - { - case 1: - state = (c==0x9a?4:0); - break; - case 2: - state = ((c==0x80||c==0x81)?6+(c&1):0); - break; - case 3: - state = (c==0x80?5:0); - break; - case 4: - state = (c==0x80?10:0); - break; - case 5: - state = (c==0x80?10:0); - break; - case 6: - state = 0; - if(c==0xa0 || c==0xa1) - return(10); - else if((c&0xf0)== 0x80) - { - if((c&=0xf)==7) - return(iswspace(0x2007)?10:0); - if(c<=0xb) - return(10); - } - else if(c==0xaf && iswspace(0x202f)) - return(10); - break; - case 7: - state = (c==0x9f?10:0); - break; - case 8: - return (iswspace(c)?10:0); - } - return state; -} - -/* - * compute the line, word, and character count for file <fd> - */ - -int wc_count(Wc_t *wp, Sfio_t *fd, const char* file) -{ - register char* type = wp->type; - register unsigned char* cp; - register Sfoff_t nbytes; - register Sfoff_t nchars; - register Sfoff_t nwords; - register Sfoff_t nlines; - register Sfoff_t eline = -1; - register Sfoff_t longest = 0; - register ssize_t c; - register unsigned char* endbuff; - register int lasttype = WC_SP; - unsigned int lastchar; - ssize_t n; - ssize_t o; - unsigned char* buff; - wchar_t x; - unsigned char side[32]; - - sfset(fd,SF_WRITE,1); - nlines = nwords = nchars = nbytes = 0; - wp->longest = 0; - if (wp->mb < 0 && (wp->mode & (WC_MBYTE|WC_WORDS))) - { - cp = buff = endbuff = 0; - for (;;) - { - if (cp >= endbuff || (n = mb2wc(x, cp, endbuff-cp)) < 0) - { - if ((o = endbuff-cp) < sizeof(side)) - { - if (buff) - { - if (o) - memcpy(side, cp, o); - mbinit(); - } - else - o = 0; - cp = side + o; - if (!(buff = (unsigned char*)sfreserve(fd, SF_UNBOUND, 0)) || (n = sfvalue(fd)) <= 0) - { - if ((nchars - longest) > wp->longest) - wp->longest = nchars - longest; - break; - } - nbytes += n; - if ((c = sizeof(side) - o) > n) - c = n; - if (c) - memcpy(cp, buff, c); - endbuff = buff + n; - cp = side; - x = mbchar(cp); - if ((cp-side) < o) - { - cp = buff; - nchars += (cp-side) - 1; - } - else - cp = buff + (cp-side) - o; - } - else - { - cp++; - x = -1; - } - if (x == -1 && eline != nlines && !(wp->mode & WC_QUIET)) - eline = invalid(file, nlines); - } - else - cp += n ? n : 1; - if (x == '\n') - { - if ((nchars - longest) > wp->longest) - wp->longest = nchars - longest; - longest = nchars + 1; - nlines++; - lasttype = 1; - } - else if (iswspace(x)) - lasttype = 1; - else if (lasttype) - { - lasttype = 0; - nwords++; - } - nchars++; - } - if (!(wp->mode & WC_MBYTE)) - nchars = nbytes; - } - else if (!wp->mb && !(wp->mode & WC_LONGEST) || wp->mb > 0 && !(wp->mode & (WC_MBYTE|WC_WORDS|WC_LONGEST))) - { - if (!(wp->mode & (WC_MBYTE|WC_WORDS|WC_LONGEST))) - { - while ((cp = (unsigned char*)sfreserve(fd, SF_UNBOUND, 0)) && (c = sfvalue(fd)) > 0) - { - nchars += c; - endbuff = cp + c; - if (*--endbuff == '\n') - nlines++; - else - *endbuff = '\n'; - for (;;) - if (*cp++ == '\n') - { - if (cp > endbuff) - break; - nlines++; - } - } - } - else - { - while ((cp = buff = (unsigned char*)sfreserve(fd, SF_UNBOUND, 0)) && (c = sfvalue(fd)) > 0) - { - nchars += c; - /* check to see whether first character terminates word */ - if (c==1) - { - if (eol(lasttype)) - nlines++; - if ((c = type[*cp]) && !lasttype) - nwords++; - lasttype = c; - continue; - } - if (!lasttype && type[*cp]) - nwords++; - lastchar = cp[--c]; - *(endbuff = cp+c) = '\n'; - c = lasttype; - /* process each buffer */ - for (;;) - { - /* process spaces and new-lines */ - do - { - if (eol(c)) - for (;;) - { - /* check for end of buffer */ - if (cp > endbuff) - goto beob; - nlines++; - if (*cp != '\n') - break; - cp++; - } - } while (c = type[*cp++]); - /* skip over word characters */ - while (!(c = type[*cp++])); - nwords++; - } - beob: - if ((cp -= 2) >= buff) - c = type[*cp]; - else - c = lasttype; - lasttype = type[lastchar]; - /* see if was in word */ - if (!c && !lasttype) - nwords--; - } - if (eol(lasttype)) - nlines++; - else if (!lasttype) - nwords++; - } - } - else - { - int lineoff=0; - int skip=0; - int adjust=0; - int state=0; - int oldc; - int xspace; - int wasspace = 1; - unsigned char* start; - - lastchar = 0; - start = (endbuff = side) + 1; - xspace = iswspace(0xa0) || iswspace(0x85); - while ((cp = buff = (unsigned char*)sfreserve(fd, SF_UNBOUND, 0)) && (c = sfvalue(fd)) > 0) - { - nbytes += c; - nchars += c; - start = cp-lineoff; - /* check to see whether first character terminates word */ - if(c==1) - { - if(eol(lasttype)) - nlines++; - if((c = type[*cp]) && !lasttype) - nwords++; - lasttype = c; - endbuff = start; - continue; - } - lastchar = cp[--c]; - endbuff = cp+c; - cp[c] = '\n'; - if(mbc(lasttype)) - { - c = lasttype; - goto mbyte; - } - if(!lasttype && spc(type[*cp])) - nwords++; - c = lasttype; - /* process each buffer */ - for (;;) - { - /* process spaces and new-lines */ - spaces: - do - { - if (eol(c)) - { - /* check for end of buffer */ - if (cp > endbuff) - goto eob; - if(wp->mode&WC_LONGEST) - { - if((cp-start)-adjust > longest) - longest = (cp-start)-adjust-1; - start = cp; - } - nlines++; - nchars -= adjust; - adjust = 0; - } - } while (spc(c = type[*cp++])); - wasspace=1; - if(mbc(c)) - { - mbyte: - do - { - if(c&WC_ERR) - goto err; - if(skip && (c&7)) - break; - if(!skip) - { - if(!(c&7)) - { - skip=1; - break; - } - skip = (c&7); - adjust += skip; - state = 0; - if(skip==2 && (cp[-1]&0xc)==0 && (state=(cp[-1]&0x3))) - oldc = *cp; - else if(xspace && cp[-1]==0xc2) - { - state = 8; - oldc = *cp; - } - } - else - { - skip--; - if(state && (state=chkstate(state,oldc))) - { - if(state==10) - { - if(!wasspace) - nwords++; - wasspace = 1; - state=0; - goto spaces; - } - oldc = *cp; - } - } - } while (mbc(c = type[*cp++])); - wasspace = 0; - if(skip) - { - if(eol(c) && (cp > endbuff)) - goto eob; - err: - skip = 0; - state = 0; - if(eline!=nlines && !(wp->mode & WC_QUIET)) - eline = invalid(file, nlines); - while(mbc(c) && ((c|WC_ERR) || (c&7)==0)) - c=type[*cp++]; - if(eol(c) && (cp > endbuff)) - { - c = WC_MB|WC_ERR; - goto eob; - } - if(mbc(c)) - goto mbyte; - else if(c&WC_SP) - goto spaces; - } - if(spc(c)) - { - nwords++; - continue; - } - } - /* skip over word characters */ - while(!(c = type[*cp++])); - if(mbc(c)) - goto mbyte; - nwords++; - } - eob: - lineoff = cp-start; - if((cp -= 2) >= buff) - c = type[*cp]; - else - c = lasttype; - lasttype = type[lastchar]; - /* see if was in word */ - if(!c && !lasttype) - nwords--; - } - if ((wp->mode&WC_LONGEST) && ((endbuff + 1 - start) - adjust - (lastchar == '\n')) > longest) - longest = (endbuff + 1 - start) - adjust - (lastchar == '\n'); - wp->longest = longest; - if (eol(lasttype)) - nlines++; - else if (!lasttype) - nwords++; - if (wp->mode & WC_MBYTE) - nchars -= adjust; - else - nchars = nbytes; - } - wp->chars = nchars; - wp->words = nwords; - wp->lines = nlines; - return 0; -} - diff --git a/usr/src/lib/libcmd/i386/Makefile b/usr/src/lib/libcmd/i386/Makefile deleted file mode 100644 index 6cbbf06d61..0000000000 --- a/usr/src/lib/libcmd/i386/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright (c) 1997-2001 by Sun Microsystems, Inc. -# All rights reserved. -# - -include ../Makefile.com - -all: $(LIBS) - -install: all $(ROOTLIBS) $(ROOTLINKS) diff --git a/usr/src/lib/libcmd/i386/include/ast/cmd.h b/usr/src/lib/libcmd/i386/include/ast/cmd.h deleted file mode 100644 index e064222a77..0000000000 --- a/usr/src/lib/libcmd/i386/include/ast/cmd.h +++ /dev/null @@ -1,174 +0,0 @@ - -/* : : generated by proto : : */ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ - -/* - * AT&T Research - * - * builtin cmd definitions - */ - -#ifndef _CMD_H -#if !defined(__PROTO__) -#include <prototyped.h> -#endif -#if !defined(__LINKAGE__) -#define __LINKAGE__ /* 2004-08-11 transition */ -#endif - -#define _CMD_H - -#include <ast.h> -#include <error.h> -#include <stak.h> -#include <shcmd.h> - -#define cmdinit _cmd_init - -#define ERROR_CALLBACK ERROR_SET - -#if _BLD_cmd && defined(__EXPORT__) -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ __EXPORT__ -#endif - -#include <cmdext.h> - -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ - -#if defined(CMD_BUILTIN) && !defined(CMD_STANDALONE) -#define CMD_STANDALONE CMD_BUILTIN -#endif - -#ifdef CMD_STANDALONE - -#define CMD_CONTEXT(c) ((Shbltin_t*)0) - -#if CMD_DYNAMIC - -#include <dlldefs.h> - -#else - -extern __MANGLE__ int CMD_STANDALONE __PROTO__((int, char**, __V_*)); - -#endif - -#ifndef CMD_BUILTIN - -/* - * command initialization - */ - -static int -cmdinit __PARAM__((int argc, register char** argv, __V_* context, const char* catalog, int flags), (argc, argv, context, catalog, flags)) __OTORP__(int argc; register char** argv; __V_* context; const char* catalog; int flags;){ - register char* cp; - register char* pp; - - if (cp = strrchr(argv[0], '/')) - cp++; - else - cp = argv[0]; - if (pp = strrchr(cp, '_')) - cp = pp + 1; - error_info.id = cp; - if (!error_info.catalog) - error_info.catalog = (char*)catalog; - opt_info.index = 0; - if (context) - error_info.flags |= flags & ~(ERROR_CALLBACK|ERROR_NOTIFY); - return 0; -} - -#endif - -int -main __PARAM__((int argc, char** argv), (argc, argv)) __OTORP__(int argc; char** argv;){ -#if CMD_DYNAMIC - register char* s; - register char* t; - __V_* dll; - Shbltin_f fun; - char buf[64]; - - if (s = strrchr(argv[0], '/')) - s++; - else if (!(s = argv[0])) - return 127; - if ((t = strrchr(s, '_')) && *++t) - s = t; - buf[0] = '_'; - buf[1] = 'b'; - buf[2] = '_'; - strncpy(buf + 3, s, sizeof(buf) - 4); - buf[sizeof(buf) - 1] = 0; - if (t = strchr(buf, '.')) - *t = 0; - for (;;) - { - if (dll = dlopen(NiL, RTLD_LAZY)) - { - if (fun = (Shbltin_f)dlsym(dll, buf + 1)) - break; - if (fun = (Shbltin_f)dlsym(dll, buf)) - break; - } - if (dll = dllplug(NiL, "cmd", NiL, RTLD_LAZY, NiL, 0)) - { - if (fun = (Shbltin_f)dlsym(dll, buf + 1)) - break; - if (fun = (Shbltin_f)dlsym(dll, buf)) - break; - } - return 127; - } - return (*fun)(argc, argv, NiL); -#else - return CMD_STANDALONE(argc, argv, NiL); -#endif -} - -#else - -#undef cmdinit -#ifdef _MSC_VER -#define CMD_CONTEXT(p) ((Shbltin_t*)(p)) -#define cmdinit(a,b,c,d,e) do{if(_cmd_init(a,b,c,d,e))return -1;}while(0) -#else -#define CMD_CONTEXT(p) (((p)&&((Shbltin_t*)(p))->version>=20071012&&((Shbltin_t*)(p))->version<20350101)?((Shbltin_t*)(p)):0) -#define cmdinit(a,b,c,d,e) do{if((c)&&!CMD_CONTEXT(c))c=0;if(_cmd_init(a,b,c,d,e))return -1;}while(0) -#endif - -#if _BLD_cmd && defined(__EXPORT__) -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ __EXPORT__ -#endif - -extern __MANGLE__ int _cmd_init __PROTO__((int, char**, __V_*, const char*, int)); - -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ - -#endif - -#endif diff --git a/usr/src/lib/libcmd/i386/include/ast/cmdext.h b/usr/src/lib/libcmd/i386/include/ast/cmdext.h deleted file mode 100644 index 978322e2d3..0000000000 --- a/usr/src/lib/libcmd/i386/include/ast/cmdext.h +++ /dev/null @@ -1,77 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ - -/* : : generated by proto : : */ - -#if !defined(__PROTO__) -#include <prototyped.h> -#endif -#if !defined(__LINKAGE__) -#define __LINKAGE__ /* 2004-08-11 transition */ -#endif -extern __MANGLE__ int b_basename __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cat __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_chgrp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_chmod __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_chown __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cksum __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cmp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_comm __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cut __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_date __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_dirname __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_egrep __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_expr __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fds __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fgrep __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fmt __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fold __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_getconf __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_grep __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_head __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_id __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_join __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_ln __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_logname __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_md5sum __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mkdir __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mkfifo __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mktemp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mv __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_paste __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_pathchk __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_pids __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_rev __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_readlink __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_rm __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_rmdir __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_stty __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_sum __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_sync __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_tail __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_tee __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_tty __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_uname __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_uniq __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_vmstate __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_wc __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_xgrep __PROTO__((int, char**, __V_*)); diff --git a/usr/src/lib/libcmd/i386/src/lib/libcmd/FEATURE/ids b/usr/src/lib/libcmd/i386/src/lib/libcmd/FEATURE/ids deleted file mode 100644 index 9ebd27114b..0000000000 --- a/usr/src/lib/libcmd/i386/src/lib/libcmd/FEATURE/ids +++ /dev/null @@ -1,15 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_i386_32bit/src/lib/libcmd/features/ids by iffe version 2009-12-04 : : */ -#ifndef _def_ids_cmd -#define _def_ids_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_i386_32bit/arch/sol11.i386/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _lib_endgrent 1 /* endgrent() in default lib(s) */ -#define _lib_getgrent 1 /* getgrent() in default lib(s) */ -#define _lib_setgrent 1 /* setgrent() in default lib(s) */ -#define _sys_fss 1 /* #include <sys/fss.h> ok */ -#if !_lib_fsid && _mac_fsid -#define _lib_fsid 1 -#endif - -#endif diff --git a/usr/src/lib/libcmd/i386/src/lib/libcmd/FEATURE/sockets b/usr/src/lib/libcmd/i386/src/lib/libcmd/FEATURE/sockets deleted file mode 100644 index 6fb96ec2c6..0000000000 --- a/usr/src/lib/libcmd/i386/src/lib/libcmd/FEATURE/sockets +++ /dev/null @@ -1,13 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_i386_32bit/src/lib/libcmd/features/sockets by iffe version 2009-12-04 : : */ -#ifndef _def_sockets_cmd -#define _def_sockets_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_i386_32bit/arch/sol11.i386/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _sys_socket 1 /* #include <sys/socket.h> ok */ -#define _hdr_arpa_inet 1 /* #include <arpa/inet.h> ok */ -#define _hdr_netinet_in 1 /* #include <netinet/in.h> ok */ -#define _lib_getsockname 1 /* getsockname() in default lib(s) */ -#define _lib_getsockopt 1 /* getsockopt() in default lib(s) */ -#define _lib_inet_ntoa 1 /* inet_ntoa() in default lib(s) */ -#endif diff --git a/usr/src/lib/libcmd/i386/src/lib/libcmd/FEATURE/symlink b/usr/src/lib/libcmd/i386/src/lib/libcmd/FEATURE/symlink deleted file mode 100644 index c4a03de88a..0000000000 --- a/usr/src/lib/libcmd/i386/src/lib/libcmd/FEATURE/symlink +++ /dev/null @@ -1,8 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_i386_32bit/src/lib/libcmd/features/symlink by iffe version 2009-12-04 : : */ -#ifndef _def_symlink_cmd -#define _def_symlink_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_i386_32bit/arch/sol11.i386/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _lib_lchown 1 /* lchown implemented */ -#endif diff --git a/usr/src/lib/libcmd/i386/src/lib/libcmd/FEATURE/utsname b/usr/src/lib/libcmd/i386/src/lib/libcmd/FEATURE/utsname deleted file mode 100644 index f66b30e21d..0000000000 --- a/usr/src/lib/libcmd/i386/src/lib/libcmd/FEATURE/utsname +++ /dev/null @@ -1,16 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_i386_32bit/src/lib/libcmd/features/utsname by iffe version 2009-12-04 : : */ -#ifndef _def_utsname_cmd -#define _def_utsname_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_i386_32bit/arch/sol11.i386/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _lib_getdomainname 1 /* getdomainname() in default lib(s) */ -#define _lib_gethostid 1 /* gethostid() in default lib(s) */ -#define _lib_gethostname 1 /* gethostname() in default lib(s) */ -#define _lib_sethostname 1 /* sethostname() in default lib(s) */ -#define _lib_syscall 1 /* syscall() in default lib(s) */ -#define _lib_uname 1 /* uname() in default lib(s) */ -#define _sys_utsname 1 /* #include <sys/utsname.h> ok */ -#define _sys_syscall 1 /* #include <sys/syscall.h> ok */ -#define _sys_systeminfo 1 /* #include <sys/systeminfo.h> ok */ -#endif diff --git a/usr/src/lib/libcmd/mapfile-vers b/usr/src/lib/libcmd/mapfile-vers deleted file mode 100644 index dd037e921c..0000000000 --- a/usr/src/lib/libcmd/mapfile-vers +++ /dev/null @@ -1,109 +0,0 @@ -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License (the "License"). -# You may not use this file except in compliance with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# - -# -# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. -# - -# -# MAPFILE HEADER START -# -# WARNING: STOP NOW. DO NOT MODIFY THIS FILE. -# Object versioning must comply with the rules detailed in -# -# usr/src/lib/README.mapfiles -# -# You should not be making modifications here until you've read the most current -# copy of that file. If you need help, contact a gatekeeper for guidance. -# -# MAPFILE HEADER END -# - -$mapfile_version 2 - -# functions by AST/ksh93's version of libcmd -SYMBOL_VERSION SUNWprivate_1.1 { - global: - _cmd_init; - - b_basename; - b_cat; - b_chgrp; - b_cksum; - b_chmod; - b_chown; - b_cmp; - b_comm; - b_cp; - b_cut; - b_date; - b_dirname; - b_egrep; - b_expr; - b_fds; - b_fgrep; - b_fmt; - b_fold; - b_getconf; - b_grep; - b_head; - b_id; - b_join; - b_ln; - b_logname; - b_md5sum; - b_mkdir; - b_mkfifo; - b_mktemp; - b_mv; - b_paste; - b_pathchk; - b_pids; - b_pgrep; - b_readlink; - b_rev; - b_rm; - b_rmdir; - b_stty; - b_sum; - b_sync; - b_tail; - b_tee; - b_tty; - b_uname; - b_uniq; - b_wc; - b_vmstate; - b_xgrep; - local: - *; -}; - -# functions exported by the old Solaris version of libcmd -# (the code has been moved to libc starting with Solaris 11/B51) -SYMBOL_VERSION SUNWprivate_1.1 { - global: - defcntl { TYPE = FUNCTION; FILTER = libc.so.1 }; - defopen { TYPE = FUNCTION; FILTER = libc.so.1 }; - defread { TYPE = FUNCTION; FILTER = libc.so.1 }; - local: - *; -}; diff --git a/usr/src/lib/libcmd/sparc/Makefile b/usr/src/lib/libcmd/sparc/Makefile deleted file mode 100644 index 6cbbf06d61..0000000000 --- a/usr/src/lib/libcmd/sparc/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright (c) 1997-2001 by Sun Microsystems, Inc. -# All rights reserved. -# - -include ../Makefile.com - -all: $(LIBS) - -install: all $(ROOTLIBS) $(ROOTLINKS) diff --git a/usr/src/lib/libcmd/sparc/include/ast/cmd.h b/usr/src/lib/libcmd/sparc/include/ast/cmd.h deleted file mode 100644 index e064222a77..0000000000 --- a/usr/src/lib/libcmd/sparc/include/ast/cmd.h +++ /dev/null @@ -1,174 +0,0 @@ - -/* : : generated by proto : : */ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ - -/* - * AT&T Research - * - * builtin cmd definitions - */ - -#ifndef _CMD_H -#if !defined(__PROTO__) -#include <prototyped.h> -#endif -#if !defined(__LINKAGE__) -#define __LINKAGE__ /* 2004-08-11 transition */ -#endif - -#define _CMD_H - -#include <ast.h> -#include <error.h> -#include <stak.h> -#include <shcmd.h> - -#define cmdinit _cmd_init - -#define ERROR_CALLBACK ERROR_SET - -#if _BLD_cmd && defined(__EXPORT__) -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ __EXPORT__ -#endif - -#include <cmdext.h> - -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ - -#if defined(CMD_BUILTIN) && !defined(CMD_STANDALONE) -#define CMD_STANDALONE CMD_BUILTIN -#endif - -#ifdef CMD_STANDALONE - -#define CMD_CONTEXT(c) ((Shbltin_t*)0) - -#if CMD_DYNAMIC - -#include <dlldefs.h> - -#else - -extern __MANGLE__ int CMD_STANDALONE __PROTO__((int, char**, __V_*)); - -#endif - -#ifndef CMD_BUILTIN - -/* - * command initialization - */ - -static int -cmdinit __PARAM__((int argc, register char** argv, __V_* context, const char* catalog, int flags), (argc, argv, context, catalog, flags)) __OTORP__(int argc; register char** argv; __V_* context; const char* catalog; int flags;){ - register char* cp; - register char* pp; - - if (cp = strrchr(argv[0], '/')) - cp++; - else - cp = argv[0]; - if (pp = strrchr(cp, '_')) - cp = pp + 1; - error_info.id = cp; - if (!error_info.catalog) - error_info.catalog = (char*)catalog; - opt_info.index = 0; - if (context) - error_info.flags |= flags & ~(ERROR_CALLBACK|ERROR_NOTIFY); - return 0; -} - -#endif - -int -main __PARAM__((int argc, char** argv), (argc, argv)) __OTORP__(int argc; char** argv;){ -#if CMD_DYNAMIC - register char* s; - register char* t; - __V_* dll; - Shbltin_f fun; - char buf[64]; - - if (s = strrchr(argv[0], '/')) - s++; - else if (!(s = argv[0])) - return 127; - if ((t = strrchr(s, '_')) && *++t) - s = t; - buf[0] = '_'; - buf[1] = 'b'; - buf[2] = '_'; - strncpy(buf + 3, s, sizeof(buf) - 4); - buf[sizeof(buf) - 1] = 0; - if (t = strchr(buf, '.')) - *t = 0; - for (;;) - { - if (dll = dlopen(NiL, RTLD_LAZY)) - { - if (fun = (Shbltin_f)dlsym(dll, buf + 1)) - break; - if (fun = (Shbltin_f)dlsym(dll, buf)) - break; - } - if (dll = dllplug(NiL, "cmd", NiL, RTLD_LAZY, NiL, 0)) - { - if (fun = (Shbltin_f)dlsym(dll, buf + 1)) - break; - if (fun = (Shbltin_f)dlsym(dll, buf)) - break; - } - return 127; - } - return (*fun)(argc, argv, NiL); -#else - return CMD_STANDALONE(argc, argv, NiL); -#endif -} - -#else - -#undef cmdinit -#ifdef _MSC_VER -#define CMD_CONTEXT(p) ((Shbltin_t*)(p)) -#define cmdinit(a,b,c,d,e) do{if(_cmd_init(a,b,c,d,e))return -1;}while(0) -#else -#define CMD_CONTEXT(p) (((p)&&((Shbltin_t*)(p))->version>=20071012&&((Shbltin_t*)(p))->version<20350101)?((Shbltin_t*)(p)):0) -#define cmdinit(a,b,c,d,e) do{if((c)&&!CMD_CONTEXT(c))c=0;if(_cmd_init(a,b,c,d,e))return -1;}while(0) -#endif - -#if _BLD_cmd && defined(__EXPORT__) -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ __EXPORT__ -#endif - -extern __MANGLE__ int _cmd_init __PROTO__((int, char**, __V_*, const char*, int)); - -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ - -#endif - -#endif diff --git a/usr/src/lib/libcmd/sparc/include/ast/cmdext.h b/usr/src/lib/libcmd/sparc/include/ast/cmdext.h deleted file mode 100644 index 978322e2d3..0000000000 --- a/usr/src/lib/libcmd/sparc/include/ast/cmdext.h +++ /dev/null @@ -1,77 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ - -/* : : generated by proto : : */ - -#if !defined(__PROTO__) -#include <prototyped.h> -#endif -#if !defined(__LINKAGE__) -#define __LINKAGE__ /* 2004-08-11 transition */ -#endif -extern __MANGLE__ int b_basename __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cat __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_chgrp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_chmod __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_chown __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cksum __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cmp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_comm __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cut __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_date __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_dirname __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_egrep __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_expr __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fds __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fgrep __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fmt __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fold __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_getconf __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_grep __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_head __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_id __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_join __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_ln __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_logname __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_md5sum __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mkdir __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mkfifo __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mktemp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mv __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_paste __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_pathchk __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_pids __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_rev __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_readlink __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_rm __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_rmdir __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_stty __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_sum __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_sync __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_tail __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_tee __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_tty __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_uname __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_uniq __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_vmstate __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_wc __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_xgrep __PROTO__((int, char**, __V_*)); diff --git a/usr/src/lib/libcmd/sparc/src/lib/libcmd/FEATURE/ids b/usr/src/lib/libcmd/sparc/src/lib/libcmd/FEATURE/ids deleted file mode 100644 index bd025699c4..0000000000 --- a/usr/src/lib/libcmd/sparc/src/lib/libcmd/FEATURE/ids +++ /dev/null @@ -1,15 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_32bit/src/lib/libcmd/features/ids by iffe version 2009-12-04 : : */ -#ifndef _def_ids_cmd -#define _def_ids_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_32bit/arch/sol11.sun4/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _lib_endgrent 1 /* endgrent() in default lib(s) */ -#define _lib_getgrent 1 /* getgrent() in default lib(s) */ -#define _lib_setgrent 1 /* setgrent() in default lib(s) */ -#define _sys_fss 1 /* #include <sys/fss.h> ok */ -#if !_lib_fsid && _mac_fsid -#define _lib_fsid 1 -#endif - -#endif diff --git a/usr/src/lib/libcmd/sparc/src/lib/libcmd/FEATURE/sockets b/usr/src/lib/libcmd/sparc/src/lib/libcmd/FEATURE/sockets deleted file mode 100644 index b5810a47fc..0000000000 --- a/usr/src/lib/libcmd/sparc/src/lib/libcmd/FEATURE/sockets +++ /dev/null @@ -1,13 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_32bit/src/lib/libcmd/features/sockets by iffe version 2009-12-04 : : */ -#ifndef _def_sockets_cmd -#define _def_sockets_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_32bit/arch/sol11.sun4/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _sys_socket 1 /* #include <sys/socket.h> ok */ -#define _hdr_arpa_inet 1 /* #include <arpa/inet.h> ok */ -#define _hdr_netinet_in 1 /* #include <netinet/in.h> ok */ -#define _lib_getsockname 1 /* getsockname() in default lib(s) */ -#define _lib_getsockopt 1 /* getsockopt() in default lib(s) */ -#define _lib_inet_ntoa 1 /* inet_ntoa() in default lib(s) */ -#endif diff --git a/usr/src/lib/libcmd/sparc/src/lib/libcmd/FEATURE/symlink b/usr/src/lib/libcmd/sparc/src/lib/libcmd/FEATURE/symlink deleted file mode 100644 index 00b254f70d..0000000000 --- a/usr/src/lib/libcmd/sparc/src/lib/libcmd/FEATURE/symlink +++ /dev/null @@ -1,8 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_32bit/src/lib/libcmd/features/symlink by iffe version 2009-12-04 : : */ -#ifndef _def_symlink_cmd -#define _def_symlink_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_32bit/arch/sol11.sun4/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _lib_lchown 1 /* lchown implemented */ -#endif diff --git a/usr/src/lib/libcmd/sparc/src/lib/libcmd/FEATURE/utsname b/usr/src/lib/libcmd/sparc/src/lib/libcmd/FEATURE/utsname deleted file mode 100644 index 93df54b142..0000000000 --- a/usr/src/lib/libcmd/sparc/src/lib/libcmd/FEATURE/utsname +++ /dev/null @@ -1,16 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_32bit/src/lib/libcmd/features/utsname by iffe version 2009-12-04 : : */ -#ifndef _def_utsname_cmd -#define _def_utsname_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_32bit/arch/sol11.sun4/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _lib_getdomainname 1 /* getdomainname() in default lib(s) */ -#define _lib_gethostid 1 /* gethostid() in default lib(s) */ -#define _lib_gethostname 1 /* gethostname() in default lib(s) */ -#define _lib_sethostname 1 /* sethostname() in default lib(s) */ -#define _lib_syscall 1 /* syscall() in default lib(s) */ -#define _lib_uname 1 /* uname() in default lib(s) */ -#define _sys_utsname 1 /* #include <sys/utsname.h> ok */ -#define _sys_syscall 1 /* #include <sys/syscall.h> ok */ -#define _sys_systeminfo 1 /* #include <sys/systeminfo.h> ok */ -#endif diff --git a/usr/src/lib/libcmd/sparcv9/Makefile b/usr/src/lib/libcmd/sparcv9/Makefile deleted file mode 100644 index 2eafde412a..0000000000 --- a/usr/src/lib/libcmd/sparcv9/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright 1997-2003 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# -# ident "%Z%%M% %I% %E% SMI" -# - -include ../Makefile.com -include ../../Makefile.lib.64 - -all: $(LIBS) - -install: all $(ROOTLIBS64) $(ROOTLINKS64) diff --git a/usr/src/lib/libcmd/sparcv9/include/ast/cmd.h b/usr/src/lib/libcmd/sparcv9/include/ast/cmd.h deleted file mode 100644 index e064222a77..0000000000 --- a/usr/src/lib/libcmd/sparcv9/include/ast/cmd.h +++ /dev/null @@ -1,174 +0,0 @@ - -/* : : generated by proto : : */ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ - -/* - * AT&T Research - * - * builtin cmd definitions - */ - -#ifndef _CMD_H -#if !defined(__PROTO__) -#include <prototyped.h> -#endif -#if !defined(__LINKAGE__) -#define __LINKAGE__ /* 2004-08-11 transition */ -#endif - -#define _CMD_H - -#include <ast.h> -#include <error.h> -#include <stak.h> -#include <shcmd.h> - -#define cmdinit _cmd_init - -#define ERROR_CALLBACK ERROR_SET - -#if _BLD_cmd && defined(__EXPORT__) -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ __EXPORT__ -#endif - -#include <cmdext.h> - -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ - -#if defined(CMD_BUILTIN) && !defined(CMD_STANDALONE) -#define CMD_STANDALONE CMD_BUILTIN -#endif - -#ifdef CMD_STANDALONE - -#define CMD_CONTEXT(c) ((Shbltin_t*)0) - -#if CMD_DYNAMIC - -#include <dlldefs.h> - -#else - -extern __MANGLE__ int CMD_STANDALONE __PROTO__((int, char**, __V_*)); - -#endif - -#ifndef CMD_BUILTIN - -/* - * command initialization - */ - -static int -cmdinit __PARAM__((int argc, register char** argv, __V_* context, const char* catalog, int flags), (argc, argv, context, catalog, flags)) __OTORP__(int argc; register char** argv; __V_* context; const char* catalog; int flags;){ - register char* cp; - register char* pp; - - if (cp = strrchr(argv[0], '/')) - cp++; - else - cp = argv[0]; - if (pp = strrchr(cp, '_')) - cp = pp + 1; - error_info.id = cp; - if (!error_info.catalog) - error_info.catalog = (char*)catalog; - opt_info.index = 0; - if (context) - error_info.flags |= flags & ~(ERROR_CALLBACK|ERROR_NOTIFY); - return 0; -} - -#endif - -int -main __PARAM__((int argc, char** argv), (argc, argv)) __OTORP__(int argc; char** argv;){ -#if CMD_DYNAMIC - register char* s; - register char* t; - __V_* dll; - Shbltin_f fun; - char buf[64]; - - if (s = strrchr(argv[0], '/')) - s++; - else if (!(s = argv[0])) - return 127; - if ((t = strrchr(s, '_')) && *++t) - s = t; - buf[0] = '_'; - buf[1] = 'b'; - buf[2] = '_'; - strncpy(buf + 3, s, sizeof(buf) - 4); - buf[sizeof(buf) - 1] = 0; - if (t = strchr(buf, '.')) - *t = 0; - for (;;) - { - if (dll = dlopen(NiL, RTLD_LAZY)) - { - if (fun = (Shbltin_f)dlsym(dll, buf + 1)) - break; - if (fun = (Shbltin_f)dlsym(dll, buf)) - break; - } - if (dll = dllplug(NiL, "cmd", NiL, RTLD_LAZY, NiL, 0)) - { - if (fun = (Shbltin_f)dlsym(dll, buf + 1)) - break; - if (fun = (Shbltin_f)dlsym(dll, buf)) - break; - } - return 127; - } - return (*fun)(argc, argv, NiL); -#else - return CMD_STANDALONE(argc, argv, NiL); -#endif -} - -#else - -#undef cmdinit -#ifdef _MSC_VER -#define CMD_CONTEXT(p) ((Shbltin_t*)(p)) -#define cmdinit(a,b,c,d,e) do{if(_cmd_init(a,b,c,d,e))return -1;}while(0) -#else -#define CMD_CONTEXT(p) (((p)&&((Shbltin_t*)(p))->version>=20071012&&((Shbltin_t*)(p))->version<20350101)?((Shbltin_t*)(p)):0) -#define cmdinit(a,b,c,d,e) do{if((c)&&!CMD_CONTEXT(c))c=0;if(_cmd_init(a,b,c,d,e))return -1;}while(0) -#endif - -#if _BLD_cmd && defined(__EXPORT__) -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ __EXPORT__ -#endif - -extern __MANGLE__ int _cmd_init __PROTO__((int, char**, __V_*, const char*, int)); - -#undef __MANGLE__ -#define __MANGLE__ __LINKAGE__ - -#endif - -#endif diff --git a/usr/src/lib/libcmd/sparcv9/include/ast/cmdext.h b/usr/src/lib/libcmd/sparcv9/include/ast/cmdext.h deleted file mode 100644 index 978322e2d3..0000000000 --- a/usr/src/lib/libcmd/sparcv9/include/ast/cmdext.h +++ /dev/null @@ -1,77 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1992-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ - -/* : : generated by proto : : */ - -#if !defined(__PROTO__) -#include <prototyped.h> -#endif -#if !defined(__LINKAGE__) -#define __LINKAGE__ /* 2004-08-11 transition */ -#endif -extern __MANGLE__ int b_basename __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cat __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_chgrp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_chmod __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_chown __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cksum __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cmp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_comm __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_cut __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_date __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_dirname __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_egrep __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_expr __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fds __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fgrep __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fmt __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_fold __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_getconf __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_grep __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_head __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_id __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_join __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_ln __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_logname __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_md5sum __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mkdir __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mkfifo __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mktemp __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_mv __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_paste __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_pathchk __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_pids __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_rev __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_readlink __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_rm __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_rmdir __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_stty __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_sum __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_sync __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_tail __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_tee __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_tty __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_uname __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_uniq __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_vmstate __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_wc __PROTO__((int, char**, __V_*)); -extern __MANGLE__ int b_xgrep __PROTO__((int, char**, __V_*)); diff --git a/usr/src/lib/libcmd/sparcv9/src/lib/libcmd/FEATURE/ids b/usr/src/lib/libcmd/sparcv9/src/lib/libcmd/FEATURE/ids deleted file mode 100644 index 9560cee811..0000000000 --- a/usr/src/lib/libcmd/sparcv9/src/lib/libcmd/FEATURE/ids +++ /dev/null @@ -1,15 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_64bit/src/lib/libcmd/features/ids by iffe version 2009-12-04 : : */ -#ifndef _def_ids_cmd -#define _def_ids_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_64bit/arch/sol11.sun4/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _lib_endgrent 1 /* endgrent() in default lib(s) */ -#define _lib_getgrent 1 /* getgrent() in default lib(s) */ -#define _lib_setgrent 1 /* setgrent() in default lib(s) */ -#define _sys_fss 1 /* #include <sys/fss.h> ok */ -#if !_lib_fsid && _mac_fsid -#define _lib_fsid 1 -#endif - -#endif diff --git a/usr/src/lib/libcmd/sparcv9/src/lib/libcmd/FEATURE/sockets b/usr/src/lib/libcmd/sparcv9/src/lib/libcmd/FEATURE/sockets deleted file mode 100644 index 1f7dcfa50d..0000000000 --- a/usr/src/lib/libcmd/sparcv9/src/lib/libcmd/FEATURE/sockets +++ /dev/null @@ -1,13 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_64bit/src/lib/libcmd/features/sockets by iffe version 2009-12-04 : : */ -#ifndef _def_sockets_cmd -#define _def_sockets_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_64bit/arch/sol11.sun4/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _sys_socket 1 /* #include <sys/socket.h> ok */ -#define _hdr_arpa_inet 1 /* #include <arpa/inet.h> ok */ -#define _hdr_netinet_in 1 /* #include <netinet/in.h> ok */ -#define _lib_getsockname 1 /* getsockname() in default lib(s) */ -#define _lib_getsockopt 1 /* getsockopt() in default lib(s) */ -#define _lib_inet_ntoa 1 /* inet_ntoa() in default lib(s) */ -#endif diff --git a/usr/src/lib/libcmd/sparcv9/src/lib/libcmd/FEATURE/symlink b/usr/src/lib/libcmd/sparcv9/src/lib/libcmd/FEATURE/symlink deleted file mode 100644 index bf182d7859..0000000000 --- a/usr/src/lib/libcmd/sparcv9/src/lib/libcmd/FEATURE/symlink +++ /dev/null @@ -1,8 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_64bit/src/lib/libcmd/features/symlink by iffe version 2009-12-04 : : */ -#ifndef _def_symlink_cmd -#define _def_symlink_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_64bit/arch/sol11.sun4/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _lib_lchown 1 /* lchown implemented */ -#endif diff --git a/usr/src/lib/libcmd/sparcv9/src/lib/libcmd/FEATURE/utsname b/usr/src/lib/libcmd/sparcv9/src/lib/libcmd/FEATURE/utsname deleted file mode 100644 index 4e3f4bcd4f..0000000000 --- a/usr/src/lib/libcmd/sparcv9/src/lib/libcmd/FEATURE/utsname +++ /dev/null @@ -1,16 +0,0 @@ -/* : : generated from /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_64bit/src/lib/libcmd/features/utsname by iffe version 2009-12-04 : : */ -#ifndef _def_utsname_cmd -#define _def_utsname_cmd 1 -#define _sys_types 1 /* #include <sys/types.h> ok */ -#define _LIB_ast 1 /* /home/gisburn/ksh93/ast_ksh_20100309/build_sparc_64bit/arch/sol11.sun4/lib/libast.a is a library */ -#define _LIB_m 1 /* -lm is a library */ -#define _lib_getdomainname 1 /* getdomainname() in default lib(s) */ -#define _lib_gethostid 1 /* gethostid() in default lib(s) */ -#define _lib_gethostname 1 /* gethostname() in default lib(s) */ -#define _lib_sethostname 1 /* sethostname() in default lib(s) */ -#define _lib_syscall 1 /* syscall() in default lib(s) */ -#define _lib_uname 1 /* uname() in default lib(s) */ -#define _sys_utsname 1 /* #include <sys/utsname.h> ok */ -#define _sys_syscall 1 /* #include <sys/syscall.h> ok */ -#define _sys_systeminfo 1 /* #include <sys/systeminfo.h> ok */ -#endif |