archive_entry_strmode.c revision 256281
155682Smarkm/*- 2233294Sstas * Copyright (c) 2003-2007 Tim Kientzle 3233294Sstas * All rights reserved. 4233294Sstas * 555682Smarkm * Redistribution and use in source and binary forms, with or without 6233294Sstas * modification, are permitted provided that the following conditions 7233294Sstas * are met: 8233294Sstas * 1. Redistributions of source code must retain the above copyright 955682Smarkm * notice, this list of conditions and the following disclaimer. 10233294Sstas * 2. Redistributions in binary form must reproduce the above copyright 11233294Sstas * notice, this list of conditions and the following disclaimer in the 1255682Smarkm * documentation and/or other materials provided with the distribution. 13233294Sstas * 14233294Sstas * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15233294Sstas * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1655682Smarkm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1755682Smarkm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 1855682Smarkm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 1955682Smarkm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2055682Smarkm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2155682Smarkm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2255682Smarkm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2355682Smarkm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2455682Smarkm */ 2555682Smarkm 2655682Smarkm#include "archive_platform.h" 2755682Smarkm__FBSDID("$FreeBSD: stable/10/contrib/libarchive/libarchive/archive_entry_strmode.c 228763 2011-12-21 11:13:29Z mm $"); 2855682Smarkm 2955682Smarkm#ifdef HAVE_SYS_STAT_H 3055682Smarkm#include <sys/stat.h> 3155682Smarkm#endif 3255682Smarkm#ifdef HAVE_STRING_H 3355682Smarkm#include <string.h> 3455682Smarkm#endif 35178825Sdfr 3655682Smarkm#include "archive_entry.h" 3755682Smarkm#include "archive_entry_private.h" 3855682Smarkm 3955682Smarkmconst char * 4055682Smarkmarchive_entry_strmode(struct archive_entry *entry) 4155682Smarkm{ 42178825Sdfr static const mode_t permbits[] = 4355682Smarkm { 0400, 0200, 0100, 0040, 0020, 0010, 0004, 0002, 0001 }; 4455682Smarkm char *bp = entry->strmode; 4555682Smarkm mode_t mode; 46233294Sstas int i; 4755682Smarkm 48178825Sdfr /* Fill in a default string, then selectively override. */ 49178825Sdfr strcpy(bp, "?rwxrwxrwx "); 5055682Smarkm 5155682Smarkm mode = archive_entry_mode(entry); 5255682Smarkm switch (archive_entry_filetype(entry)) { 5355682Smarkm case AE_IFREG: bp[0] = '-'; break; 5455682Smarkm case AE_IFBLK: bp[0] = 'b'; break; 5555682Smarkm case AE_IFCHR: bp[0] = 'c'; break; 5655682Smarkm case AE_IFDIR: bp[0] = 'd'; break; 5755682Smarkm case AE_IFLNK: bp[0] = 'l'; break; 5855682Smarkm case AE_IFSOCK: bp[0] = 's'; break; 5955682Smarkm case AE_IFIFO: bp[0] = 'p'; break; 6055682Smarkm default: 6155682Smarkm if (archive_entry_hardlink(entry) != NULL) { 6255682Smarkm bp[0] = 'h'; 6355682Smarkm break; 6455682Smarkm } 6555682Smarkm } 6655682Smarkm 67233294Sstas for (i = 0; i < 9; i++) 68233294Sstas if (!(mode & permbits[i])) 6955682Smarkm bp[i+1] = '-'; 7055682Smarkm 71233294Sstas if (mode & S_ISUID) { 7255682Smarkm if (mode & 0100) bp[3] = 's'; 7355682Smarkm else bp[3] = 'S'; 7455682Smarkm } 7555682Smarkm if (mode & S_ISGID) { 7655682Smarkm if (mode & 0010) bp[6] = 's'; 7755682Smarkm else bp[6] = 'S'; 78178825Sdfr } 7955682Smarkm if (mode & S_ISVTX) { 8055682Smarkm if (mode & 0001) bp[9] = 't'; 81178825Sdfr else bp[9] = 'T'; 8255682Smarkm } 8355682Smarkm if (archive_entry_acl_count(entry, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)) 8455682Smarkm bp[10] = '+'; 8555682Smarkm 8655682Smarkm return (bp); 8755682Smarkm} 8855682Smarkm