更新libclamav库1.0.0版本
This commit is contained in:
64
clamav/freshclam/CMakeLists.txt
Normal file
64
clamav/freshclam/CMakeLists.txt
Normal file
@@ -0,0 +1,64 @@
|
||||
# Copyright (C) 2020-2022 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
|
||||
|
||||
if(WIN32)
|
||||
add_definitions(-DWIN32_LEAN_AND_MEAN)
|
||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
||||
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
||||
add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
|
||||
|
||||
# Windows compatibility headers
|
||||
include_directories(${CMAKE_SOURCE_DIR}/win32/compat)
|
||||
endif()
|
||||
|
||||
# The freshclam executable.
|
||||
add_executable( freshclam-bin )
|
||||
target_sources( freshclam-bin
|
||||
PRIVATE
|
||||
freshclam.c
|
||||
execute.c
|
||||
execute.h
|
||||
notify.c
|
||||
notify.h )
|
||||
if(WIN32)
|
||||
target_sources( freshclam-bin
|
||||
PRIVATE
|
||||
${CMAKE_SOURCE_DIR}/win32/res/freshclam.rc
|
||||
${CMAKE_SOURCE_DIR}/win32/res/clam.manifest )
|
||||
endif()
|
||||
set_target_properties( freshclam-bin PROPERTIES COMPILE_FLAGS "${WARNCFLAGS}" )
|
||||
|
||||
if (APPLE AND CLAMAV_SIGN_FILE)
|
||||
set_target_properties( freshclam-bin PROPERTIES
|
||||
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ${CODE_SIGN_IDENTITY}
|
||||
XCODE_ATTRIBUTE_DEVELOPMENT_TEAM ${DEVELOPMENT_TEAM_ID}
|
||||
)
|
||||
endif()
|
||||
|
||||
target_link_libraries(freshclam-bin
|
||||
PRIVATE
|
||||
ClamAV::libfreshclam
|
||||
ClamAV::libclamav
|
||||
ClamAV::common )
|
||||
if(WIN32)
|
||||
install(TARGETS freshclam-bin DESTINATION . COMPONENT programs)
|
||||
install(FILES $<TARGET_PDB_FILE:freshclam-bin> DESTINATION . OPTIONAL COMPONENT programs)
|
||||
else()
|
||||
install(TARGETS freshclam-bin DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT programs)
|
||||
endif()
|
||||
|
||||
# Install an empty database directory
|
||||
INSTALL(CODE "FILE(MAKE_DIRECTORY \${ENV}\${CMAKE_INSTALL_PREFIX}/\${DATABASE_DIRECTORY})" COMPONENT programs)
|
||||
|
||||
# Now we rename freshclam-bin executable to freshclam using target properties
|
||||
set_target_properties( freshclam-bin
|
||||
PROPERTIES OUTPUT_NAME freshclam )
|
||||
|
||||
if(SYSTEMD_FOUND)
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/clamav-freshclam.service.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/clamav-freshclam.service @ONLY)
|
||||
install(
|
||||
FILES ${CMAKE_CURRENT_BINARY_DIR}/clamav-freshclam.service
|
||||
DESTINATION ${SYSTEMD_UNIT_DIR}
|
||||
COMPONENT programs)
|
||||
endif()
|
||||
21
clamav/freshclam/Doxyfile
Normal file
21
clamav/freshclam/Doxyfile
Normal file
@@ -0,0 +1,21 @@
|
||||
PROJECT_NAME = ClamAV - FreshClam
|
||||
OUTPUT_DIRECTORY = ../docs/freshclam
|
||||
WARNINGS = YES
|
||||
FILE_PATTERNS = *.c *.h
|
||||
PERL_PATH = /usr/bin/perl
|
||||
SEARCHENGINE = YES
|
||||
|
||||
GENERATE_LATEX=NO
|
||||
OPTIMIZE_OUTPUT_FOR_C=YES
|
||||
HAVE_DOT=YES
|
||||
CALL_GRAPH=YES
|
||||
CALLER_GRAPH=YES
|
||||
JAVADOC_AUTOBRIEF=YES
|
||||
GENERATE_MAN=NO
|
||||
EXAMPLE_PATH=examples
|
||||
|
||||
DOT_CLEANUP=NO
|
||||
MAX_DOT_GRAPH_DEPTH=3
|
||||
|
||||
EXTRACT_ALL=YES
|
||||
INPUT = .
|
||||
13
clamav/freshclam/clamav-freshclam.service.in
Normal file
13
clamav/freshclam/clamav-freshclam.service.in
Normal file
@@ -0,0 +1,13 @@
|
||||
[Unit]
|
||||
Description=ClamAV virus database updater
|
||||
Documentation=man:freshclam(1) man:freshclam.conf(5) https://docs.clamav.net/
|
||||
# If user wants it run from cron, don't start the daemon.
|
||||
ConditionPathExists=!/etc/cron.d/clamav-freshclam
|
||||
Wants=network-online.target
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
ExecStart=@prefix@/bin/freshclam -d --foreground=true
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
79
clamav/freshclam/execute.c
Normal file
79
clamav/freshclam/execute.c
Normal file
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* By Per Jessen <per@computer.org> with changes by the ClamAV team
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "clamav-config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "output.h"
|
||||
#include "optparser.h"
|
||||
#include "execute.h"
|
||||
|
||||
#define MAX_CHILDREN 5
|
||||
|
||||
int g_active_children;
|
||||
|
||||
void execute(const char *type, const char *text, int bDaemonized)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!bDaemonized) {
|
||||
if (sscanf(text, "EXIT_%d", &ret) == 1) {
|
||||
logg(LOGG_DEBUG, "%s: EXIT_%d\n", type, ret);
|
||||
exit(ret);
|
||||
}
|
||||
if (system(text) == -1)
|
||||
logg(LOGG_INFO, "%s: system(%s) failed\n", type, text);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
if (system(text) == -1) {
|
||||
logg(LOGG_WARNING, "%s: couldn't execute \"%s\".\n", type, text);
|
||||
return;
|
||||
}
|
||||
#else
|
||||
if (g_active_children < MAX_CHILDREN) {
|
||||
pid_t pid;
|
||||
switch (pid = fork()) {
|
||||
case 0:
|
||||
if (-1 == system(text)) {
|
||||
logg(LOGG_WARNING, "%s: couldn't execute \"%s\".\n", type, text);
|
||||
}
|
||||
exit(0);
|
||||
case -1:
|
||||
logg(LOGG_WARNING, "%s::fork() failed, %s.\n", type, strerror(errno));
|
||||
break;
|
||||
default:
|
||||
g_active_children++;
|
||||
}
|
||||
} else {
|
||||
logg(LOGG_WARNING, "%s: already %d processes active.\n", type, g_active_children);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
29
clamav/freshclam/execute.h
Normal file
29
clamav/freshclam/execute.h
Normal file
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* By Per Jessen <per@computer.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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 __EXECUTE_H
|
||||
#define __EXECUTE_H
|
||||
|
||||
#include "optparser.h"
|
||||
|
||||
extern int g_active_children;
|
||||
|
||||
void execute(const char *type, const char *text, int bDaemonized);
|
||||
|
||||
#endif
|
||||
2114
clamav/freshclam/freshclam.c
Normal file
2114
clamav/freshclam/freshclam.c
Normal file
File diff suppressed because it is too large
Load Diff
176
clamav/freshclam/notify.c
Normal file
176
clamav/freshclam/notify.c
Normal file
@@ -0,0 +1,176 @@
|
||||
/*
|
||||
* Copyright (C) 2013-2022 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
|
||||
* Copyright (C) 2002-2013 Sourcefire, Inc.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "clamav-config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
#ifndef _WIN32
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "optparser.h"
|
||||
#include "output.h"
|
||||
#include "clamdcom.h"
|
||||
|
||||
#include "notify.h"
|
||||
|
||||
int clamd_connect(const char *cfgfile, const char *option)
|
||||
{
|
||||
#ifndef _WIN32
|
||||
struct sockaddr_un server;
|
||||
#endif
|
||||
|
||||
struct addrinfo hints, *res, *p;
|
||||
char port[6];
|
||||
int ret;
|
||||
|
||||
struct optstruct *opts;
|
||||
const struct optstruct *opt;
|
||||
int sockd;
|
||||
|
||||
if ((opts = optparse(cfgfile, 0, NULL, 1, OPT_CLAMD, 0, NULL)) == NULL) {
|
||||
logg(LOGG_ERROR, "%s: Can't find or parse configuration file %s\n", option,
|
||||
cfgfile);
|
||||
return -11;
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
if ((opt = optget(opts, "LocalSocket"))->enabled) {
|
||||
memset(&server, 0x00, sizeof(server));
|
||||
server.sun_family = AF_UNIX;
|
||||
strncpy(server.sun_path, opt->strarg, sizeof(server.sun_path));
|
||||
server.sun_path[sizeof(server.sun_path) - 1] = '\0';
|
||||
|
||||
if ((sockd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
|
||||
logg(LOGG_WARNING, "Clamd was NOT notified: Can't create socket endpoint for %s: %s\n",
|
||||
opt->strarg, strerror(errno));
|
||||
optfree(opts);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (connect(sockd, (struct sockaddr *)&server,
|
||||
sizeof(struct sockaddr_un)) < 0) {
|
||||
logg(LOGG_WARNING, "Clamd was NOT notified: Can't connect to clamd through %s: %s\n",
|
||||
opt->strarg, strerror(errno));
|
||||
closesocket(sockd);
|
||||
optfree(opts);
|
||||
return -11;
|
||||
}
|
||||
|
||||
return sockd;
|
||||
|
||||
} else
|
||||
#endif
|
||||
if ((opt = optget(opts, "TCPSocket"))->enabled) {
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_flags = AI_PASSIVE;
|
||||
|
||||
snprintf(port, sizeof(port), "%u", (unsigned int)opt->numarg);
|
||||
port[5] = 0;
|
||||
|
||||
opt = optget(opts, "TCPAddr");
|
||||
while (opt) {
|
||||
ret = getaddrinfo(opt->strarg, port, &hints, &res);
|
||||
|
||||
if (ret) {
|
||||
logg(LOGG_ERROR, "%s: Can't resolve hostname %s (%s)\n", option,
|
||||
opt->strarg ? opt->strarg : "",
|
||||
(ret ==
|
||||
EAI_SYSTEM)
|
||||
? strerror(errno)
|
||||
: gai_strerror(ret));
|
||||
opt = opt->nextarg;
|
||||
continue;
|
||||
}
|
||||
|
||||
for (p = res; p != NULL; p = p->ai_next) {
|
||||
if ((sockd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) < 0) {
|
||||
logg(LOGG_ERROR, "%s: Can't create TCP socket to connect to %s: %s\n",
|
||||
option, opt->strarg ? opt->strarg : "localhost", strerror(errno));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (connect(sockd, p->ai_addr, p->ai_addrlen) == -1) {
|
||||
logg(LOGG_ERROR, "%s: Can't connect to clamd on %s:%s: %s\n", option,
|
||||
opt->strarg ? opt->strarg : "localhost", port, strerror(errno));
|
||||
closesocket(sockd);
|
||||
continue;
|
||||
}
|
||||
|
||||
optfree(opts);
|
||||
freeaddrinfo(res);
|
||||
|
||||
return sockd;
|
||||
}
|
||||
|
||||
freeaddrinfo(res);
|
||||
opt = opt->nextarg;
|
||||
}
|
||||
} else {
|
||||
logg(LOGG_ERROR, "%s: No communication socket specified in %s\n", option,
|
||||
cfgfile);
|
||||
optfree(opts);
|
||||
return 1;
|
||||
}
|
||||
|
||||
optfree(opts);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int notify(const char *cfgfile)
|
||||
{
|
||||
char buff[20];
|
||||
int sockd, bread;
|
||||
|
||||
if ((sockd = clamd_connect(cfgfile, "NotifyClamd")) < 0)
|
||||
return 1;
|
||||
|
||||
if (sendln(sockd, "RELOAD", 7) < 0) {
|
||||
logg(LOGG_ERROR, "NotifyClamd: Could not write to clamd socket: %s\n", strerror(errno));
|
||||
closesocket(sockd);
|
||||
return 1;
|
||||
}
|
||||
|
||||
memset(buff, 0, sizeof(buff));
|
||||
if ((bread = recv(sockd, buff, sizeof(buff), 0)) > 0) {
|
||||
if (!strstr(buff, "RELOADING")) {
|
||||
logg(LOGG_ERROR, "NotifyClamd: Unknown answer from clamd: '%s'\n", buff);
|
||||
closesocket(sockd);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
closesocket(sockd);
|
||||
logg(LOGG_INFO, "Clamd successfully notified about the update.\n");
|
||||
return 0;
|
||||
}
|
||||
27
clamav/freshclam/notify.h
Normal file
27
clamav/freshclam/notify.h
Normal file
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* 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 __NOTIFY_H
|
||||
#define __NOTIFY_H
|
||||
|
||||
int notify(const char *cfgfile);
|
||||
int clamd_connect(const char *cfgfile, const char *option);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user