au_class_ent_t * getauclassnam_r(au_class_ent_t *e, char *name) { while (getauclassent_r(e) != NULL) { if (strncmp(e->ac_name, name, AU_CLASS_NAME_MAX) == 0) { return (e); } } return (NULL); }
/* * getauclassent(): * This is not MT-safe because of the static variables. */ au_class_ent_t * getauclassent() { static au_class_ent_t e; static char cname[AU_CLASS_NAME_MAX]; static char cdesc[AU_CLASS_DESC_MAX]; e.ac_name = cname; e.ac_desc = cdesc; return (getauclassent_r(&e)); }
static void audump_class_r(void) { char class_ent_name[AU_CLASS_NAME_MAX]; char class_ent_desc[AU_CLASS_DESC_MAX]; au_class_ent_t c, *cp; bzero(&c, sizeof(c)); bzero(class_ent_name, sizeof(class_ent_name)); bzero(class_ent_desc, sizeof(class_ent_desc)); c.ac_name = class_ent_name; c.ac_desc = class_ent_desc; while ((cp = getauclassent_r(&c)) != NULL) printf("0x%08x:%s:%s\n", cp->ac_class, cp->ac_name, cp->ac_desc); }
/* * Convert the au_mask_t fields into a string value. If verbose is non-zero * the long flag names are used else the short (2-character)flag names are * used. * * XXXRW: If bits are specified that are not matched by any class, they are * omitted rather than rejected with EINVAL. * * XXXRW: This is not thread-safe as it relies on atomicity between * setauclass() and sequential calls to getauclassent(). This could be * fixed by iterating through the bitmask fields rather than iterating * through the classes. */ int getauditflagschar(char *auditstr, au_mask_t *masks, int verbose) { char class_ent_name[AU_CLASS_NAME_MAX]; char class_ent_desc[AU_CLASS_DESC_MAX]; struct au_class_ent c; char *strptr = auditstr; u_char sel; bzero(&c, sizeof(c)); bzero(class_ent_name, sizeof(class_ent_name)); bzero(class_ent_desc, sizeof(class_ent_desc)); c.ac_name = class_ent_name; c.ac_desc = class_ent_desc; /* * Enumerate the class entries, check if each is selected in either * the success or failure masks. */ setauclass(); while ((getauclassent_r(&c)) != NULL) { sel = 0; /* Dont do anything for class = no. */ if (c.ac_class == 0) continue; sel |= ((c.ac_class & masks->am_success) == c.ac_class) ? AU_PRS_SUCCESS : 0; sel |= ((c.ac_class & masks->am_failure) == c.ac_class) ? AU_PRS_FAILURE : 0; /* * No prefix should be attached if both success and failure * are selected. */ if ((sel & AU_PRS_BOTH) == 0) { if ((sel & AU_PRS_SUCCESS) != 0) { *strptr = '+'; strptr = strptr + 1; } else if ((sel & AU_PRS_FAILURE) != 0) { *strptr = '-'; strptr = strptr + 1; } } if (sel != 0) { if (verbose) { strlcpy(strptr, c.ac_desc, AU_CLASS_DESC_MAX); strptr += strlen(c.ac_desc); } else { strlcpy(strptr, c.ac_name, AU_CLASS_NAME_MAX); strptr += strlen(c.ac_name); } *strptr = ','; /* delimiter */ strptr = strptr + 1; } } /* Overwrite the last delimiter with the string terminator. */ if (strptr != auditstr) *(strptr-1) = '\0'; return (0); }