File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / rsync / lib / permstring.c
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 00:32:36 2021 UTC (3 years, 3 months ago) by misho
Branches: rsync, MAIN
CVS tags: v3_2_3, HEAD
rsync 3.2.3

    1: /*
    2:  * A single utility routine.
    3:  *
    4:  * Copyright (C) 1996 Andrew Tridgell
    5:  * Copyright (C) 1996 Paul Mackerras
    6:  * Copyright (C) 2001 Martin Pool <mbp@samba.org>
    7:  * Copyright (C) 2003-2019 Wayne Davison
    8:  *
    9:  * This program is free software; you can redistribute it and/or modify
   10:  * it under the terms of the GNU General Public License as published by
   11:  * the Free Software Foundation; either version 3 of the License, or
   12:  * (at your option) any later version.
   13:  *
   14:  * This program is distributed in the hope that it will be useful,
   15:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
   16:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   17:  * GNU General Public License for more details.
   18:  *
   19:  * You should have received a copy of the GNU General Public License along
   20:  * with this program; if not, visit the http://fsf.org website.
   21:  */
   22: 
   23: #include "rsync.h"
   24: 
   25: /* Produce a string representation of Unix mode bits like that used by ls(1).
   26:  * The "buf" buffer must be at least 11 characters. */
   27: void permstring(char *perms, mode_t mode)
   28: {
   29: 	static const char *perm_map = "rwxrwxrwx";
   30: 	int i;
   31: 
   32: 	strlcpy(perms, "----------", 11);
   33: 
   34: 	for (i = 0; i < 9; i++) {
   35: 		if (mode & (1 << i))
   36: 			perms[9-i] = perm_map[8-i];
   37: 	}
   38: 
   39: 	/* Handle setuid/sticky bits.  You might think the indices are
   40: 	 * off by one, but remember there's a type char at the
   41: 	 * start.  */
   42: 	if (mode & S_ISUID)
   43: 		perms[3] = (mode & S_IXUSR) ? 's' : 'S';
   44: 
   45: 	if (mode & S_ISGID)
   46: 		perms[6] = (mode & S_IXGRP) ? 's' : 'S';
   47: 
   48: #ifdef S_ISVTX
   49: 	if (mode & S_ISVTX)
   50: 		perms[9] = (mode & S_IXOTH) ? 't' : 'T';
   51: #endif
   52: 
   53: 	if (S_ISDIR(mode))
   54: 		perms[0] = 'd';
   55: 	else if (S_ISLNK(mode))
   56: 		perms[0] = 'l';
   57: 	else if (S_ISBLK(mode))
   58: 		perms[0] = 'b';
   59: 	else if (S_ISCHR(mode))
   60: 		perms[0] = 'c';
   61: 	else if (S_ISSOCK(mode))
   62: 		perms[0] = 's';
   63: 	else if (S_ISFIFO(mode))
   64: 		perms[0] = 'p';
   65: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>