File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / rsync / lib / sysacls.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Fri Feb 17 15:09:30 2012 UTC (12 years, 6 months ago) by misho
Branches: rsync, MAIN
CVS tags: rsync3_0_9p0, RSYNC3_1_0, RSYNC3_0_9, HEAD
rsync

    1: /*
    2:  * Unix SMB/Netbios implementation.
    3:  * Version 2.2.x
    4:  * Portable SMB ACL interface
    5:  * Copyright (C) Jeremy Allison 2000
    6:  * Copyright (C) 2007-2008 Wayne Davison
    7:  *
    8:  * This program is free software; you can redistribute it and/or modify
    9:  * it under the terms of the GNU General Public License as published by
   10:  * the Free Software Foundation; either version 3 of the License, or
   11:  * (at your option) any later version.
   12:  *
   13:  * This program is distributed in the hope that it will be useful,
   14:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
   15:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   16:  * GNU General Public License for more details.
   17:  *
   18:  * You should have received a copy of the GNU General Public License
   19:  * with this program; if not, visit the http://fsf.org website.
   20:  */
   21: 
   22: #ifdef SUPPORT_ACLS
   23: 
   24: #ifdef HAVE_SYS_ACL_H
   25: #include <sys/acl.h>
   26: #endif
   27: #ifdef HAVE_ACL_LIBACL_H
   28: #include <acl/libacl.h>
   29: #endif
   30: 
   31: #define SMB_MALLOC(cnt) new_array(char, cnt)
   32: #define SMB_MALLOC_P(obj) new_array(obj, 1)
   33: #define SMB_MALLOC_ARRAY(obj, cnt) new_array(obj, cnt)
   34: #define SMB_REALLOC(mem, cnt) realloc_array(mem, char, cnt)
   35: #define slprintf snprintf
   36: 
   37: #if defined HAVE_POSIX_ACLS /*-----------------------------------------------*/
   38: 
   39: /* This is an identity mapping (just remove the SMB_). */
   40: 
   41: #define SMB_ACL_TAG_T		acl_tag_t
   42: #define SMB_ACL_TYPE_T		acl_type_t
   43: 
   44: /* Types of ACLs. */
   45: #define SMB_ACL_USER		ACL_USER
   46: #define SMB_ACL_USER_OBJ	ACL_USER_OBJ
   47: #define SMB_ACL_GROUP		ACL_GROUP
   48: #define SMB_ACL_GROUP_OBJ	ACL_GROUP_OBJ
   49: #define SMB_ACL_OTHER		ACL_OTHER
   50: #define SMB_ACL_MASK		ACL_MASK
   51: 
   52: #define SMB_ACL_T		acl_t
   53: 
   54: #define SMB_ACL_ENTRY_T		acl_entry_t
   55: 
   56: #define SMB_ACL_FIRST_ENTRY	ACL_FIRST_ENTRY
   57: #define SMB_ACL_NEXT_ENTRY	ACL_NEXT_ENTRY
   58: 
   59: #define SMB_ACL_TYPE_ACCESS	ACL_TYPE_ACCESS
   60: #define SMB_ACL_TYPE_DEFAULT	ACL_TYPE_DEFAULT
   61: 
   62: #define SMB_ACL_VALID_NAME_BITS	(4 | 2 | 1)
   63: #define SMB_ACL_VALID_OBJ_BITS	(4 | 2 | 1)
   64: 
   65: #define SMB_ACL_NEED_SORT
   66: 
   67: #elif defined HAVE_TRU64_ACLS /*---------------------------------------------*/
   68: 
   69: /* This is for DEC/Compaq Tru64 UNIX */
   70: 
   71: #define SMB_ACL_TAG_T		acl_tag_t
   72: #define SMB_ACL_TYPE_T		acl_type_t
   73: 
   74: /* Types of ACLs. */
   75: #define SMB_ACL_USER		ACL_USER
   76: #define SMB_ACL_USER_OBJ	ACL_USER_OBJ
   77: #define SMB_ACL_GROUP		ACL_GROUP
   78: #define SMB_ACL_GROUP_OBJ	ACL_GROUP_OBJ
   79: #define SMB_ACL_OTHER		ACL_OTHER
   80: #define SMB_ACL_MASK		ACL_MASK
   81: 
   82: #define SMB_ACL_T		acl_t
   83: 
   84: #define SMB_ACL_ENTRY_T		acl_entry_t
   85: 
   86: #define SMB_ACL_FIRST_ENTRY	0
   87: #define SMB_ACL_NEXT_ENTRY	1
   88: 
   89: #define SMB_ACL_TYPE_ACCESS	ACL_TYPE_ACCESS
   90: #define SMB_ACL_TYPE_DEFAULT	ACL_TYPE_DEFAULT
   91: 
   92: #define SMB_ACL_VALID_NAME_BITS	(4 | 2 | 1)
   93: #define SMB_ACL_VALID_OBJ_BITS	(4 | 2 | 1)
   94: 
   95: #define SMB_ACL_NEED_SORT
   96: 
   97: #elif defined HAVE_UNIXWARE_ACLS || defined HAVE_SOLARIS_ACLS /*-------------*/
   98: 
   99: /* Donated by Michael Davidson <md@sco.COM> for UnixWare / OpenUNIX.
  100:  * Modified by Toomas Soome <tsoome@ut.ee> for Solaris.  */
  101: 
  102: /* SVR4.2 ES/MP ACLs */
  103: typedef int SMB_ACL_TAG_T;
  104: typedef int SMB_ACL_TYPE_T;
  105: 
  106: /* Types of ACLs. */
  107: #define SMB_ACL_USER		USER
  108: #define SMB_ACL_USER_OBJ	USER_OBJ
  109: #define SMB_ACL_GROUP		GROUP
  110: #define SMB_ACL_GROUP_OBJ	GROUP_OBJ
  111: #define SMB_ACL_OTHER		OTHER_OBJ
  112: #define SMB_ACL_MASK		CLASS_OBJ
  113: 
  114: typedef struct SMB_ACL_T {
  115: 	int size;
  116: 	int count;
  117: 	int next;
  118: 	struct acl acl[1];
  119: } *SMB_ACL_T;
  120: 
  121: typedef struct acl *SMB_ACL_ENTRY_T;
  122: 
  123: #define SMB_ACL_FIRST_ENTRY	0
  124: #define SMB_ACL_NEXT_ENTRY	1
  125: 
  126: #define SMB_ACL_TYPE_ACCESS	0
  127: #define SMB_ACL_TYPE_DEFAULT	1
  128: 
  129: #define SMB_ACL_VALID_NAME_BITS	(4 | 2 | 1)
  130: #define SMB_ACL_VALID_OBJ_BITS	(4 | 2 | 1)
  131: 
  132: #define SMB_ACL_NEED_SORT
  133: 
  134: #ifdef __CYGWIN__
  135: #define SMB_ACL_LOSES_SPECIAL_MODE_BITS
  136: #endif
  137: 
  138: #elif defined HAVE_HPUX_ACLS /*----------------------------------------------*/
  139: 
  140: /* Based on the Solaris & UnixWare code. */
  141: 
  142: #undef GROUP
  143: #include <sys/aclv.h>
  144: 
  145: /* SVR4.2 ES/MP ACLs */
  146: typedef int SMB_ACL_TAG_T;
  147: typedef int SMB_ACL_TYPE_T;
  148: 
  149: /* Types of ACLs. */
  150: #define SMB_ACL_USER		USER
  151: #define SMB_ACL_USER_OBJ	USER_OBJ
  152: #define SMB_ACL_GROUP		GROUP
  153: #define SMB_ACL_GROUP_OBJ	GROUP_OBJ
  154: #define SMB_ACL_OTHER		OTHER_OBJ
  155: #define SMB_ACL_MASK		CLASS_OBJ
  156: 
  157: typedef struct SMB_ACL_T {
  158: 	int size;
  159: 	int count;
  160: 	int next;
  161: 	struct acl acl[1];
  162: } *SMB_ACL_T;
  163: 
  164: typedef struct acl *SMB_ACL_ENTRY_T;
  165: 
  166: #define SMB_ACL_FIRST_ENTRY	0
  167: #define SMB_ACL_NEXT_ENTRY	1
  168: 
  169: #define SMB_ACL_TYPE_ACCESS	0
  170: #define SMB_ACL_TYPE_DEFAULT	1
  171: 
  172: #define SMB_ACL_VALID_NAME_BITS	(4 | 2 | 1)
  173: #define SMB_ACL_VALID_OBJ_BITS	(4 | 2 | 1)
  174: 
  175: #define SMB_ACL_NEED_SORT
  176: 
  177: #elif defined HAVE_IRIX_ACLS /*----------------------------------------------*/
  178: 
  179: /* IRIX ACLs */
  180: 
  181: #define SMB_ACL_TAG_T		acl_tag_t
  182: #define SMB_ACL_TYPE_T		acl_type_t
  183: 
  184: /* Types of ACLs. */
  185: #define SMB_ACL_USER		ACL_USER
  186: #define SMB_ACL_USER_OBJ	ACL_USER_OBJ
  187: #define SMB_ACL_GROUP		ACL_GROUP
  188: #define SMB_ACL_GROUP_OBJ	ACL_GROUP_OBJ
  189: #define SMB_ACL_OTHER		ACL_OTHER_OBJ
  190: #define SMB_ACL_MASK		ACL_MASK
  191: 
  192: typedef struct SMB_ACL_T {
  193: 	int next;
  194: 	BOOL freeaclp;
  195: 	struct acl *aclp;
  196: } *SMB_ACL_T;
  197: 
  198: #define SMB_ACL_ENTRY_T		acl_entry_t
  199: 
  200: #define SMB_ACL_FIRST_ENTRY	0
  201: #define SMB_ACL_NEXT_ENTRY	1
  202: 
  203: #define SMB_ACL_TYPE_ACCESS	ACL_TYPE_ACCESS
  204: #define SMB_ACL_TYPE_DEFAULT	ACL_TYPE_DEFAULT
  205: 
  206: #define SMB_ACL_VALID_NAME_BITS	(4 | 2 | 1)
  207: #define SMB_ACL_VALID_OBJ_BITS	(4 | 2 | 1)
  208: 
  209: #define SMB_ACL_NEED_SORT
  210: 
  211: #elif defined HAVE_AIX_ACLS /*-----------------------------------------------*/
  212: 
  213: /* Donated by Medha Date, mdate@austin.ibm.com, for IBM */
  214: 
  215: #include "/usr/include/acl.h"
  216: 
  217: struct acl_entry_link{
  218: 	struct acl_entry_link *prevp;
  219: 	struct new_acl_entry *entryp;
  220: 	struct acl_entry_link *nextp;
  221: 	int count;
  222: };
  223: 
  224: struct new_acl_entry{
  225: 	unsigned short ace_len;
  226: 	unsigned short ace_type;
  227: 	unsigned int ace_access;
  228: 	struct ace_id ace_id[1];
  229: };
  230: 
  231: #define SMB_ACL_ENTRY_T		struct new_acl_entry*
  232: #define SMB_ACL_T		struct acl_entry_link*
  233:  
  234: #define SMB_ACL_TAG_T		unsigned short
  235: #define SMB_ACL_TYPE_T		int
  236: 
  237: /* Types of ACLs. */
  238: #define SMB_ACL_USER		ACEID_USER
  239: #define SMB_ACL_USER_OBJ	3
  240: #define SMB_ACL_GROUP		ACEID_GROUP
  241: #define SMB_ACL_GROUP_OBJ	4
  242: #define SMB_ACL_OTHER		5
  243: #define SMB_ACL_MASK		6
  244: 
  245: #define SMB_ACL_FIRST_ENTRY	1
  246: #define SMB_ACL_NEXT_ENTRY	2
  247: 
  248: #define SMB_ACL_TYPE_ACCESS	0
  249: #define SMB_ACL_TYPE_DEFAULT	1
  250: 
  251: #define SMB_ACL_VALID_NAME_BITS	(4 | 2 | 1)
  252: #define SMB_ACL_VALID_OBJ_BITS	(4 | 2 | 1)
  253: 
  254: #define SMB_ACL_NEED_SORT
  255: 
  256: #elif defined(HAVE_OSX_ACLS) /*----------------------------------------------*/
  257: 
  258: /* Special handling for OS X ACLs */
  259: 
  260: #define SMB_ACL_TAG_T		acl_tag_t
  261: #define SMB_ACL_TYPE_T		acl_type_t
  262: 
  263: #define SMB_ACL_T		acl_t
  264: 
  265: #define SMB_ACL_ENTRY_T		acl_entry_t
  266: 
  267: #define SMB_ACL_USER		1
  268: #define SMB_ACL_GROUP		2
  269: 
  270: #define SMB_ACL_FIRST_ENTRY	ACL_FIRST_ENTRY
  271: #define SMB_ACL_NEXT_ENTRY	ACL_NEXT_ENTRY
  272: 
  273: #define SMB_ACL_TYPE_ACCESS	ACL_TYPE_EXTENDED
  274: #define SMB_ACL_TYPE_DEFAULT	ACL_TYPE_DEFAULT
  275: 
  276: #define SMB_ACL_VALID_NAME_BITS	((1<<25)-1)
  277: #define SMB_ACL_VALID_OBJ_BITS	0
  278: 
  279: /*#undef SMB_ACL_NEED_SORT*/
  280: 
  281: #else /*---------------------------------------------------------------------*/
  282: 
  283: /* Unknown platform. */
  284: 
  285: #error Cannot handle ACLs on this platform!
  286: 
  287: #endif
  288: 
  289: int sys_acl_get_entry(SMB_ACL_T the_acl, int entry_id, SMB_ACL_ENTRY_T *entry_p);
  290: int sys_acl_get_tag_type(SMB_ACL_ENTRY_T entry_d, SMB_ACL_TAG_T *tag_type_p);
  291: int sys_acl_get_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T *tag_type_p, uint32 *bits_p, id_t *u_g_id_p);
  292: SMB_ACL_T sys_acl_get_file(const char *path_p, SMB_ACL_TYPE_T type);
  293: SMB_ACL_T sys_acl_get_fd(int fd);
  294: SMB_ACL_T sys_acl_init(int count);
  295: int sys_acl_create_entry(SMB_ACL_T *pacl, SMB_ACL_ENTRY_T *pentry);
  296: int sys_acl_set_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T tagtype, uint32 bits, id_t u_g_id);
  297: int sys_acl_set_access_bits(SMB_ACL_ENTRY_T entry, uint32 bits);
  298: int sys_acl_valid(SMB_ACL_T theacl);
  299: int sys_acl_set_file(const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl);
  300: int sys_acl_set_fd(int fd, SMB_ACL_T theacl);
  301: int sys_acl_delete_def_file(const char *name);
  302: int sys_acl_free_acl(SMB_ACL_T the_acl);
  303: int no_acl_syscall_error(int err);
  304: 
  305: #endif /* SUPPORT_ACLS */

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