911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * CDDL HEADER START
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * The contents of this file are subject to the terms of the
911106dfb16696472af8c1b7b4c554a829354fa8jm * Common Development and Distribution License (the "License").
911106dfb16696472af8c1b7b4c554a829354fa8jm * You may not use this file except in compliance with the License.
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
911106dfb16696472af8c1b7b4c554a829354fa8jm * or http://www.opensolaris.org/os/licensing.
911106dfb16696472af8c1b7b4c554a829354fa8jm * See the License for the specific language governing permissions
911106dfb16696472af8c1b7b4c554a829354fa8jm * and limitations under the License.
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * When distributing Covered Code, include this CDDL HEADER in each
911106dfb16696472af8c1b7b4c554a829354fa8jm * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
911106dfb16696472af8c1b7b4c554a829354fa8jm * If applicable, add the following below this CDDL HEADER, with the
911106dfb16696472af8c1b7b4c554a829354fa8jm * fields enclosed by brackets "[]" replaced with your own identifying
911106dfb16696472af8c1b7b4c554a829354fa8jm * information: Portions Copyright [yyyy] [name of copyright owner]
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * CDDL HEADER END
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
bfc848c632c9eacb2a640246d96e198f1b185c03jm * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
911106dfb16696472af8c1b7b4c554a829354fa8jm * Use is subject to license terms.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm#pragma ident "%Z%%M% %I% %E% SMI"
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * Implementation of the vscan statistics interface
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <stdio.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <stdlib.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <unistd.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <string.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <syslog.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <pthread.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <door.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <pwd.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <auth_attr.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <secdb.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <sys/stat.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <fcntl.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include "vs_incl.h"
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/* local data */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic vs_stats_t vscan_stats;
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_stats_door_cookie;
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_stats_door_fd = -1;
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic pthread_mutex_t vs_stats_mutex = PTHREAD_MUTEX_INITIALIZER;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/* function prototype */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_stats_check_auth(void);
bfc848c632c9eacb2a640246d96e198f1b185c03jmstatic void vs_stats_reset(void);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic void vs_stats_door_call(void *, char *, size_t, door_desc_t *, uint_t);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_stats_init
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Invoked on daemon load and unload
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmint
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_stats_init(void)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) pthread_mutex_lock(&vs_stats_mutex);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) memset(&vscan_stats, 0, sizeof (vs_stats_t));
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* door initialization */
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((vs_stats_door_fd = door_create(vs_stats_door_call,
911106dfb16696472af8c1b7b4c554a829354fa8jm &vs_stats_door_cookie, (DOOR_UNREF | DOOR_REFUSE_DESC))) < 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_stats_door_fd = -1;
911106dfb16696472af8c1b7b4c554a829354fa8jm } else {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fdetach(VS_STATS_DOOR_NAME);
911106dfb16696472af8c1b7b4c554a829354fa8jm if (fattach(vs_stats_door_fd, VS_STATS_DOOR_NAME) < 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) door_revoke(vs_stats_door_fd);
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_stats_door_fd = -1;
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) pthread_mutex_unlock(&vs_stats_mutex);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return ((vs_stats_door_fd == -1) ? -1 : 0);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_stats_fini
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Invoked on daemon unload
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmvoid
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_stats_fini(void)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) pthread_mutex_lock(&vs_stats_mutex);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* door termination */
911106dfb16696472af8c1b7b4c554a829354fa8jm if (vs_stats_door_fd != -1)
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) door_revoke(vs_stats_door_fd);
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_stats_door_fd = -1;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fdetach(VS_STATS_DOOR_NAME);
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) unlink(VS_STATS_DOOR_NAME);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) pthread_mutex_unlock(&vs_stats_mutex);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_stats_check_auth
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Returns: 0 caller authorized to reset stats
911106dfb16696472af8c1b7b4c554a829354fa8jm * -1 caller not authorized to reset stats
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_stats_check_auth()
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm ucred_t *uc = NULL;
911106dfb16696472af8c1b7b4c554a829354fa8jm uid_t uid;
911106dfb16696472af8c1b7b4c554a829354fa8jm struct passwd *pw;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (door_ucred(&uc) != 0)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (-1);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (((uid = ucred_getsuid(uc)) == (uid_t)-1) ||
911106dfb16696472af8c1b7b4c554a829354fa8jm ((pw = getpwuid(uid)) == NULL) ||
911106dfb16696472af8c1b7b4c554a829354fa8jm (chkauthattr(VS_VALUE_AUTH, pw->pw_name) != 1)) {
911106dfb16696472af8c1b7b4c554a829354fa8jm ucred_free(uc);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (-1);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm ucred_free(uc);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_stats_door_call
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm/* ARGSUSED */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic void
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_stats_door_call(void *cookie, char *ptr, size_t size, door_desc_t *dp,
911106dfb16696472af8c1b7b4c554a829354fa8jm uint_t n_desc)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
bfc848c632c9eacb2a640246d96e198f1b185c03jm /* LINTED E_BAD_PTR_CAST_ALIGN */
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_stats_req_t *req = (vs_stats_req_t *)ptr;
bfc848c632c9eacb2a640246d96e198f1b185c03jm vs_stats_rsp_t rsp;
911106dfb16696472af8c1b7b4c554a829354fa8jm
bfc848c632c9eacb2a640246d96e198f1b185c03jm if ((cookie != &vs_stats_door_cookie) ||
bfc848c632c9eacb2a640246d96e198f1b185c03jm (ptr == NULL) ||
bfc848c632c9eacb2a640246d96e198f1b185c03jm (size != sizeof (vs_stats_req_t)) ||
bfc848c632c9eacb2a640246d96e198f1b185c03jm (req->vsr_magic != VS_STATS_DOOR_MAGIC)) {
bfc848c632c9eacb2a640246d96e198f1b185c03jm return;
bfc848c632c9eacb2a640246d96e198f1b185c03jm }
bfc848c632c9eacb2a640246d96e198f1b185c03jm
bfc848c632c9eacb2a640246d96e198f1b185c03jm rsp.vsr_magic = VS_STATS_DOOR_MAGIC;
bfc848c632c9eacb2a640246d96e198f1b185c03jm
bfc848c632c9eacb2a640246d96e198f1b185c03jm switch (req->vsr_id) {
911106dfb16696472af8c1b7b4c554a829354fa8jm case VS_STATS_GET:
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) pthread_mutex_lock(&vs_stats_mutex);
bfc848c632c9eacb2a640246d96e198f1b185c03jm rsp.vsr_stats = vscan_stats;
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) pthread_mutex_unlock(&vs_stats_mutex);
bfc848c632c9eacb2a640246d96e198f1b185c03jm (void) door_return((char *)&rsp, sizeof (vs_stats_rsp_t),
bfc848c632c9eacb2a640246d96e198f1b185c03jm NULL, 0);
911106dfb16696472af8c1b7b4c554a829354fa8jm break;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm case VS_STATS_RESET:
bfc848c632c9eacb2a640246d96e198f1b185c03jm vs_stats_reset();
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) door_return(NULL, 0, NULL, 0);
911106dfb16696472af8c1b7b4c554a829354fa8jm break;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm default:
bfc848c632c9eacb2a640246d96e198f1b185c03jm return;
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
bfc848c632c9eacb2a640246d96e198f1b185c03jm/*
bfc848c632c9eacb2a640246d96e198f1b185c03jm * vs_stats_reset
bfc848c632c9eacb2a640246d96e198f1b185c03jm *
bfc848c632c9eacb2a640246d96e198f1b185c03jm * Reset totals and per-engine statistics to 0
bfc848c632c9eacb2a640246d96e198f1b185c03jm */
bfc848c632c9eacb2a640246d96e198f1b185c03jmstatic void
bfc848c632c9eacb2a640246d96e198f1b185c03jmvs_stats_reset()
bfc848c632c9eacb2a640246d96e198f1b185c03jm{
bfc848c632c9eacb2a640246d96e198f1b185c03jm int i;
bfc848c632c9eacb2a640246d96e198f1b185c03jm
bfc848c632c9eacb2a640246d96e198f1b185c03jm if (vs_stats_check_auth() != 0)
bfc848c632c9eacb2a640246d96e198f1b185c03jm return;
bfc848c632c9eacb2a640246d96e198f1b185c03jm
bfc848c632c9eacb2a640246d96e198f1b185c03jm (void) pthread_mutex_lock(&vs_stats_mutex);
bfc848c632c9eacb2a640246d96e198f1b185c03jm
bfc848c632c9eacb2a640246d96e198f1b185c03jm vscan_stats.vss_scanned = 0;
bfc848c632c9eacb2a640246d96e198f1b185c03jm vscan_stats.vss_infected = 0;
bfc848c632c9eacb2a640246d96e198f1b185c03jm vscan_stats.vss_cleaned = 0;
bfc848c632c9eacb2a640246d96e198f1b185c03jm vscan_stats.vss_failed = 0;
bfc848c632c9eacb2a640246d96e198f1b185c03jm
bfc848c632c9eacb2a640246d96e198f1b185c03jm for (i = 0; i < VS_SE_MAX; i++)
bfc848c632c9eacb2a640246d96e198f1b185c03jm vscan_stats.vss_eng[i].vss_errors = 0;
bfc848c632c9eacb2a640246d96e198f1b185c03jm
bfc848c632c9eacb2a640246d96e198f1b185c03jm (void) pthread_mutex_unlock(&vs_stats_mutex);
bfc848c632c9eacb2a640246d96e198f1b185c03jm}
bfc848c632c9eacb2a640246d96e198f1b185c03jm
bfc848c632c9eacb2a640246d96e198f1b185c03jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_stats_set
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Update scan request stats
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmvoid
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_stats_set(int retval)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) pthread_mutex_lock(&vs_stats_mutex);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm switch (retval) {
911106dfb16696472af8c1b7b4c554a829354fa8jm case VS_RESULT_CLEAN:
911106dfb16696472af8c1b7b4c554a829354fa8jm vscan_stats.vss_scanned++;
911106dfb16696472af8c1b7b4c554a829354fa8jm break;
911106dfb16696472af8c1b7b4c554a829354fa8jm case VS_RESULT_CLEANED:
911106dfb16696472af8c1b7b4c554a829354fa8jm vscan_stats.vss_scanned++;
911106dfb16696472af8c1b7b4c554a829354fa8jm vscan_stats.vss_infected++;
911106dfb16696472af8c1b7b4c554a829354fa8jm vscan_stats.vss_cleaned++;
911106dfb16696472af8c1b7b4c554a829354fa8jm break;
911106dfb16696472af8c1b7b4c554a829354fa8jm case VS_RESULT_FORBIDDEN:
911106dfb16696472af8c1b7b4c554a829354fa8jm vscan_stats.vss_scanned++;
911106dfb16696472af8c1b7b4c554a829354fa8jm vscan_stats.vss_infected++;
911106dfb16696472af8c1b7b4c554a829354fa8jm break;
911106dfb16696472af8c1b7b4c554a829354fa8jm case VS_RESULT_SE_ERROR:
911106dfb16696472af8c1b7b4c554a829354fa8jm case VS_RESULT_ERROR:
911106dfb16696472af8c1b7b4c554a829354fa8jm default:
911106dfb16696472af8c1b7b4c554a829354fa8jm vscan_stats.vss_failed++;
911106dfb16696472af8c1b7b4c554a829354fa8jm break;
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) pthread_mutex_unlock(&vs_stats_mutex);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_stats_eng_err
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Increment the error count stat for eng
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmvoid
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_stats_eng_err(char *engid)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm int i;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) pthread_mutex_lock(&vs_stats_mutex);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm for (i = 0; i < VS_SE_MAX; i++) {
911106dfb16696472af8c1b7b4c554a829354fa8jm if (*(vscan_stats.vss_eng[i].vss_engid) == 0)
911106dfb16696472af8c1b7b4c554a829354fa8jm break;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strcmp(vscan_stats.vss_eng[i].vss_engid, engid) == 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm ++(vscan_stats.vss_eng[i].vss_errors);
911106dfb16696472af8c1b7b4c554a829354fa8jm break;
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) pthread_mutex_unlock(&vs_stats_mutex);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_stats_config
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmvoid
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_stats_config(vs_props_all_t *config)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm int i, j;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *engid, *previd;
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_stats_t prev;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) pthread_mutex_lock(&vs_stats_mutex);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) memcpy(&prev, &vscan_stats, sizeof (vs_stats_t));
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) memset(&vscan_stats.vss_eng, 0, sizeof (vscan_stats.vss_eng));
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm for (i = 0; i < VS_SE_MAX; i++) {
911106dfb16696472af8c1b7b4c554a829354fa8jm engid = config->va_se[i].vep_engid;
911106dfb16696472af8c1b7b4c554a829354fa8jm if (*engid == 0)
911106dfb16696472af8c1b7b4c554a829354fa8jm break;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) strlcpy(vscan_stats.vss_eng[i].vss_engid, engid,
911106dfb16696472af8c1b7b4c554a829354fa8jm VS_SE_NAME_LEN);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* find previous error count for engid */
911106dfb16696472af8c1b7b4c554a829354fa8jm for (j = 0; j < VS_SE_MAX; j++) {
911106dfb16696472af8c1b7b4c554a829354fa8jm previd = prev.vss_eng[j].vss_engid;
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strcmp(previd, engid) == 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm vscan_stats.vss_eng[i].vss_errors =
911106dfb16696472af8c1b7b4c554a829354fa8jm prev.vss_eng[j].vss_errors;
911106dfb16696472af8c1b7b4c554a829354fa8jm break;
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) pthread_mutex_unlock(&vs_stats_mutex);
911106dfb16696472af8c1b7b4c554a829354fa8jm}