From d048fc47103d4c5a5c4a5b4951fd085789725ee9 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Wed, 28 Jan 2009 07:49:56 +0000 Subject: [PATCH] Bug fixes and enhancements about "default" ACL --- xorriso/xorriso_timestamp.h | 2 +- xorriso/xorrisoburn.c | 161 +++++++++++++++++++++++++----------- 2 files changed, 115 insertions(+), 48 deletions(-) diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 79164a77..7d37f020 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2009.01.27.121417" +#define Xorriso_timestamP "2009.01.28.074917" diff --git a/xorriso/xorrisoburn.c b/xorriso/xorrisoburn.c index 07a20797..7cc661e5 100644 --- a/xorriso/xorrisoburn.c +++ b/xorriso/xorrisoburn.c @@ -2014,11 +2014,15 @@ int Xorriso_iso_lstat(struct XorrisO *xorriso, char *path, struct stat *stbuf, /* @param flag bit0= give directory x-permission where is r-permission + bit1= do not transfer ACL + bit2= transfer ACL even if NULL */ int Xorriso_transfer_properties(struct XorrisO *xorriso, struct stat *stbuf, - IsoNode *node, int flag) + char *disk_path, IsoNode *node, int flag) { mode_t mode; + int a_ret= 0, d_ret= 0; + char *default_text= NULL, *access_text= NULL; mode= stbuf->st_mode; if((flag&1) && S_ISDIR(mode)) { @@ -2035,7 +2039,21 @@ int Xorriso_transfer_properties(struct XorrisO *xorriso, struct stat *stbuf, iso_node_set_atime(node, stbuf->st_atime); iso_node_set_mtime(node, stbuf->st_mtime); iso_node_set_ctime(node, stbuf->st_ctime); - return(1); + + if((xorriso->do_aaip & 1) && !(flag & 2)) { + a_ret= iso_local_get_acl_text(disk_path, &access_text, 16); + if(a_ret > 0 && (access_text != NULL || (flag & 4))) + a_ret= iso_node_set_acl_text(node, access_text, 0); + if(access_text != NULL) + iso_local_get_acl_text(disk_path, &access_text, 1 << 15); + if(S_ISDIR(stbuf->st_mode) && a_ret >= 0) + d_ret= iso_local_get_acl_text(disk_path, &default_text, 1); + if(d_ret > 0 && (default_text != NULL || (flag & 4))) + d_ret= iso_node_set_acl_text(node, default_text, 1); + if(default_text != NULL) + iso_local_get_acl_text(disk_path, &default_text, 1 << 15); + } + return(a_ret >= 0 && d_ret >= 0); } @@ -2336,7 +2354,7 @@ cannot_lstat:; ret= iso_tree_add_new_symlink(dir, img_name, link_target, &iso_symlink); node= (IsoNode *) iso_symlink; if(ret>0) { - ret= Xorriso_transfer_properties(xorriso, &stbuf, node, 0); + ret= Xorriso_transfer_properties(xorriso, &stbuf, srcpt, node, 2); if(ret<=0) goto was_problem; } else { @@ -2446,7 +2464,7 @@ int Xorriso_copy_implicit_properties(struct XorrisO *xorriso, IsoDir *dir, strcpy(nfd, "/"); if(stat(nfd, &stbuf)==-1) return(0); - Xorriso_transfer_properties(xorriso, &stbuf, (IsoNode *) dir, + Xorriso_transfer_properties(xorriso, &stbuf, nfd, (IsoNode *) dir, ((flag&1) && d==0)); sprintf(xorriso->info_text, "Copied properties for %s", Text_shellsafe(ni, sfe, 0)); @@ -2471,9 +2489,15 @@ int Xorriso_copy_properties(struct XorrisO *xorriso, ret= Xorriso_get_node_by_path(xorriso, img_path, NULL, &node, 0); if(ret<=0) return(ret); - if(lstat(disk_path, &stbuf)==-1) - return(0); - Xorriso_transfer_properties(xorriso, &stbuf, node, (flag&2)>>1); + if(flag & 1) { + if(stat(disk_path, &stbuf)==-1) + return(0); + } else { + if(lstat(disk_path, &stbuf)==-1) + return(0); + } + Xorriso_transfer_properties(xorriso, &stbuf, disk_path, node, + 4 | ((flag & 2) >> 1) | (((stbuf.st_mode & S_IFMT) == S_IFLNK) << 1)); xorriso->volset_change_pending= 1; return(1); } @@ -2670,7 +2694,8 @@ attach_source:; /* directory node was created above */; } else if(is_dir) { - Xorriso_transfer_properties(xorriso, &stbuf, (IsoNode *) dir, 0); + Xorriso_transfer_properties(xorriso, &stbuf, disk_path, + (IsoNode *) dir, ((stbuf.st_mode & S_IFMT) == S_IFLNK) << 1); if(!(flag&32)) { ret= Xorriso_add_tree(xorriso, dir, img_path, disk_path, NULL, flag&2); @@ -8790,9 +8815,9 @@ ok:; int Xorriso_getfacl(struct XorrisO *xorriso, void *in_node, char *path, char **acl_text, int flag) { - int ret, path_offset= 0; + int ret, d_ret, path_offset= 0, result_len= 0, pass; IsoNode *node; - char *text= NULL, *cpt, *npt; + char *text= NULL, *d_text= NULL, *cpt, *npt; uid_t uid; gid_t gid; struct passwd *pwd; @@ -8808,11 +8833,14 @@ int Xorriso_getfacl(struct XorrisO *xorriso, void *in_node, char *path, #ifdef Xorriso_with_aaiP ret= iso_node_get_acl_text(node, &text, 0); + if(ret > 0 && LIBISO_ISDIR(node)) { + d_ret= iso_node_get_acl_text(node, &d_text, 1 | 16); + } #else - ret= 0; + ret= d_ret= 0; #endif - if(ret < 0) { + if(ret < 0 || d_ret < 0) { if(path != NULL && path[0] != 0) { strcpy(xorriso->info_text, "Error with obtaining ACL of "); Text_shellsafe(path, xorriso->info_text, 1); @@ -8824,11 +8852,11 @@ int Xorriso_getfacl(struct XorrisO *xorriso, void *in_node, char *path, ret= 1 + (ret != 1); goto ex; } - if(flag & 1) { - ret= 1 + (ret == 0); - goto ex; - } if(ret == 0 || ret == 2) { + if(flag & 1) { + ret= 1 + (ret == 0); + goto ex; + } #ifdef Xorriso_with_aaiP strcpy(xorriso->info_text, "No ACL associated with "); Text_shellsafe(path, xorriso->info_text, 1); @@ -8841,43 +8869,82 @@ int Xorriso_getfacl(struct XorrisO *xorriso, void *in_node, char *path, {ret= 2; goto ex;} } - if(path[0] == '/' && !(flag & 2)) - path_offset= 1; - strcpy(xorriso->result_line, "# file: "); - Text_shellsafe(path + path_offset, xorriso->result_line, 1); - strcat(xorriso->result_line, "\n"); - Xorriso_result(xorriso, 0); - - uid= iso_node_get_uid(node); - pwd= getpwuid(uid); - if(pwd == NULL) - sprintf(xorriso->result_line, "# owner: %.f\n", (double) uid); - else - sprintf(xorriso->result_line, "# owner: %s\n", pwd->pw_name); - Xorriso_result(xorriso, 0); - - gid= iso_node_get_gid(node); - grp= getgrgid(gid); - if(grp == NULL) - sprintf(xorriso->result_line, "# group: %.f\n", (double) gid); - else - sprintf(xorriso->result_line, "# group: %s\n", grp->gr_name); - Xorriso_result(xorriso, 0); - - for(npt= cpt= text; npt != NULL; cpt= npt + 1) { - npt= strchr(cpt, '\n'); - if(npt != NULL) - *npt= 0; - Sfile_str(xorriso->result_line, cpt, 0); + if(!(flag & 1)) { + if(path[0] == '/' && !(flag & 2)) + path_offset= 1; + strcpy(xorriso->result_line, "# file: "); + Text_shellsafe(path + path_offset, xorriso->result_line, 1); strcat(xorriso->result_line, "\n"); Xorriso_result(xorriso, 0); + + uid= iso_node_get_uid(node); + pwd= getpwuid(uid); + if(pwd == NULL) + sprintf(xorriso->result_line, "# owner: %.f\n", (double) uid); + else + sprintf(xorriso->result_line, "# owner: %s\n", pwd->pw_name); + Xorriso_result(xorriso, 0); + gid= iso_node_get_gid(node); + grp= getgrgid(gid); + if(grp == NULL) + sprintf(xorriso->result_line, "# group: %.f\n", (double) gid); + else + sprintf(xorriso->result_line, "# group: %s\n", grp->gr_name); + Xorriso_result(xorriso, 0); } + for(pass= 0; pass < 1 + (acl_text != NULL && !(flag & 2)); pass++) { + if(pass) { + *acl_text= calloc(result_len + 1, 1); + if(*acl_text == NULL) { + Xorriso_no_malloc_memory(xorriso, NULL, 0); + ret= -1; goto ex; + } + } + for(npt= cpt= text; npt != NULL; cpt= npt + 1) { + npt= strchr(cpt, '\n'); + if(npt != NULL) + *npt= 0; + if(*cpt == 0) { + if(d_text != NULL || pass) + continue; + } else + result_len+= strlen(cpt) + 1; + if(pass) { + sprintf(*acl_text + strlen(*acl_text), "%s\n", cpt); + } else if(!(flag & 1)) { + Sfile_str(xorriso->result_line, cpt, 0); + strcat(xorriso->result_line, "\n"); + Xorriso_result(xorriso, 0); + } + } + if(d_text != NULL) { + for(npt= cpt= d_text; npt != NULL; cpt= npt + 1) { + npt= strchr(cpt, '\n'); + if(npt != NULL) + *npt= 0; + if(*cpt != 0) { + if(pass) { + sprintf(*acl_text + strlen(*acl_text), "default:%s\n", cpt); + } else { + Sfile_str(xorriso->result_line, "default:", 0); + Sfile_str(xorriso->result_line, cpt, 1); + result_len+= strlen(cpt) + 9; + } + } else + xorriso->result_line[0]= 0; + if(pass== 0 && !(flag & 1)) { + strcat(xorriso->result_line, "\n"); + Xorriso_result(xorriso, 0); + } + } + } + } ret= 1; ex:; - if(acl_text != NULL && !(flag & 2)) - *acl_text= text; - else if(text != NULL) + if(d_text != NULL) + free(d_text); + if(text != NULL) free(text); return(ret); }