static int ticket_write(const char *ticket_filename, struct chirp_ticket *ct) { CHIRP_FILE *tf = cfs_fopen(ticket_filename, "w"); if(!tf) return 0; char *str = chirp_ticket_tostring(ct); cfs_fprintf(tf, "%s", str); free(str); int result = cfs_ferror(tf); cfs_fclose(tf); if(result) { errno = EACCES; return -1; } return 0; }
int chirp_acl_set(const char *dirname, const char *subject, int flags, int reset_acl) { char aclname[CHIRP_PATH_MAX]; char newaclname[CHIRP_PATH_MAX]; char aclsubject[CHIRP_LINE_MAX]; int aclflags; CHIRP_FILE *aclfile, *newaclfile; int result; int replaced_acl_entry = 0; if(!cfs_isdir(dirname)) { errno = ENOTDIR; return -1; } sprintf(aclname, "%s/%s", dirname, CHIRP_ACL_BASE_NAME); sprintf(newaclname, "%s/%s.%d", dirname, CHIRP_ACL_BASE_NAME, (int) getpid()); if(reset_acl) { aclfile = cfs_fopen_local("/dev/null", "r"); } else { aclfile = chirp_acl_open(dirname); /* If the acl never existed, then we can simply create it. */ if(!aclfile && errno == ENOENT) { aclfile = cfs_fopen_local("/dev/null", "r"); /* use local... */ } } if(!aclfile) { errno = EACCES; return -1; } replaced_acl_entry = 0; newaclfile = cfs_fopen(newaclname, "w"); if(!newaclfile) { cfs_fclose(aclfile); errno = EACCES; return -1; } while(chirp_acl_read(aclfile, aclsubject, &aclflags)) { if(!strcmp(subject, aclsubject)) { aclflags = flags; replaced_acl_entry = 1; } if(aclflags != 0) { cfs_fprintf(newaclfile, "%s %s\n", aclsubject, chirp_acl_flags_to_text(aclflags)); } } cfs_fclose(aclfile); if(!replaced_acl_entry) { cfs_fprintf(newaclfile, "%s %s\n", subject, chirp_acl_flags_to_text(flags)); } /* Need to force a write in order to get response from ferror */ cfs_fflush(newaclfile); result = cfs_ferror(newaclfile); cfs_fclose(newaclfile); if(result) { errno = EACCES; result = -1; } else { result = cfs->rename(newaclname, aclname); if(result < 0) { cfs->unlink(newaclname); errno = EACCES; result = -1; } } return result; }