New API call iso_local_get_acl_text()

and bug fixes about "default" ACL
This commit is contained in:
Thomas Schmitt 2009-01-27 21:19:49 +01:00
parent 0b4792bc0c
commit b53ef57ac6
5 changed files with 72 additions and 33 deletions

View File

@ -43,45 +43,31 @@
@return 1 ok @return 1 ok
2 only st_mode permissions exist and bit 4 is set 2 only st_mode permissions exist and bit 4 is set
or empty ACL and bit0 is set or empty ACL and bit0 is set
0 ACL support not enabled at compile time
-1 failure of system ACL service (see errno) -1 failure of system ACL service (see errno)
-2 ACL support not enabled at compile time
*/ */
int aaip_get_acl_text(char *path, char **text, int flag) int aaip_get_acl_text(char *path, char **text, int flag)
{ {
#ifdef Libisofs_with_aaip_acL #ifdef Libisofs_with_aaip_acL
acl_t acl= NULL; acl_t acl= NULL;
#endif
struct stat stbuf; struct stat stbuf;
int ret; int ret;
if(flag & (1 << 15)) { if(flag & (1 << 15)) {
if(*text != NULL) if(*text != NULL)
#ifdef Libisofs_with_aaip_acL
acl_free(text); acl_free(text);
#else
free(text);
#endif
*text= NULL; *text= NULL;
return(1); return(1);
} }
*text= NULL; *text= NULL;
#ifdef Libisofs_with_aaip_acL
acl= acl_get_file(path, (flag & 1) ? ACL_TYPE_DEFAULT : ACL_TYPE_ACCESS); acl= acl_get_file(path, (flag & 1) ? ACL_TYPE_DEFAULT : ACL_TYPE_ACCESS);
if(acl == NULL) if(acl == NULL)
return(-1); return(-1);
*text= acl_to_text(acl, NULL); *text= acl_to_text(acl, NULL);
acl_free(acl); acl_free(acl);
#else /* Libisofs_with_aaip_acL */
/* ??? >>> Fake ACL */;
return(-2);
#endif /* ! Libisofs_with_aaip_acL */
if(*text == NULL) if(*text == NULL)
return(-1); return(-1);
if(flag & 16) { if(flag & 16) {
@ -94,16 +80,18 @@ int aaip_get_acl_text(char *path, char **text, int flag)
} }
if(flag & (1 | 16)) { if(flag & (1 | 16)) {
if((*text)[0] == 0 || strcmp(*text, "\n") == 0) { if((*text)[0] == 0 || strcmp(*text, "\n") == 0) {
#ifdef Libisofs_with_aaip_acL
acl_free(text); acl_free(text);
#else
free(text);
#endif
*text= NULL; *text= NULL;
return(2); return(2);
} }
} }
return(1); return(1);
#else /* Libisofs_with_aaip_acL */
return(0);
#endif /* ! Libisofs_with_aaip_acL */
} }
@ -288,9 +276,9 @@ ex:;
@param text The input text (0 terminated, ACL long text form) @param text The input text (0 terminated, ACL long text form)
@param flag Bitfield for control purposes @param flag Bitfield for control purposes
bit0= set default ACL rather than access ACL bit0= set default ACL rather than access ACL
@return > 0 ok @return >0 ok
-1 failure of system ACL service (see errno) 0 ACL support not enabled at compile time
-2 ACL support not enabled at compile time -1 failure of system ACL service (see errno)
*/ */
int aaip_set_acl_text(char *path, char *text, int flag) int aaip_set_acl_text(char *path, char *text, int flag)
{ {
@ -315,7 +303,7 @@ ex:
#else /* Libisofs_with_aaip_acL */ #else /* Libisofs_with_aaip_acL */
return(-2); return(0);
#endif /* ! Libisofs_with_aaip_acL */ #endif /* ! Libisofs_with_aaip_acL */

View File

@ -2006,7 +2006,7 @@ int aaip_decode_acl(unsigned char *data, size_t num_data, size_t *consumed,
ret= aaip_write_acl_line(&wpt, &w_size, "other", "", perm_text, cnt); ret= aaip_write_acl_line(&wpt, &w_size, "other", "", perm_text, cnt);
} else if(type == Aaip_SWITCH_MARK) { } else if(type == Aaip_SWITCH_MARK) {
/* Indicate to caller: end of desired ACL type access/default */ /* Indicate to caller: end of desired ACL type access/default */
if((!(perm & Aaip_EXEC)) ^ (!!(flag & 2))) if((perm & Aaip_EXEC) ^ (!!(flag & 2)))
return(2); return(2);
} else if(type == Aaip_ACL_USER_N) { } else if(type == Aaip_ACL_USER_N) {
/* determine username from uid */ /* determine username from uid */

View File

@ -43,7 +43,7 @@ size_t aaip_encode(char aa_name[2], size_t num_attrs, char **names,
Attribute. According to AAIP 0.2 this value is to be stored together with Attribute. According to AAIP 0.2 this value is to be stored together with
an empty name. an empty name.
@param acl_text The ACL in long text form @param acl_text The ACL in long text form
@param st_mode The stat(2) permission bits to be used with flag bit2 @param st_mode The stat(2) permission bits to be used with flag bit3
@param result_len Number of bytes in the resulting value @param result_len Number of bytes in the resulting value
@param result *result will point to the start of the result string. @param result *result will point to the start of the result string.
This is malloc() memory which needs to be freed when This is malloc() memory which needs to be freed when
@ -68,7 +68,7 @@ int aaip_encode_acl(char *acl_text, mode_t st_mode,
Submit NULL if there is no such ACL to be encoded. Submit NULL if there is no such ACL to be encoded.
@param d_acl_text The "default" ACL in long text form. @param d_acl_text The "default" ACL in long text form.
Submit NULL if there is no such ACL to be encoded. Submit NULL if there is no such ACL to be encoded.
@param st_mode The stat(2) permission bits to be used with flag bit2 @param st_mode The stat(2) permission bits to be used with flag bit3
@param result_len Number of bytes in the resulting value @param result_len Number of bytes in the resulting value
@param result *result will point to the start of the result string. @param result *result will point to the start of the result string.
This is malloc() memory which needs to be freed when This is malloc() memory which needs to be freed when
@ -154,6 +154,7 @@ int aaip_add_acl_st_mode(char *acl_text, mode_t st_mode, int flag);
bit15= free text and return 1 bit15= free text and return 1
@return 1 ok @return 1 ok
2 only st_mode permissions exist and bit 4 is set 2 only st_mode permissions exist and bit 4 is set
0 ACL support not enabled at compile time
-1 failure of system ACL service (see errno) -1 failure of system ACL service (see errno)
*/ */
int aaip_get_acl_text(char *path, char **text, int flag); int aaip_get_acl_text(char *path, char **text, int flag);
@ -458,7 +459,7 @@ int aaip_decode_acl(unsigned char *data, size_t num_data, size_t *consumed,
@param flag Bitfield for control purposes @param flag Bitfield for control purposes
bit0= set default ACL rather than access ACL bit0= set default ACL rather than access ACL
@return >0 ok @return >0 ok
0 no ACL manipulation adapter available 0 ACL support not enabled at compile time
-1 failure of system ACL service (see errno) -1 failure of system ACL service (see errno)
*/ */
int aaip_set_acl_text(char *path, char *text, int flag); int aaip_set_acl_text(char *path, char *text, int flag);

View File

@ -3169,6 +3169,9 @@ int iso_tree_add_node(IsoImage *image, IsoDir *parent, const char *path,
IsoNode **node); IsoNode **node);
/** /**
* This is a more versatile form of iso_tree_add_node which allows to set
* the node name in ISO image already when it gets added.
*
* Add a new node to the image tree, from an existing file, and with the * Add a new node to the image tree, from an existing file, and with the
* given name, that must not exist on dir. * given name, that must not exist on dir.
* *
@ -4250,7 +4253,7 @@ int aaip_xinfo_func(void *data, int flag);
* @return * @return
* 2 ACL produced from POSIX permissions * 2 ACL produced from POSIX permissions
* 1 ACL was read from node * 1 ACL was read from node
* 0 if the desire ACL type is not available * 0 if the desired ACL type is not available
* < 0 on error * < 0 on error
* *
* @since 0.6.14 * @since 0.6.14
@ -4283,13 +4286,43 @@ int iso_node_get_acl_text(IsoNode *node, char **text, int flag);
* return success. * return success.
* @return * @return
* > 0 success * > 0 success
* <=0 failure * < 0 failure
*/ */
int iso_node_set_acl_text(IsoNode *node, char *text, int flag); int iso_node_set_acl_text(IsoNode *node, char *text, int flag);
/* -------- This is an interface to the ACL of the local filesystem -------- */
/* ts A90127 */
/**
* Get the ACL of the given file in the local filesystem in long text form.
*
* @param disk_path
* Path to the file
* @param text
* Will return a pointer to the ACL text. If not NULL the text will be
* 0 terminated and finally has to be disposed by a call to this function
* with bit15 set.
* @param flag
* Bitfield for control purposes
* bit0= get default ACL rather than access ACL
* bit4= set *text = NULL and return 2
* if the ACL matches st_mode permissions.
* bit15= free text and return 1
* @return
* 1 ok
* 2 ok, trivial ACL found while bit4 is set, *text is NULL
* 0 no ACL manipulation adapter available
* -1 failure of system ACL service (see errno)
*
* @since 0.6.14
*/
int iso_local_get_acl_text(char *disk_path, char **text, int flag);
/* ts A90118 */ /* ts A90118 */
/* Set the ACL of the given file in the local filesystem to a given list /**
* Set the ACL of the given file in the local filesystem to a given list
* in long text form. * in long text form.
* *
* @param disk_path * @param disk_path
@ -4305,7 +4338,7 @@ int iso_node_set_acl_text(IsoNode *node, char *text, int flag);
* -1 failure of system ACL service (see errno) * -1 failure of system ACL service (see errno)
* *
* @since 0.6.14 * @since 0.6.14
*/ */
int iso_local_set_acl_text(char *disk_path, char *text, int flag); int iso_local_set_acl_text(char *disk_path, char *text, int flag);

View File

@ -1817,7 +1817,7 @@ int iso_local_set_acl_text(char *disk_path, char *text, int flag)
#ifdef Libisofs_with_aaiP #ifdef Libisofs_with_aaiP
return aaip_set_acl_text(disk_path, text, flag); return aaip_set_acl_text(disk_path, text, flag & 1);
#else /* Libisofs_with_aaiP */ #else /* Libisofs_with_aaiP */
@ -1827,3 +1827,20 @@ int iso_local_set_acl_text(char *disk_path, char *text, int flag)
} }
/* ts A90127 */
int iso_local_get_acl_text(char *disk_path, char **text, int flag)
{
#ifdef Libisofs_with_aaiP
return aaip_get_acl_text(disk_path, text, flag & (1 | 16 | (1 << 15)));
#else /* Libisofs_with_aaiP */
return 0;
#endif /* ! Libisofs_with_aaiP */
}