Annotation of 43BSDReno/contrib/emacs-18.55/src/filemode.c, revision 1.1.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.