diff options
Diffstat (limited to 'usr/src/lib/libcmd/common/chmod.c')
-rw-r--r-- | usr/src/lib/libcmd/common/chmod.c | 308 |
1 files changed, 0 insertions, 308 deletions
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; -} |