static void fsal_print_access_by_acl(int naces, int ace_number, fsal_ace_t *pace, fsal_aceperm_t perm, enum fsal_errors_t access_result, bool is_dir, struct user_cred *creds) { char str[LOG_BUFF_LEN]; struct display_buffer dspbuf = { sizeof(str), str, str }; int b_left; if (!isFullDebug(COMPONENT_NFS_V4_ACL)) return; if (access_result == ERR_FSAL_NO_ERROR) b_left = display_cat(&dspbuf, "access granted"); else if (access_result == ERR_FSAL_PERM) b_left = display_cat(&dspbuf, "access denied (EPERM)"); else b_left = display_cat(&dspbuf, "access denied (EACCESS)"); if (b_left > 0) b_left = display_printf(&dspbuf, " uid %u gid %u Access req:", creds->caller_uid, creds->caller_gid); if (b_left > 0) b_left = display_fsal_v4mask(&dspbuf, perm, is_dir); if (b_left > 0 && (naces != ace_number)) b_left = display_fsal_ace(&dspbuf, ace_number, pace, is_dir); LogFullDebug(COMPONENT_NFS_V4_ACL, "%s", str); }
int display_fsal_ace(struct display_buffer *dspbuf, int ace_number, fsal_ace_t *pace, bool is_dir) { int b_left; if (!pace) return display_cat(dspbuf, "ACE: <NULL>"); /* Print the entire ACE. */ b_left = display_printf(dspbuf, "ACE %d:", ace_number); /* ACE type. */ if (b_left > 0) b_left = display_cat(dspbuf, IS_FSAL_ACE_ALLOW(*pace) ? " allow" : IS_FSAL_ACE_DENY(*pace) ? " deny" : IS_FSAL_ACE_AUDIT(*pace) ? " audit" : " ?"); /* ACE who and its type. */ if (b_left > 0 && IS_FSAL_ACE_SPECIAL_ID(*pace)) b_left = display_cat(dspbuf, IS_FSAL_ACE_SPECIAL_OWNER(*pace) ? " owner@" : IS_FSAL_ACE_SPECIAL_GROUP(*pace) ? " group@" : IS_FSAL_ACE_SPECIAL_EVERYONE(*pace) ? " everyone@" : ""); if (b_left > 0 && !IS_FSAL_ACE_SPECIAL_ID(*pace)) { if (IS_FSAL_ACE_SPECIAL_ID(*pace)) b_left = display_printf(dspbuf, " gid %d", pace->who.gid); else b_left = display_printf(dspbuf, " uid %d", pace->who.uid); } /* ACE mask. */ if (b_left > 0) b_left = display_fsal_v4mask(dspbuf, pace->perm, is_dir); /* ACE Inherit flags. */ if (b_left > 0 && IS_FSAL_ACE_INHERIT(*pace)) b_left = display_fsal_inherit_flags(dspbuf, pace); return b_left; }
int display_session_id(struct display_buffer *dspbuf, char *session_id) { int b_left = display_cat(dspbuf, "sessionid="); if (b_left > 0) b_left = display_opaque_value(dspbuf, session_id, NFS4_SESSIONID_SIZE); return b_left; }
int display_session(struct display_buffer *dspbuf, nfs41_session_t *session) { int b_left = display_printf(dspbuf, "session %p {", session); if (b_left > 0) b_left = display_session_id(dspbuf, session->session_id); if (b_left > 0) b_left = display_cat(dspbuf, "}"); return b_left; }
int display_fsal_inherit_flags(struct display_buffer *dspbuf, fsal_ace_t *pace) { if (!pace) return display_cat(dspbuf, "NULL"); return display_printf(dspbuf, "Inherit:%s%s%s%s", IS_FSAL_ACE_FILE_INHERIT(*pace) ? " file" : "", IS_FSAL_ACE_DIR_INHERIT(*pace) ? " dir" : "", IS_FSAL_ACE_INHERIT_ONLY(*pace) ? " inherit_only" : "", IS_FSAL_ACE_NO_PROPAGATE(*pace) ? " no_propagate" : ""); }
int display_sockaddr(struct display_buffer *dspbuf, sockaddr_t *addr) { const char *name = NULL; char ipname[SOCK_NAME_MAX]; int port; int b_left = display_start(dspbuf); if (b_left <= 0) return b_left; switch (addr->ss_family) { case AF_INET: name = inet_ntop(addr->ss_family, &(((struct sockaddr_in *)addr)->sin_addr), ipname, sizeof(ipname)); port = ntohs(((struct sockaddr_in *)addr)->sin_port); break; case AF_INET6: name = inet_ntop(addr->ss_family, &(((struct sockaddr_in6 *)addr)->sin6_addr), ipname, sizeof(ipname)); port = ntohs(((struct sockaddr_in6 *)addr)->sin6_port); break; case AF_LOCAL: return display_cat(dspbuf, ((struct sockaddr_un *)addr)->sun_path); } if (name == NULL) return display_cat(dspbuf, "<unknown>"); else return display_printf(dspbuf, "%s:%d", name, port); }
/** * @brief Display NFSv4 owner * * @param[in] owner The state owner * @param[out] str Output string * * @return the bytes remaining in the buffer. */ int display_nfs4_owner(struct display_buffer *dspbuf, state_owner_t *owner) { int b_left; if (owner == NULL) return display_cat(dspbuf, "<NULL>"); b_left = display_printf(dspbuf, "%s %p:", state_owner_type_to_str(owner->so_type), owner); if (b_left <= 0) return b_left; b_left = display_printf(dspbuf, " clientid={"); if (b_left <= 0) return b_left; b_left = display_client_id_rec(dspbuf, owner->so_owner.so_nfs4_owner .so_clientrec); if (b_left <= 0) return b_left; b_left = display_printf(dspbuf, "} owner="); if (b_left <= 0) return b_left; b_left = display_opaque_value(dspbuf, owner->so_owner_val, owner->so_owner_len); if (b_left <= 0) return b_left; b_left = display_printf(dspbuf, " confirmed=%u seqid=%u", owner->so_owner.so_nfs4_owner.so_confirmed, owner->so_owner.so_nfs4_owner.so_seqid); if (b_left <= 0) return b_left; if (owner->so_owner.so_nfs4_owner.so_related_owner != NULL) { b_left = display_printf(dspbuf, " related_owner={"); if (b_left <= 0) return b_left; b_left = display_nfs4_owner(dspbuf, owner->so_owner .so_nfs4_owner.so_related_owner); if (b_left <= 0) return b_left; b_left = display_printf(dspbuf, "}"); if (b_left <= 0) return b_left; } return display_printf(dspbuf, " refcount=%d", atomic_fetch_int32_t(&owner->so_refcount)); }
int display_fsal_v4mask(struct display_buffer *dspbuf, fsal_aceperm_t v4mask, bool is_dir) { int b_left = display_printf(dspbuf, "0x%06x", v4mask); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_READ_DATA)) b_left = display_cat(dspbuf, " READ"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_WRITE_DATA) && is_dir) b_left = display_cat(dspbuf, " ADD_FILE"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_WRITE_DATA) && !is_dir) b_left = display_cat(dspbuf, " WRITE"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_APPEND_DATA) && is_dir) b_left = display_cat(dspbuf, " ADD_SUBDIR"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_APPEND_DATA) && !is_dir) b_left = display_cat(dspbuf, " APPEND"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_READ_NAMED_ATTR)) b_left = display_cat(dspbuf, " READ_NAMED"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_WRITE_NAMED_ATTR)) b_left = display_cat(dspbuf, " WRITE_NAMED"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_EXECUTE)) b_left = display_cat(dspbuf, " EXECUTE"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_DELETE_CHILD)) b_left = display_cat(dspbuf, " DELETE_CHILD"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_READ_ATTR)) b_left = display_cat(dspbuf, " READ_ATTR"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_WRITE_ATTR)) b_left = display_cat(dspbuf, " WRITE_ATTR"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_DELETE)) b_left = display_cat(dspbuf, " DELETE"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_READ_ACL)) b_left = display_cat(dspbuf, " READ_ACL"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_WRITE_ACL)) b_left = display_cat(dspbuf, " WRITE_ACL"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_WRITE_OWNER)) b_left = display_cat(dspbuf, " WRITE_OWNER"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE_PERM_SYNCHRONIZE)) b_left = display_cat(dspbuf, " SYNCHRONIZE"); if (b_left > 0 && IS_FSAL_ACE_BIT(v4mask, FSAL_ACE4_PERM_CONTINUE)) b_left = display_cat(dspbuf, " CONTINUE"); return b_left; }
/** * @brief Display NFSv4 owner * * @param[in] owner The state owner * @param[out] str Output string * * @return the bytes remaining in the buffer. */ int display_nfs4_owner(struct display_buffer *dspbuf, state_owner_t *owner) { int b_left; time_t texpire; struct state_nfs4_owner_t *nfs4_owner = &owner->so_owner.so_nfs4_owner; if (owner == NULL) return display_cat(dspbuf, "<NULL>"); b_left = display_printf(dspbuf, "%s %p:", state_owner_type_to_str(owner->so_type), owner); if (b_left <= 0) return b_left; b_left = display_printf(dspbuf, " clientid={"); if (b_left <= 0) return b_left; b_left = display_client_id_rec(dspbuf, nfs4_owner->so_clientrec); if (b_left <= 0) return b_left; b_left = display_printf(dspbuf, "} owner="); if (b_left <= 0) return b_left; b_left = display_opaque_value(dspbuf, owner->so_owner_val, owner->so_owner_len); if (b_left <= 0) return b_left; b_left = display_printf(dspbuf, " confirmed=%u seqid=%u", nfs4_owner->so_confirmed, nfs4_owner->so_seqid); if (b_left <= 0) return b_left; if (nfs4_owner->so_related_owner != NULL) { b_left = display_printf(dspbuf, " related_owner={"); if (b_left <= 0) return b_left; b_left = display_nfs4_owner(dspbuf, nfs4_owner->so_related_owner); if (b_left <= 0) return b_left; b_left = display_printf(dspbuf, "}"); if (b_left <= 0) return b_left; } texpire = atomic_fetch_time_t(&nfs4_owner->so_cache_expire); if (texpire != 0) { b_left = display_printf(dspbuf, " cached(expires in %d secs)", texpire - time(NULL)); if (b_left <= 0) return b_left; } return display_printf(dspbuf, " refcount=%d", atomic_fetch_int32_t(&owner->so_refcount)); }