265 lines
10 KiB
C
265 lines
10 KiB
C
/*
|
|
* Copyright (C) 2013-2022 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
|
|
* Copyright (C) 2007-2013 Sourcefire, Inc.
|
|
* Copyright (C) 2002-2007 Tomasz Kojm <tkojm@clamav.net>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* 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 General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
* MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef __LIBFRESHCLAM_H
|
|
#define __LIBFRESHCLAM_H
|
|
|
|
#include "clamav-types.h"
|
|
|
|
/*
|
|
* FreshClam configuration flag options.
|
|
*/
|
|
// clang-format off
|
|
#define FC_CONFIG_MSG_DEBUG 0x1 // Enable debug messages.
|
|
#define FC_CONFIG_MSG_VERBOSE 0x2 // Enable verbose mode.
|
|
#define FC_CONFIG_MSG_QUIET 0x4 // Only output error messages.
|
|
#define FC_CONFIG_MSG_NOWARN 0x8 // Don't output warning messages.
|
|
#define FC_CONFIG_MSG_STDOUT 0x10 // Write to stdout instead of stderr.
|
|
#define FC_CONFIG_MSG_SHOWPROGRESS 0x20 // Show download progress percentage.
|
|
|
|
#define FC_CONFIG_LOG_VERBOSE 0x1 // Be verbose in log output as well.
|
|
#define FC_CONFIG_LOG_NOWARN 0x2 // Don't log warning messages.
|
|
#define FC_CONFIG_LOG_TIME 0x4 // Include timestamp in log messages.
|
|
#define FC_CONFIG_LOG_ROTATE 0x8 // Rotate logs if they exceed MaxLogSize.
|
|
#define FC_CONFIG_LOG_SYSLOG 0x10 // Enable Syslog.
|
|
// clang-format on
|
|
|
|
/* freshclam config options */
|
|
typedef struct fc_config_ {
|
|
uint32_t msgFlags; /**< FC_CONFIG_MSG bitflag field. */
|
|
uint32_t logFlags; /**< FC_CONFIG_LOG bitflag field. */
|
|
uint64_t maxLogSize; /**< Max size of logfile, if enabled. */
|
|
uint32_t maxAttempts; /**< Max # of download attempts. Must be > 0 */
|
|
uint32_t connectTimeout; /**< CURLOPT_CONNECTTIMEOUT, Timeout for the. connection phase (seconds). */
|
|
uint32_t requestTimeout; /**< CURLOPT_TIMEOUT, Timeout for libcurl transfer operation (seconds). */
|
|
uint32_t bCompressLocalDatabase; /**< If set, will apply gz compression to CLD databases. */
|
|
const char *logFile; /**< (optional) Filepath to use for log output, if desired. */
|
|
const char *logFacility; /**< (optional) System logging facility (I.e. "syslog"), if desired. */
|
|
const char *localIP; /**< (optional) client IP for multihomed systems. */
|
|
const char *userAgent; /**< (optional) Alternative User Agent. */
|
|
const char *proxyServer; /**< (optional) http(s) url for proxy server. */
|
|
uint16_t proxyPort; /**< (optional) Proxy server port #. */
|
|
const char *proxyUsername; /**< (optional) Username for proxy server authentication .*/
|
|
const char *proxyPassword; /**< (optional) Password for proxy server authentication. */
|
|
const char *databaseDirectory; /**< Filepath of database directory. */
|
|
const char *tempDirectory; /**< Filepath to store temp files. */
|
|
} fc_config;
|
|
|
|
typedef enum fc_error_tag {
|
|
FC_SUCCESS = 0,
|
|
FC_UPTODATE = 1,
|
|
FC_EINIT,
|
|
FC_EDIRECTORY,
|
|
FC_EFILE,
|
|
FC_ECONNECTION,
|
|
FC_EEMPTYFILE,
|
|
FC_EBADCVD,
|
|
FC_ETESTFAIL,
|
|
FC_ECONFIG,
|
|
FC_EDBDIRACCESS,
|
|
FC_EFAILEDGET,
|
|
FC_EMIRRORNOTSYNC,
|
|
FC_ELOGGING,
|
|
FC_EFAILEDUPDATE,
|
|
FC_EMEM,
|
|
FC_EARG,
|
|
FC_EFORBIDDEN,
|
|
FC_ERETRYLATER,
|
|
FC_ERROR
|
|
} fc_error_t;
|
|
|
|
/**
|
|
* @brief Translate an FC_<code> to a human readable message.
|
|
*
|
|
* @param fcerror fc_error_t code
|
|
* @return const char * message.
|
|
*/
|
|
const char *fc_strerror(fc_error_t fcerror);
|
|
|
|
/**
|
|
* @brief Configure libfreshclam.
|
|
*
|
|
* This will initialize libcurl with `curl_global_init`.
|
|
* This should only be called once per application.
|
|
*
|
|
* If you are initializing libfreshclam from a Windows DLL you should not
|
|
* initialize it from DllMain or a static initializer because Windows holds
|
|
* the loader lock during that time and it could cause a deadlock.
|
|
*
|
|
* @param config Configuration options.
|
|
* @return fc_error_t FC_SUCCESS if success.
|
|
* @return fc_error_t FC_ELOGGING if there is an issue writing to the log.
|
|
*/
|
|
fc_error_t fc_initialize(fc_config *config);
|
|
|
|
/**
|
|
* @brief Cleanup libfreshclam features.
|
|
*
|
|
* This will call `curl_global_cleanup`.
|
|
* This should only be invoke once at the end of your
|
|
* application.
|
|
*/
|
|
void fc_cleanup(void);
|
|
|
|
/**
|
|
* @brief Delete CVD & CLD files from database directory that aren't in the provided list.
|
|
*
|
|
* Will not touch files other than CLD and CVD files.
|
|
*
|
|
* @param databaseList List of official databases to keep.
|
|
* @param nDatabases Number of databses in list.
|
|
* @return fc_error_t FC_SUCCESS if success.
|
|
* @return fc_error_t FC_EDBDIRACCESS if database access issue occured.
|
|
* @return fc_error_t FC_EARG if invalid arguments.
|
|
*/
|
|
fc_error_t fc_prune_database_directory(
|
|
char **databaseList,
|
|
uint32_t nDatabases);
|
|
|
|
/**
|
|
* @brief Test if database loads without errors.
|
|
*
|
|
* @param dbFilename Filename of database.
|
|
* @param bBytecodeEnabled Non-zero if database has bytecode signatures, and should be tested.
|
|
* @return fc_error_t FC_SUCCESS if loaded correctly.
|
|
* @return fc_error_t FC_EARG callback was passed invalid arguments.
|
|
*/
|
|
fc_error_t fc_test_database(
|
|
const char *dbFilename,
|
|
int bBytecodeEnabled);
|
|
|
|
/**
|
|
* @brief Query Update Info via DNS to get database version info, and ClamAV version info.
|
|
*
|
|
* Caller must free dnsUpdateInfo.
|
|
*
|
|
* @param dnsUpdateInfoServer (optional) The DNS server to query for Update Info. If NULL, will disable DNS update info query feature.
|
|
* @param dnsUpdateInfo [out] The Update Info DNS reply string.
|
|
* @param newVersion [out] New version of ClamAV available.
|
|
* @return fc_error_t FC_SUCCESS if success.
|
|
* @return fc_error_t FC_EARG if invalid args.
|
|
* @return fc_error_t FC_EFAILEDGET if error or disabled and should fall back to HTTP mode for update info.
|
|
*/
|
|
fc_error_t fc_dns_query_update_info(
|
|
const char *dnsUpdateInfoServer,
|
|
char **dnsUpdateInfo,
|
|
char **newVersion);
|
|
|
|
/**
|
|
* @brief Download a database directly from a URL.
|
|
*
|
|
* Whole file download. Does not support incremental update.
|
|
*
|
|
* @param url Database URL (http, https, file).
|
|
* @param context Application context to pass to fccb_download_complete callback.
|
|
* @param bUpdated [out] Non-zero if database was updated to new version or is entirely new.
|
|
* @return fc_error_t FC_SUCCESS if database downloaded and callback executed successfully.
|
|
*/
|
|
fc_error_t fc_download_url_database(
|
|
const char *urlDatabase,
|
|
void *context,
|
|
int *bUpdated);
|
|
|
|
/**
|
|
* @brief Download databases directly from a URLs.
|
|
*
|
|
* @param urlDatabaseList List of database URLs
|
|
* @param nUrlDatabases Number of URLs in list.
|
|
* @param context Application context to pass to fccb_download_complete callback.
|
|
* @param nUpdated [out] Number of databases that were updated.
|
|
* @return fc_error_t FC_SUCCESS if database downloaded and callback executed successfully.
|
|
*/
|
|
fc_error_t fc_download_url_databases(
|
|
char **urlDatabaseList,
|
|
uint32_t nUrlDatabases,
|
|
void *context,
|
|
uint32_t *nUpdated);
|
|
|
|
/**
|
|
* @brief Update specific official database, given list of update servers.
|
|
*
|
|
* @param dbName CVD/CLD database name, excluding file extension.
|
|
* @param serverList String array of update servers.
|
|
* @param nServers Number of servers in list.
|
|
* @param dnsUpdateInfoServer DNS server for update info check. May be NULL to disable use of DNS.
|
|
* @param bScriptedUpdates Enable incremental/updates (should not be enabled for PrivateMirrors).
|
|
* @param context Application context to pass to fccb_download_complete callback.
|
|
* @param bUpdated [out] Non-zero if database was updated to new version or is entirely new.
|
|
* @return fc_error_t FC_SUCCESS if database downloaded and callback executed successfully.
|
|
*/
|
|
fc_error_t fc_update_database(
|
|
const char *database,
|
|
char **serverList,
|
|
uint32_t nServers,
|
|
int bPrivateMirror,
|
|
const char *dnsUpdateInfo,
|
|
int bScriptedUpdates,
|
|
void *context,
|
|
int *bUpdated);
|
|
|
|
/**
|
|
* @brief Update list of official databases, given list of update servers.
|
|
*
|
|
* @param dbNames String array of CVD/CLD database names, excluding file extensions.
|
|
* @param nDbNames Number of names in array.
|
|
* @param serverList String array of update servers.
|
|
* @param nServers Number of servers in list.
|
|
* @param dnsUpdateInfoServer DNS server for update info check. May be NULL to disable use of DNS.
|
|
* @param bScriptedUpdates Enable incremental/updates (should not be enabled for PrivateMirrors).
|
|
* @param context Application context to pass to fccb_download_complete callback.
|
|
* @param nUpdated [out] Number of databases that were updated.
|
|
* @return fc_error_t FC_SUCCESS if database downloaded and callback executed successfully.
|
|
*/
|
|
fc_error_t fc_update_databases(
|
|
char **databaseList,
|
|
uint32_t nDatabases,
|
|
char **serverList,
|
|
uint32_t nServers,
|
|
int bPrivateMirror,
|
|
const char *dnsUpdateInfo,
|
|
int bScriptedUpdates,
|
|
void *context,
|
|
uint32_t *nUpdated);
|
|
|
|
/* ----------------------------------------------------------------------------
|
|
* Callback function type definitions.
|
|
*/
|
|
|
|
/**
|
|
* @brief FreshClam callback Download Complete
|
|
*
|
|
* Called after each database has been downloaded or updated.
|
|
*
|
|
* @param dbFilepath Filename of the downloaded database in database directory.
|
|
* @param context Opaque application provided data.
|
|
* @return fc_error_t FC_SUCCESS if callback action was successful.
|
|
* @return fc_error_t FC_EARG callback was passed invalid arguments.
|
|
* @return fc_error_t FC_ETESTFAIL if callback action failed and libfreshclam should abort any additional updates.
|
|
*/
|
|
typedef fc_error_t (*fccb_download_complete)(const char *dbFilename, void *context);
|
|
/**
|
|
* @brief Set a custom Download Complete callback function.
|
|
*
|
|
* @param callback The callback function pointer.
|
|
*/
|
|
extern void fc_set_fccb_download_complete(fccb_download_complete callback);
|
|
|
|
#endif // __LIBFRESHCLAM_H
|