Annotation of 43BSD/contrib/emacs/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 Richard M. Stallman.
                      3: 
                      4: This file is part of GNU Emacs.
                      5: 
                      6: GNU Emacs is distributed in the hope that it will be useful,
                      7: but WITHOUT ANY WARRANTY.  No author or distributor
                      8: accepts responsibility to anyone for the consequences of using it
                      9: or for whether it serves any particular purpose or works at all,
                     10: unless he says so in writing.  Refer to the GNU Emacs General Public
                     11: License for full details.
                     12: 
                     13: Everyone is granted permission to copy, modify and redistribute
                     14: GNU Emacs, but only under the conditions described in the
                     15: GNU Emacs General Public License.   A copy of this license is
                     16: supposed to have been given to you along with GNU Emacs so you
                     17: can know your rights and responsibilities.  It should be in a
                     18: file named COPYING.  Among other things, the copyright notice
                     19: and this notice must be preserved on all copies.  */
                     20: 
                     21: 
                     22: #include <sys/types.h>
                     23: #include <sys/stat.h>
                     24: 
                     25: /* filemodestring - set file attribute data 
                     26: 
                     27: *** WARNING!  FILE STRUCTURE DEPENDENT ***
                     28: 
                     29:    Filemodestring converts the data in the st_mode field of file status
                     30: block `s' to a 10 character attribute string, which it stores in
                     31: the block that `a' points to.
                     32: This attribute string is modelled after the string produced by the Berkeley ls.
                     33: 
                     34: As usual under Unix, the elements of the string are numbered
                     35: from 0.  Their meanings are:
                     36: 
                     37:    0   File type.  'd' for directory, 'c' for character
                     38:        special, 'b' for block special, 'm' for multiplex, '-'
                     39:        for any other file type
                     40: 
                     41:    1   'r' if the owner may read, '-' otherwise.
                     42: 
                     43:    2   'w' if the owner may write, '-' otherwise.
                     44: 
                     45:    3   'x' if the owner may execute, 's' if the file is
                     46:        set-user-id, '-' otherwise.
                     47: 
                     48:    4   'r' if group members may read, '-' otherwise.
                     49: 
                     50:    5   'w' if group members may write, '-' otherwise.
                     51: 
                     52:    6   'x' if group members may execute, 's' if the file is
                     53:        set-group-id, '-' otherwise.
                     54: 
                     55:    7   'r' if any user may read, '-' otherwise.
                     56: 
                     57:    8   'w' if any user may write, '-' otherwise.
                     58: 
                     59:    9   'x' if any user may execute, 't' if the file is "sticky"
                     60:        (will be retained in swap space after execution), '-'
                     61:        otherwise.
                     62: 
                     63:  */
                     64: 
                     65: #define TEXT char
                     66: #define VOID void
                     67: 
                     68: static TEXT ftypelet ();
                     69: static VOID rwx (), setst ();
                     70: 
                     71: VOID
                     72: filemodestring (s,a)
                     73:    struct stat *s;
                     74:    TEXT *a;
                     75: {
                     76:    a[0] = ftypelet(s);
                     77:    rwx ((s->st_mode&0700)<<0, &(a[1]));
                     78:    rwx ((s->st_mode&0070)<<3, &(a[4]));
                     79:    rwx ((s->st_mode&0007)<<6, &(a[7]));
                     80:    setst (s->st_mode, a);
                     81: }
                     82: 
                     83: /* ftypelet - file type letter
                     84: 
                     85: *** WARNING!  FILE STRUCTURE DEPENDENT ***
                     86: 
                     87:    Ftypelet accepts a file status block and returns a character
                     88: code describing the type of the file.  'd' is returned for
                     89: directories, 'b' for block special files, 'c' for character
                     90: special files, 'm' for multiplexor files, and '-' for regular
                     91: files.
                     92: 
                     93:  */
                     94: 
                     95: static TEXT
                     96: ftypelet(s)
                     97:    struct stat *s;
                     98: {
                     99:    
                    100:    if ((s->st_mode&S_IFMT)==S_IFDIR)
                    101:       return 'd';
                    102:    else if ((s->st_mode&S_IFMT)==S_IFCHR)
                    103:       return 'c';
                    104:    else if ((s->st_mode&S_IFMT)==S_IFBLK)
                    105:       return 'b';
                    106: /* These do not seem to exist */
                    107: /*   else if ((s->st_mode&S_IFMT)==S_IFMPC ||
                    108:            (s->st_mode&S_IFMT)==S_IFMPB)
                    109:       return 'm';
                    110:  */
                    111:    else
                    112:       return '-';
                    113: }
                    114: 
                    115: 
                    116: /* rwx - look at read, write, and execute bits and set character
                    117: flags accordingly
                    118: 
                    119: *** WARNING!  FILE STRUCTURE DEPENDENT ***
                    120: 
                    121:  */
                    122: 
                    123: static VOID
                    124: rwx (bits, chars)
                    125:    unsigned short bits;
                    126:    TEXT chars[];
                    127: {
                    128:     chars[0] = chars[1] = chars[2] = '-';
                    129:    if (bits&S_IREAD)
                    130:       chars[0] = 'r';
                    131:    if (bits&S_IWRITE)
                    132:       chars[1] = 'w';
                    133:    if (bits&S_IEXEC)
                    134:       chars[2] = 'x';
                    135: }
                    136: 
                    137: 
                    138: /* setst - set s & t flags in a file attributes string */
                    139: /* *** WARNING!  FILE STRUCTURE DEPENDENT *** */
                    140: static VOID
                    141: setst (bits, chars)
                    142:    unsigned short bits;
                    143:    TEXT chars[];
                    144: {
                    145:    if (bits&S_ISUID)
                    146:       chars[3] = 's';
                    147:    if (bits&S_ISGID)
                    148:       chars[6] = 's';
                    149:    if (bits&S_ISVTX)
                    150:       chars[9] = 't';
                    151: }

unix.superglobalmegacorp.com

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