fmd_log.c revision 2
2N/A * The contents of this file are subject to the terms of the 2N/A * Common Development and Distribution License (the "License"). 2N/A * You may not use this file except in compliance with the License. 2N/A * See the License for the specific language governing permissions 2N/A * and limitations under the License. 2N/A * When distributing Covered Code, include this CDDL HEADER in each 2N/A * If applicable, add the following below this CDDL HEADER, with the 2N/A * fields enclosed by brackets "[]" replaced with your own identifying 2N/A * information: Portions Copyright [yyyy] [name of copyright owner] 2N/A * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 2N/A * Use is subject to license terms. 2N/A * fmd_log_set_errno is used as a utility function throughout the library. It 2N/A * sets both lp->log_errno and errno to the specified value. If the current 2N/A * error is EFDL_EXACCT, we store it internally as that value plus ea_error(). 2N/A * If no ea_error() is present, we assume EFDL_BADTAG (catalog tag mismatch). 2N/A * fmd_log_load_record() is used to load the exacct object at the current file 2N/A * location into the specified fmd_log_record structure. Once the caller has 2N/A * made use of this information, it can clean up using fmd_log_free_record(). 2N/A * fmd_log_free_record frees memory associated with the specified record. If 2N/A * cross-references are contained in this record, we proceed recursively. 2N/A * fmd_log_load_xref loads the cross-reference represented by the specified 2N/A * exacct group 'grp' into the next empty slot in rp->rec_xrefs. This function 2N/A * is called repeatedly by fmd_log_load_xrefs() for each embedded reference. 2N/A * Search our xref list for matching (dev_t, ino64_t) or (uuid). 2N/A * If we can't find one, return silently without 2N/A * doing anything. We expect log xrefs to be broken whenever log 2N/A * files are trimmed or removed; their only purpose is to help us 2N/A * debug diagnosis engine algorithms. 2N/A * fmd_log_load_xrdir is called by fmd_log_load_xrefs when the FMD_LF_XREFS bit 2N/A * is not yet set, indicating we haven't looked for cross-referenced files. We 2N/A * open the directory associated with the specified log file and attempt to 2N/A * perform an fmd_log_open() on every file found there (i.e. /var/fm/fmd). If 2N/A * we are successful, the files are chained on to lp->log_xrefs, where the 2N/A * fmd_log_load_xref() function can find them by comparing dev/ino to log_stat. 2N/A return;
/* failed to open directory; just skip it */ 2N/A continue;
/* skip "." and ".." and hidden files */ 2N/A * fmd_log_load_xrefs iterates again over the record's exacct group and for 2N/A * each cross-reference (embedded CAT_FMA_GROUP), attempts to fill in the 2N/A * corresponding xref. rp->rec_nrefs is reset to the number of valid items 2N/A * in the finished rp->rec_xrefs array; see fmd_log_load_xref() for more info. 2N/A return (0);
/* do not load any xrefs */ 2N/A * Make a second pass through the record group to locate and process 2N/A * each cross-reference sub-group. The structure of the groups is 2N/A * as follows (left-hand-side symbols named after the variables used): 2N/A * rgrp := CAT_FMA_TODSEC CAT_FMA_TODNSEC CAT_FMA_NVLIST grp* 2N/A * grp := obj* (i.e. zero or more groups of xref items) 2N/A * obj := CAT_FMA_MAJOR CAT_FMA_MINOR CAT_FMA_INODE CAT_FMA_OFFSET 2N/A * For each xref 'obj', we call fmd_log_load_xref() to parse the four 2N/A * xref members and then load the specified record into rp->rec_xrefs. 2N/A continue;
/* ignore anything that isn't a group */ 2N/A return (-
1);
/* errno is set for us */ 2N/A * Read the first group of log meta-data: the write-once read-only 2N/A * file header. We read all records in this group, ignoring all but 2N/A * the VERSION and LABEL, which are required and must be verified. 2N/A * Read the second group of log meta-data: the table of contents. At 2N/A * present there are no records libfmd_log needs in here, so we just 2N/A * skip over this entire group so that fmd_log_xiter() starts after it. 2N/A return;
/* permit null lp to simply caller code */ 2N/A * Note: this will be verrrry slow for big files. If this function becomes 2N/A * important, we'll need to add a function to libexacct to let us rewind. 2N/A * Currently libexacct has no notion of seeking other than record-at-a-time. 2N/A continue;
/* rewind until beginning of file */ 2N/A break;
/* logical OR of this class is true */ 2N/A return (0);
/* logical AND of filter is false */ 2N/A return (
1);
/* logical AND of filter is true */ 2N/A * If a filter array was provided, create an array of filtvec structs 2N/A * to perform logical AND/OR processing. See fmd_log_xiter(), below. 2N/A for (i = 0; i <
fc; i++) {
2N/A * If a filter array was provided, create an array of filtvec structs 2N/A * where each filtvec holds a pointer to an equivalent list of filters, 2N/A * as determined by their filt_func. We sort the input array by func, 2N/A * and then fill in the filtvec struct array. We can then compute the 2N/A * logical OR of equivalent filters by iterating over filt_argv, and 2N/A * we can compute the logical AND of 'fv' by iterating over filt_argc. 2N/A for (i = 0; i <
fc; i++) {
2N/A break;
/* end-of-file reached */ 2N/A "client requires newer version of libfmd_log",
/* EFDL_VERSION */ 2N/A "required memory allocation failed",
/* EFDL_NOMEM */ 2N/A "log header did not contain required field",
/* EFDL_BADHDR */ 2N/A "log record did not contain protocol class",
/* EFDL_NOCLASS */ 2N/A "log record has invalid catalog tag",
/* EFDL_BADTAG */ 2N/A "log record has invalid cross-reference group",
/* EFDL_BADREF */ 2N/A "log record has invalid cross-reference dev_t",
/* EFDL_BADDEV */ 2N/A "log record was not of expected type",
/* EFDL_EXACCT + OK */ 2N/A "log access system call failed",
/* EXR_SYSCALL_FAIL */ 2N/A "log file corruption detected",
/* EXR_CORRUPT_FILE */ 2N/A "end-of-file reached",
/* EXR_EOF */ 2N/A "log file does not have appropriate creator",
/* EXR_NO_CREATOR */ 2N/A "invalid unpack buffer specified",
/* EXR_INVALID_BUF */ 2N/A "invalid exacct operation for log file",
/* EXR_NOTSUPP */ 2N/A "log file requires newer version of libexacct",
/* EXR_UNKN_VERSION */ 2N/A "invalid object buffer specified",
/* EXR_INVALID_OBJ */