/* * Function responsible for generating the ACL information for a given * file. Note, the string is put into buffer malloc'd by this function. * Its the responsibility of the caller to free the buffer. */ static char * get_acl_string(const char *fname, const struct stat64 *statb, int *err_code) { acl_t *aclp; char *acltext; int error; if (S_ISLNK(statb->st_mode)) { return (safe_strdup("-")); } /* * Include trivial acl's */ error = acl_get(fname, 0, &aclp); if (error != 0) { *err_code = WARNING_EXIT; (void) fprintf(stderr, "%s: %s\n", fname, acl_strerror(error)); return (safe_strdup("-")); } else { acltext = acl_totext(aclp, 0); acl_free(aclp); return (acltext); } }
/* * get_acl_info * * load up all the access and attribute info */ static int get_acl_info(char *name, tlm_acls_t *tlm_acls) { int erc; acl_t *aclp = NULL; char *acltp; erc = lstat64(name, &tlm_acls->acl_attr); if (erc != 0) { NDMP_LOG(LOG_ERR, "Could not find file %s.", name); erc = TLM_NO_SOURCE_FILE; return (erc); } erc = acl_get(name, ACL_NO_TRIVIAL, &aclp); if (erc != 0) { NDMP_LOG(LOG_DEBUG, "Could not read ACL for file [%s]", name); erc = TLM_NO_SOURCE_FILE; return (erc); } if (aclp && (acltp = acl_totext(aclp, ACL_APPEND_ID | ACL_SID_FMT | ACL_COMPACT_FMT)) != NULL) { (void) strlcpy(tlm_acls->acl_info.attr_info, acltp, TLM_MAX_ACL_TXT); acl_free(aclp); free(acltp); } return (erc); }
static void ace_printacl(acl_t *aclp, int cols, int compact) { int slot = 0; char *token; char *acltext; if (compact) { ace_compact_printacl(aclp); return; } acltext = acl_totext(aclp, 0); if (acltext == NULL) return; token = strtok(acltext, ","); if (token == NULL) { free(acltext); return; } do { (void) printf(" %d:", slot++); split_line(token, cols - 5); } while (token = strtok(NULL, ",")); free(acltext); }
/* * get_dir_acl_info * * load up all ACL and attr info about a directory */ static int get_dir_acl_info(char *dir, tlm_acls_t *tlm_acls, tlm_job_stats_t *js) { int erc; char *checkpointed_dir; char root_dir[TLM_VOLNAME_MAX_LENGTH]; char *spot; char *fil; acl_t *aclp = NULL; char *acltp; checkpointed_dir = ndmp_malloc(TLM_MAX_PATH_NAME); if (checkpointed_dir == NULL) return (-1); if (tlm_acls->acl_checkpointed) fil = tlm_build_snapshot_name(dir, checkpointed_dir, js->js_job_name); else fil = dir; erc = lstat64(fil, &tlm_acls->acl_attr); if (erc != 0) { NDMP_LOG(LOG_ERR, "Could not find directory %s.", dir); free(checkpointed_dir); return (-1); } spot = strchr(&fil[1], '/'); if (spot == NULL) { (void) strlcpy(root_dir, fil, TLM_VOLNAME_MAX_LENGTH); } else { *spot = 0; (void) strlcpy(root_dir, fil, TLM_VOLNAME_MAX_LENGTH); *spot = '/'; } if (strcmp(root_dir, tlm_acls->acl_root_dir) != 0) { struct stat64 attr; erc = lstat64(root_dir, &attr); if (erc != 0) { NDMP_LOG(LOG_ERR, "Cannot find root directory %s.", root_dir); free(checkpointed_dir); return (-1); } (void) strlcpy(tlm_acls->acl_root_dir, root_dir, TLM_VOLNAME_MAX_LENGTH); } erc = acl_get(fil, ACL_NO_TRIVIAL, &aclp); if (erc != 0) { NDMP_LOG(LOG_DEBUG, "Could not read metadata for directory [%s]", dir); free(checkpointed_dir); return (-1); } if (aclp && (acltp = acl_totext(aclp, ACL_APPEND_ID | ACL_SID_FMT | ACL_COMPACT_FMT)) != NULL) { (void) strlcpy(tlm_acls->acl_info.attr_info, acltp, TLM_MAX_ACL_TXT); acl_free(aclp); free(acltp); } free(checkpointed_dir); return (0); }