/* * Copyright (c) 1999-2008 NOVELL (All rights reserved) * Copyright 2009-2010 Canonical Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2.1 of the GNU Lesser General * Public License published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /* * @author Matt Barringer */ /* * TODO: * * - Convert the text permission mask into a bitmask * - Clean up parser grammar */ #include #include #include #include #include #include "parser.h" /* This is mostly just a wrapper around the code in grammar.y */ aa_log_record *parse_record(char *str) { if (str == NULL) return NULL; return _parse_yacc(str); } void free_record(aa_log_record *record) { if (record != NULL) { if (record->operation != NULL) free(record->operation); if (record->requested_mask != NULL) free(record->requested_mask); if (record->denied_mask != NULL) free(record->denied_mask); if (record->profile != NULL) free(record->profile); if (record->peer_profile != NULL) free(record->peer_profile); if (record->comm != NULL) free(record->comm); if (record->name != NULL) free(record->name); if (record->name2 != NULL) free(record->name2); if (record->namespace != NULL) free(record->namespace); if (record->attribute != NULL) free(record->attribute); if (record->info != NULL) free(record->info); if (record->peer_info != NULL) free(record->peer_info); if (record->peer != NULL) free(record->peer); if (record->active_hat != NULL) free(record->active_hat); if (record->audit_id != NULL) free(record->audit_id); if (record->net_family != NULL) free(record->net_family); if (record->net_protocol != NULL) free(record->net_protocol); if (record->net_sock_type != NULL) free(record->net_sock_type); if (record->net_local_addr != NULL) free(record->net_local_addr); if (record->net_foreign_addr != NULL) free(record->net_foreign_addr); if (record->dbus_bus != NULL) free(record->dbus_bus); if (record->dbus_path != NULL) free(record->dbus_path); if (record->dbus_interface != NULL) free(record->dbus_interface); if (record->dbus_member != NULL) free(record->dbus_member); if (record->signal != NULL) free(record->signal ); if (record->fs_type != NULL) free(record->fs_type); if (record->flags != NULL) free(record->flags); if (record->src_name != NULL) free(record->src_name); free(record); } return; } /* Set all of the fields to appropriate values */ void _init_log_record(aa_log_record *record) { if (record == NULL) return; memset(record, 0, sizeof(aa_log_record)); record->version = AA_RECORD_SYNTAX_UNKNOWN; record->event = AA_RECORD_INVALID; record->fsuid = (unsigned long) -1; record->ouid = (unsigned long) -1; return; } /* convert a hex-encoded string to its char* version */ char *hex_to_string(char *hexstring) { char *ret = NULL; char buf[3], *endptr; size_t len; int i; if (!hexstring) goto out; len = strlen(hexstring) / 2; ret = malloc(len + 1); if (!ret) goto out; for (i = 0; i < len; i++) { sprintf(buf, "%.2s", hexstring); hexstring += 2; ret[i] = (unsigned char) strtoul(buf, &endptr, 16); } ret[len] = '\0'; out: return ret; } struct ipproto_pairs { unsigned int protocol; char *protocol_name; }; #define AA_GEN_PROTO_ENT(name, IP) {name, IP}, static struct ipproto_pairs ipproto_mappings[] = { #include "af_protos.h" /* terminate */ {0, NULL} }; /* convert an ip protocol number to a string */ char *ipproto_to_string(unsigned int proto) { char *ret = NULL; struct ipproto_pairs *current = ipproto_mappings; while (current->protocol != proto && current->protocol_name != NULL) { current++; } if (current->protocol_name) { ret = strdup(current->protocol_name); } else { if (!asprintf(&ret, "unknown(%u)", proto)) ret = NULL; } return ret; }