Bug fixes and enhancements about "default" ACL
This commit is contained in:
parent
b09a2101cd
commit
0b4e59ee1e
@ -1 +1 @@
|
|||||||
#define Xorriso_timestamP "2009.01.27.121417"
|
#define Xorriso_timestamP "2009.01.28.074917"
|
||||||
|
@ -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
|
/* @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,
|
int Xorriso_transfer_properties(struct XorrisO *xorriso, struct stat *stbuf,
|
||||||
IsoNode *node, int flag)
|
char *disk_path, IsoNode *node, int flag)
|
||||||
{
|
{
|
||||||
mode_t mode;
|
mode_t mode;
|
||||||
|
int a_ret= 0, d_ret= 0;
|
||||||
|
char *default_text= NULL, *access_text= NULL;
|
||||||
|
|
||||||
mode= stbuf->st_mode;
|
mode= stbuf->st_mode;
|
||||||
if((flag&1) && S_ISDIR(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_atime(node, stbuf->st_atime);
|
||||||
iso_node_set_mtime(node, stbuf->st_mtime);
|
iso_node_set_mtime(node, stbuf->st_mtime);
|
||||||
iso_node_set_ctime(node, stbuf->st_ctime);
|
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);
|
ret= iso_tree_add_new_symlink(dir, img_name, link_target, &iso_symlink);
|
||||||
node= (IsoNode *) iso_symlink;
|
node= (IsoNode *) iso_symlink;
|
||||||
if(ret>0) {
|
if(ret>0) {
|
||||||
ret= Xorriso_transfer_properties(xorriso, &stbuf, node, 0);
|
ret= Xorriso_transfer_properties(xorriso, &stbuf, srcpt, node, 2);
|
||||||
if(ret<=0)
|
if(ret<=0)
|
||||||
goto was_problem;
|
goto was_problem;
|
||||||
} else {
|
} else {
|
||||||
@ -2446,7 +2464,7 @@ int Xorriso_copy_implicit_properties(struct XorrisO *xorriso, IsoDir *dir,
|
|||||||
strcpy(nfd, "/");
|
strcpy(nfd, "/");
|
||||||
if(stat(nfd, &stbuf)==-1)
|
if(stat(nfd, &stbuf)==-1)
|
||||||
return(0);
|
return(0);
|
||||||
Xorriso_transfer_properties(xorriso, &stbuf, (IsoNode *) dir,
|
Xorriso_transfer_properties(xorriso, &stbuf, nfd, (IsoNode *) dir,
|
||||||
((flag&1) && d==0));
|
((flag&1) && d==0));
|
||||||
sprintf(xorriso->info_text,
|
sprintf(xorriso->info_text,
|
||||||
"Copied properties for %s", Text_shellsafe(ni, sfe, 0));
|
"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);
|
ret= Xorriso_get_node_by_path(xorriso, img_path, NULL, &node, 0);
|
||||||
if(ret<=0)
|
if(ret<=0)
|
||||||
return(ret);
|
return(ret);
|
||||||
|
if(flag & 1) {
|
||||||
|
if(stat(disk_path, &stbuf)==-1)
|
||||||
|
return(0);
|
||||||
|
} else {
|
||||||
if(lstat(disk_path, &stbuf)==-1)
|
if(lstat(disk_path, &stbuf)==-1)
|
||||||
return(0);
|
return(0);
|
||||||
Xorriso_transfer_properties(xorriso, &stbuf, node, (flag&2)>>1);
|
}
|
||||||
|
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;
|
xorriso->volset_change_pending= 1;
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
@ -2670,7 +2694,8 @@ attach_source:;
|
|||||||
/* directory node was created above */;
|
/* directory node was created above */;
|
||||||
|
|
||||||
} else if(is_dir) {
|
} 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)) {
|
if(!(flag&32)) {
|
||||||
ret= Xorriso_add_tree(xorriso, dir, img_path, disk_path, NULL,
|
ret= Xorriso_add_tree(xorriso, dir, img_path, disk_path, NULL,
|
||||||
flag&2);
|
flag&2);
|
||||||
@ -8790,9 +8815,9 @@ ok:;
|
|||||||
int Xorriso_getfacl(struct XorrisO *xorriso, void *in_node, char *path,
|
int Xorriso_getfacl(struct XorrisO *xorriso, void *in_node, char *path,
|
||||||
char **acl_text, int flag)
|
char **acl_text, int flag)
|
||||||
{
|
{
|
||||||
int ret, path_offset= 0;
|
int ret, d_ret, path_offset= 0, result_len= 0, pass;
|
||||||
IsoNode *node;
|
IsoNode *node;
|
||||||
char *text= NULL, *cpt, *npt;
|
char *text= NULL, *d_text= NULL, *cpt, *npt;
|
||||||
uid_t uid;
|
uid_t uid;
|
||||||
gid_t gid;
|
gid_t gid;
|
||||||
struct passwd *pwd;
|
struct passwd *pwd;
|
||||||
@ -8808,11 +8833,14 @@ int Xorriso_getfacl(struct XorrisO *xorriso, void *in_node, char *path,
|
|||||||
|
|
||||||
#ifdef Xorriso_with_aaiP
|
#ifdef Xorriso_with_aaiP
|
||||||
ret= iso_node_get_acl_text(node, &text, 0);
|
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
|
#else
|
||||||
ret= 0;
|
ret= d_ret= 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(ret < 0) {
|
if(ret < 0 || d_ret < 0) {
|
||||||
if(path != NULL && path[0] != 0) {
|
if(path != NULL && path[0] != 0) {
|
||||||
strcpy(xorriso->info_text, "Error with obtaining ACL of ");
|
strcpy(xorriso->info_text, "Error with obtaining ACL of ");
|
||||||
Text_shellsafe(path, xorriso->info_text, 1);
|
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);
|
ret= 1 + (ret != 1);
|
||||||
goto ex;
|
goto ex;
|
||||||
}
|
}
|
||||||
|
if(ret == 0 || ret == 2) {
|
||||||
if(flag & 1) {
|
if(flag & 1) {
|
||||||
ret= 1 + (ret == 0);
|
ret= 1 + (ret == 0);
|
||||||
goto ex;
|
goto ex;
|
||||||
}
|
}
|
||||||
if(ret == 0 || ret == 2) {
|
|
||||||
#ifdef Xorriso_with_aaiP
|
#ifdef Xorriso_with_aaiP
|
||||||
strcpy(xorriso->info_text, "No ACL associated with ");
|
strcpy(xorriso->info_text, "No ACL associated with ");
|
||||||
Text_shellsafe(path, xorriso->info_text, 1);
|
Text_shellsafe(path, xorriso->info_text, 1);
|
||||||
@ -8841,6 +8869,7 @@ int Xorriso_getfacl(struct XorrisO *xorriso, void *in_node, char *path,
|
|||||||
{ret= 2; goto ex;}
|
{ret= 2; goto ex;}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!(flag & 1)) {
|
||||||
if(path[0] == '/' && !(flag & 2))
|
if(path[0] == '/' && !(flag & 2))
|
||||||
path_offset= 1;
|
path_offset= 1;
|
||||||
strcpy(xorriso->result_line, "# file: ");
|
strcpy(xorriso->result_line, "# file: ");
|
||||||
@ -8855,7 +8884,6 @@ int Xorriso_getfacl(struct XorrisO *xorriso, void *in_node, char *path,
|
|||||||
else
|
else
|
||||||
sprintf(xorriso->result_line, "# owner: %s\n", pwd->pw_name);
|
sprintf(xorriso->result_line, "# owner: %s\n", pwd->pw_name);
|
||||||
Xorriso_result(xorriso, 0);
|
Xorriso_result(xorriso, 0);
|
||||||
|
|
||||||
gid= iso_node_get_gid(node);
|
gid= iso_node_get_gid(node);
|
||||||
grp= getgrgid(gid);
|
grp= getgrgid(gid);
|
||||||
if(grp == NULL)
|
if(grp == NULL)
|
||||||
@ -8863,21 +8891,60 @@ int Xorriso_getfacl(struct XorrisO *xorriso, void *in_node, char *path,
|
|||||||
else
|
else
|
||||||
sprintf(xorriso->result_line, "# group: %s\n", grp->gr_name);
|
sprintf(xorriso->result_line, "# group: %s\n", grp->gr_name);
|
||||||
Xorriso_result(xorriso, 0);
|
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) {
|
for(npt= cpt= text; npt != NULL; cpt= npt + 1) {
|
||||||
npt= strchr(cpt, '\n');
|
npt= strchr(cpt, '\n');
|
||||||
if(npt != NULL)
|
if(npt != NULL)
|
||||||
*npt= 0;
|
*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);
|
Sfile_str(xorriso->result_line, cpt, 0);
|
||||||
strcat(xorriso->result_line, "\n");
|
strcat(xorriso->result_line, "\n");
|
||||||
Xorriso_result(xorriso, 0);
|
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;
|
ret= 1;
|
||||||
ex:;
|
ex:;
|
||||||
if(acl_text != NULL && !(flag & 2))
|
if(d_text != NULL)
|
||||||
*acl_text= text;
|
free(d_text);
|
||||||
else if(text != NULL)
|
if(text != NULL)
|
||||||
free(text);
|
free(text);
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user