Annotation of 43BSDReno/contrib/emacs-18.55/src/filemode.c, revision 1.1

1.1     ! root        1: /* Examine the result of  stat  and make a string describing file modes.
        !             2:    Copyright (C) 1985 Free Software Foundation, Inc.
        !             3: 
        !             4:                       NO WARRANTY
        !             5: 
        !             6:   BECAUSE THIS PROGRAM IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY
        !             7: NO WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW.  EXCEPT
        !             8: WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC,
        !             9: RICHARD M. STALLMAN AND/OR OTHER PARTIES PROVIDE THIS PROGRAM "AS IS"
        !            10: WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
        !            11: BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
        !            12: FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY
        !            13: AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE
        !            14: DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
        !            15: CORRECTION.
        !            16: 
        !            17:  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL RICHARD M.
        !            18: STALLMAN, THE FREE SOFTWARE FOUNDATION, INC., AND/OR ANY OTHER PARTY
        !            19: WHO MAY MODIFY AND REDISTRIBUTE THIS PROGRAM AS PERMITTED BELOW, BE
        !            20: LIABLE TO YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR
        !            21: OTHER SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
        !            22: USE OR INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR
        !            23: DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR
        !            24: A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) THIS
        !            25: PROGRAM, EVEN IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH
        !            26: DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.
        !            27: 
        !            28:                GENERAL PUBLIC LICENSE TO COPY
        !            29: 
        !            30:   1. You may copy and distribute verbatim copies of this source file
        !            31: as you receive it, in any medium, provided that you conspicuously and
        !            32: appropriately publish on each copy a valid copyright notice "Copyright
        !            33: (C) 1985 Free Software Foundation, Inc."; and include following the
        !            34: copyright notice a verbatim copy of the above disclaimer of warranty
        !            35: and of this License.  You may charge a distribution fee for the
        !            36: physical act of transferring a copy.
        !            37: 
        !            38:   2. You may modify your copy or copies of this source file or
        !            39: any portion of it, and copy and distribute such modifications under
        !            40: the terms of Paragraph 1 above, provided that you also do the following:
        !            41: 
        !            42:     a) cause the modified files to carry prominent notices stating
        !            43:     that you changed the files and the date of any change; and
        !            44: 
        !            45:     b) cause the whole of any work that you distribute or publish,
        !            46:     that in whole or in part contains or is a derivative of this
        !            47:     program or any part thereof, to be licensed at no charge to all
        !            48:     third parties on terms identical to those contained in this
        !            49:     License Agreement (except that you may choose to grant more extensive
        !            50:     warranty protection to some or all third parties, at your option).
        !            51: 
        !            52:     c) You may charge a distribution fee for the physical act of
        !            53:     transferring a copy, and you may at your option offer warranty
        !            54:     protection in exchange for a fee.
        !            55: 
        !            56: Mere aggregation of another unrelated program with this program (or its
        !            57: derivative) on a volume of a storage or distribution medium does not bring
        !            58: the other program under the scope of these terms.
        !            59: 
        !            60:   3. You may copy and distribute this program (or a portion or derivative
        !            61: of it, under Paragraph 2) in object code or executable form under the terms
        !            62: of Paragraphs 1 and 2 above provided that you also do one of the following:
        !            63: 
        !            64:     a) accompany it with the complete corresponding machine-readable
        !            65:     source code, which must be distributed under the terms of
        !            66:     Paragraphs 1 and 2 above; or,
        !            67: 
        !            68:     b) accompany it with a written offer, valid for at least three
        !            69:     years, to give any third party free (except for a nominal
        !            70:     shipping charge) a complete machine-readable copy of the
        !            71:     corresponding source code, to be distributed under the terms of
        !            72:     Paragraphs 1 and 2 above; or,
        !            73: 
        !            74:     c) accompany it with the information you received as to where the
        !            75:     corresponding source code may be obtained.  (This alternative is
        !            76:     allowed only for noncommercial distribution and only if you
        !            77:     received the program in object code or executable form alone.)
        !            78: 
        !            79: For an executable file, complete source code means all the source code for
        !            80: all modules it contains; but, as a special exception, it need not include
        !            81: source code for modules which are standard libraries that accompany the
        !            82: operating system on which the executable file runs.
        !            83: 
        !            84:   4. You may not copy, sublicense, distribute or transfer this program
        !            85: except as expressly provided under this License Agreement.  Any attempt
        !            86: otherwise to copy, sublicense, distribute or transfer this program is void and
        !            87: your rights to use the program under this License agreement shall be
        !            88: automatically terminated.  However, parties who have received computer
        !            89: software programs from you with this License Agreement will not have
        !            90: their licenses terminated so long as such parties remain in full compliance.
        !            91: 
        !            92:   5. If you wish to incorporate parts of this program into other free
        !            93: programs whose distribution conditions are different, write to the Free
        !            94: Software Foundation at 675 Mass Ave, Cambridge, MA 02139.  We have not yet
        !            95: worked out a simple rule that can be stated here, but we will often permit
        !            96: this.  We will be guided by the two goals of preserving the free status of
        !            97: all derivatives of our free software and of promoting the sharing and reuse of
        !            98: software.
        !            99: 
        !           100: 
        !           101: In other words, you are welcome to use, share and improve this program.
        !           102: You are forbidden to forbid anyone else to use, share and improve
        !           103: what you give them.   Help stamp out software-hoarding!  */
        !           104: 
        !           105: 
        !           106: #include <sys/types.h>
        !           107: #include <sys/stat.h>
        !           108: 
        !           109: /* filemodestring - set file attribute data 
        !           110: 
        !           111: *** WARNING!  FILE STRUCTURE DEPENDENT ***
        !           112: 
        !           113:    Filemodestring converts the data in the st_mode field of file status
        !           114: block `s' to a 10 character attribute string, which it stores in
        !           115: the block that `a' points to.
        !           116: This attribute string is modelled after the string produced by the Berkeley ls.
        !           117: 
        !           118: As usual under Unix, the elements of the string are numbered
        !           119: from 0.  Their meanings are:
        !           120: 
        !           121:    0   File type.  'd' for directory, 'c' for character
        !           122:        special, 'b' for block special, 'm' for multiplex,
        !           123:        'l' for symbolic link, 's' for socket, 'p' for fifo,
        !           124:        '-' for any other file type
        !           125: 
        !           126:    1   'r' if the owner may read, '-' otherwise.
        !           127: 
        !           128:    2   'w' if the owner may write, '-' otherwise.
        !           129: 
        !           130:    3   'x' if the owner may execute, 's' if the file is
        !           131:        set-user-id, '-' otherwise.
        !           132:        'S' if the file is set-user-id, but the execute
        !           133:        bit isn't set.  (sys v `feature' which helps to
        !           134:        catch screw case.)
        !           135: 
        !           136:    4   'r' if group members may read, '-' otherwise.
        !           137: 
        !           138:    5   'w' if group members may write, '-' otherwise.
        !           139: 
        !           140:    6   'x' if group members may execute, 's' if the file is
        !           141:        set-group-id, '-' otherwise.
        !           142:        'S' if it is set-group-id but not executable.
        !           143: 
        !           144:    7   'r' if any user may read, '-' otherwise.
        !           145: 
        !           146:    8   'w' if any user may write, '-' otherwise.
        !           147: 
        !           148:    9   'x' if any user may execute, 't' if the file is "sticky"
        !           149:        (will be retained in swap space after execution), '-'
        !           150:        otherwise.
        !           151: 
        !           152:  */
        !           153: 
        !           154: #define VOID void
        !           155: 
        !           156: static char ftypelet ();
        !           157: static VOID rwx (), setst ();
        !           158: 
        !           159: VOID
        !           160: filemodestring (s,a)
        !           161:    struct stat *s;
        !           162:    char *a;
        !           163: {
        !           164:    a[0] = ftypelet (s);
        !           165:    /* Aren't there symbolic names for these byte-fields? */
        !           166:    rwx ((s->st_mode & 0700) << 0, &(a[1]));
        !           167:    rwx ((s->st_mode & 0070) << 3, &(a[4]));
        !           168:    rwx ((s->st_mode & 0007) << 6, &(a[7]));
        !           169:    setst (s->st_mode, a);
        !           170: }
        !           171: 
        !           172: /* ftypelet - file type letter
        !           173: 
        !           174: *** WARNING!  FILE STRUCTURE DEPENDENT ***
        !           175: 
        !           176:    Ftypelet accepts a file status block and returns a character
        !           177: code describing the type of the file.  'd' is returned for
        !           178: directories, 'b' for block special files, 'c' for character
        !           179: special files, 'm' for multiplexor files, 'l' for symbolic link,
        !           180: 's' for socket, 'p' for fifo, '-' for any other file type
        !           181:  */
        !           182: 
        !           183: static char
        !           184: ftypelet(s)
        !           185:    struct stat *s;
        !           186: {
        !           187:   switch (s->st_mode & S_IFMT)
        !           188:     {
        !           189:     default:
        !           190:       return '-';
        !           191:     case S_IFDIR:
        !           192:       return 'd';
        !           193: #ifdef S_IFLNK
        !           194:     case S_IFLNK:
        !           195:       return 'l';
        !           196: #endif
        !           197: #ifdef S_IFCHR
        !           198:     case S_IFCHR:
        !           199:       return 'c';
        !           200: #endif
        !           201: #ifdef S_IFBLK
        !           202:     case S_IFBLK:
        !           203:       return 'b';
        !           204: #endif
        !           205: #ifdef S_IFMPC
        !           206: /* These do not seem to exist */
        !           207:     case S_IFMPC:
        !           208:     case S_IFMPB:
        !           209:       return 'm';
        !           210: #endif
        !           211: #ifdef S_IFSOCK
        !           212:     case S_IFSOCK:
        !           213:       return 's';
        !           214: #endif
        !           215: #ifdef S_IFIFO
        !           216: #if S_IFIFO != S_IFSOCK
        !           217:     case S_IFIFO:
        !           218:       return 'p';
        !           219: #endif
        !           220: #endif
        !           221: #ifdef S_IFNWK /* hp-ux hack */
        !           222:     case S_IFNWK:
        !           223:       return 'n';
        !           224: #endif
        !           225:     }
        !           226: }
        !           227: 
        !           228: 
        !           229: /* rwx - look at read, write, and execute bits and set character
        !           230: flags accordingly
        !           231: 
        !           232: *** WARNING!  FILE STRUCTURE DEPENDENT ***
        !           233: 
        !           234:  */
        !           235: 
        !           236: static VOID
        !           237: rwx (bits, chars)
        !           238:    unsigned short bits;
        !           239:    char chars[];
        !           240: {
        !           241:   chars[0] = (bits & S_IREAD)  ? 'r' : '-';
        !           242:   chars[1] = (bits & S_IWRITE) ? 'w' : '-';
        !           243:   chars[2] = (bits & S_IEXEC)  ? 'x' : '-';
        !           244: }
        !           245: 
        !           246: 
        !           247: /* setst - set s & t flags in a file attributes string */
        !           248: /* *** WARNING!  FILE STRUCTURE DEPENDENT *** */
        !           249: static VOID
        !           250: setst (bits, chars)
        !           251:    unsigned short bits;
        !           252:    char chars[];
        !           253: {
        !           254: #ifdef S_ISUID
        !           255:    if (bits & S_ISUID)
        !           256:      {
        !           257:        if (chars[3] != 'x')
        !           258:         /* Screw case: set-uid, but not executable. */
        !           259:         chars[3] = 'S';
        !           260:        else
        !           261:         chars[3] = 's';
        !           262:      }
        !           263: #endif
        !           264: #ifdef S_ISGID
        !           265:    if (bits & S_ISGID)
        !           266:      {
        !           267:        if (chars[6] != 'x')
        !           268:         /* Screw case: set-gid, but not executable. */
        !           269:         chars[6] = 'S';
        !           270:        else
        !           271:         chars[6] = 's';
        !           272:      }
        !           273: #endif
        !           274: #ifdef S_ISVTX
        !           275:    if (bits & S_ISVTX)
        !           276:       chars[9] = 't';
        !           277: #endif
        !           278: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.