Annotation of GNUtools/emacs/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:     This program is free software; you can redistribute it and/or modify
        !             5:     it under the terms of the GNU General Public License as published by
        !             6:     the Free Software Foundation; either version 1, or (at your option)
        !             7:     any later version.
        !             8: 
        !             9:     This program is distributed in the hope that it will be useful,
        !            10:     but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            11:     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            12:     GNU General Public License for more details.
        !            13: 
        !            14:     You should have received a copy of the GNU General Public License
        !            15:     along with this program; if not, write to the Free Software
        !            16:     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
        !            17: 
        !            18: In other words, you are welcome to use, share and improve this program.
        !            19: You are forbidden to forbid anyone else to use, share and improve
        !            20: what you give them.   Help stamp out software-hoarding!  */
        !            21: 
        !            22: 
        !            23: #include <sys/types.h>
        !            24: #include <sys/stat.h>
        !            25: #include "filetypes.h"
        !            26: 
        !            27: /* filemodestring - set file attribute data 
        !            28: 
        !            29: *** WARNING!  FILE STRUCTURE DEPENDENT ***
        !            30: 
        !            31:    Filemodestring converts the data in the st_mode field of file status
        !            32: block `s' to a 10 character attribute string, which it stores in
        !            33: the block that `a' points to.
        !            34: This attribute string is modelled after the string produced by the Berkeley ls.
        !            35: 
        !            36: As usual under Unix, the elements of the string are numbered
        !            37: from 0.  Their meanings are:
        !            38: 
        !            39:    0   File type.  'd' for directory, 'c' for character
        !            40:        special, 'b' for block special, 'm' for multiplex,
        !            41:        'l' for symbolic link, 's' for socket, 'p' for fifo,
        !            42:        '-' for any other file type
        !            43: 
        !            44:    1   'r' if the owner may read, '-' otherwise.
        !            45: 
        !            46:    2   'w' if the owner may write, '-' otherwise.
        !            47: 
        !            48:    3   'x' if the owner may execute, 's' if the file is
        !            49:        set-user-id, '-' otherwise.
        !            50:        'S' if the file is set-user-id, but the execute
        !            51:        bit isn't set.  (sys v `feature' which helps to
        !            52:        catch screw case.)
        !            53: 
        !            54:    4   'r' if group members may read, '-' otherwise.
        !            55: 
        !            56:    5   'w' if group members may write, '-' otherwise.
        !            57: 
        !            58:    6   'x' if group members may execute, 's' if the file is
        !            59:        set-group-id, '-' otherwise.
        !            60:        'S' if it is set-group-id but not executable.
        !            61: 
        !            62:    7   'r' if any user may read, '-' otherwise.
        !            63: 
        !            64:    8   'w' if any user may write, '-' otherwise.
        !            65: 
        !            66:    9   'x' if any user may execute, 't' if the file is "sticky"
        !            67:        (will be retained in swap space after execution), '-'
        !            68:        otherwise.
        !            69: 
        !            70:  */
        !            71: 
        !            72: #define VOID void
        !            73: 
        !            74: static char ftypelet ();
        !            75: static VOID rwx (), setst ();
        !            76: 
        !            77: VOID
        !            78: filemodestring (s,a)
        !            79:    struct stat *s;
        !            80:    char *a;
        !            81: {
        !            82:    a[0] = ftypelet (s);
        !            83:    /* Aren't there symbolic names for these byte-fields? */
        !            84:    rwx ((s->st_mode & 0700) << 0, &(a[1]));
        !            85:    rwx ((s->st_mode & 0070) << 3, &(a[4]));
        !            86:    rwx ((s->st_mode & 0007) << 6, &(a[7]));
        !            87:    setst (s->st_mode, a);
        !            88: }
        !            89: 
        !            90: /* ftypelet - file type letter
        !            91: 
        !            92: *** WARNING!  FILE STRUCTURE DEPENDENT ***
        !            93: 
        !            94:    Ftypelet accepts a file status block and returns a character
        !            95: code describing the type of the file.  'd' is returned for
        !            96: directories, 'b' for block special files, 'c' for character
        !            97: special files, 'm' for multiplexor files, 'l' for symbolic link,
        !            98: 's' for socket, 'p' for fifo, '-' for any other file type
        !            99:  */
        !           100: 
        !           101: static char
        !           102: ftypelet(s)
        !           103:    struct stat *s;
        !           104: {
        !           105:   switch (s->st_mode & S_IFMT)
        !           106:     {
        !           107:     default:
        !           108:       return '-';
        !           109:     case S_IFDIR:
        !           110:       return 'd';
        !           111: #ifdef S_IFLNK
        !           112:     case S_IFLNK:
        !           113:       return 'l';
        !           114: #endif
        !           115: #ifdef S_IFCHR
        !           116:     case S_IFCHR:
        !           117:       return 'c';
        !           118: #endif
        !           119: #ifdef S_IFBLK
        !           120:     case S_IFBLK:
        !           121:       return 'b';
        !           122: #endif
        !           123: #ifdef S_IFMPC
        !           124: /* These do not seem to exist */
        !           125:     case S_IFMPC:
        !           126:     case S_IFMPB:
        !           127:       return 'm';
        !           128: #endif
        !           129: #ifdef S_IFSOCK
        !           130:     case S_IFSOCK:
        !           131:       return 's';
        !           132: #endif
        !           133: #ifdef S_IFIFO
        !           134: #if S_IFIFO != S_IFSOCK
        !           135:     case S_IFIFO:
        !           136:       return 'p';
        !           137: #endif
        !           138: #endif
        !           139: #ifdef S_IFNWK /* hp-ux hack */
        !           140:     case S_IFNWK:
        !           141:       return 'n';
        !           142: #endif
        !           143:     }
        !           144: }
        !           145: 
        !           146: 
        !           147: /* rwx - look at read, write, and execute bits and set character
        !           148: flags accordingly
        !           149: 
        !           150: *** WARNING!  FILE STRUCTURE DEPENDENT ***
        !           151: 
        !           152:  */
        !           153: 
        !           154: static VOID
        !           155: rwx (bits, chars)
        !           156:    unsigned short bits;
        !           157:    char chars[];
        !           158: {
        !           159:   chars[0] = (bits & S_IREAD)  ? 'r' : '-';
        !           160:   chars[1] = (bits & S_IWRITE) ? 'w' : '-';
        !           161:   chars[2] = (bits & S_IEXEC)  ? 'x' : '-';
        !           162: }
        !           163: 
        !           164: 
        !           165: /* setst - set s & t flags in a file attributes string */
        !           166: /* *** WARNING!  FILE STRUCTURE DEPENDENT *** */
        !           167: static VOID
        !           168: setst (bits, chars)
        !           169:    unsigned short bits;
        !           170:    char chars[];
        !           171: {
        !           172: #ifdef S_ISUID
        !           173:    if (bits & S_ISUID)
        !           174:      {
        !           175:        if (chars[3] != 'x')
        !           176:         /* Screw case: set-uid, but not executable. */
        !           177:         chars[3] = 'S';
        !           178:        else
        !           179:         chars[3] = 's';
        !           180:      }
        !           181: #endif
        !           182: #ifdef S_ISGID
        !           183:    if (bits & S_ISGID)
        !           184:      {
        !           185:        if (chars[6] != 'x')
        !           186:         /* Screw case: set-gid, but not executable. */
        !           187:         chars[6] = 'S';
        !           188:        else
        !           189:         chars[6] = 's';
        !           190:      }
        !           191: #endif
        !           192: #ifdef S_ISVTX
        !           193:    if (bits & S_ISVTX)
        !           194:       chars[9] = 't';
        !           195: #endif
        !           196: }

unix.superglobalmegacorp.com

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