Thanks a lot

It should work fine, but I got this error :
bash-2.05b$ make
MAKE Version 5.2  Copyright (c) 1987, 1998 Inprise Corp.
Error makefile 444: Colon expected
*** 1 errors during make ***

Here in the Makefile & freshclam.c files

Hope you understand it

Niber

Tomasz Kojm wrote:

On Thu, 20 Nov 2003 16:03:02 +0100
"G. Jullien" <[EMAIL PROTECTED]> wrote:


Hi,

How can install ClamAV on Windows (workstation).
Cygwin is already installed.


google.com -> ClamAV 0.65 cygwin:

bNamed.net - Install ClamAV on Win32
... ifndef C_CYGWIN; Start cygwin and type $ cd /home/user/clamav-0.65
$ ./configure ?disable-clamav $ make $ make install; This should ... www.bnamed.net/en/ XMailFilterClamAV.asp?tiucsib=6xfpi13dltqq


Best regards,
Tomasz Kojm
# Makefile.in generated by automake 1.6.1 from Makefile.am.
# Makefile.  Generated from Makefile.in by configure.

# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
# Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.

MAKE=make

#
#  Copyright (C) 2002 Tomasz Kojm <[EMAIL PROTECTED]>
#
#  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., 675 Mass Ave, Cambridge, MA 02139, USA.
SHELL = /bin/bash

srcdir = .
top_srcdir = .

prefix = /usr/local
exec_prefix = ${prefix}

bindir = ${exec_prefix}/bin
sbindir = ${exec_prefix}/sbin
libexecdir = ${exec_prefix}/libexec
datadir = ${prefix}/share
sysconfdir = ${prefix}/etc
sharedstatedir = ${prefix}/com
localstatedir = ${prefix}/var
libdir = ${exec_prefix}/lib
infodir = ${prefix}/info
mandir = ${prefix}/man
includedir = ${prefix}/include
oldincludedir = /usr/include
pkgdatadir = $(datadir)/clamav
pkglibdir = $(libdir)/clamav
pkgincludedir = $(includedir)/clamav
top_builddir = .

ACLOCAL = ${SHELL} /home/GUILLA~1/ClamAV/missing --run aclocal-1.6
AUTOCONF = ${SHELL} /home/GUILLA~1/ClamAV/missing --run autoconf
AUTOMAKE = ${SHELL} /home/GUILLA~1/ClamAV/missing --run automake-1.6
AUTOHEADER = ${SHELL} /home/GUILLA~1/ClamAV/missing --run autoheader

am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = /usr/bin/install -c
INSTALL_PROGRAM = ${INSTALL}
INSTALL_DATA = ${INSTALL} -m 644
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
INSTALL_SCRIPT = ${INSTALL}
INSTALL_HEADER = $(INSTALL_DATA)
transform = s,x,x,
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_alias = 
build_triplet = i686-pc-cygwin
host_alias = 
host_triplet = i686-pc-cygwin
target_alias = 
target_triplet = i686-pc-cygwin

EXEEXT = .exe
OBJEXT = o
PATH_SEPARATOR = :
AMTAR = ${SHELL} /home/GUILLA~1/ClamAV/missing --run tar
AS = @AS@
AWK = gawk
CC = gcc
CFGDIR = /usr/local/etc
CLAMAVGROUP = 
CLAMAVUSER = 
CLAMD_LIBS = 
DBDIR = /usr/local/share/clamav
DEPDIR = .deps
DLLTOOL = @DLLTOOL@
ECHO = echo
FRESHCLAM_LIBS = 
GETENT = 
INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
LIBCLAMAV_LIBS =  -lz -lbz2 -lgmp -lpthread
LIBCLAMAV_VERSION = 1:3:0
LIBTOOL = $(SHELL) $(top_builddir)/libtool
LN_S = ln -s
OBJDUMP = @OBJDUMP@
PACKAGE = clamav
RANLIB = ranlib
STRIP = strip
TH_SAFE = -thread-safe
VERSION = 0.65
am__include = #
am__quote = 
install_sh = /home/GUILLA~1/ClamAV/install-sh

SUBDIRS = libclamav clamscan clamd clamdscan freshclam sigtool database docs etc 
clamav-milter
EXTRA_DIST = FAQ contrib test examples BUGS
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_CLEAN_FILES =
DIST_SOURCES =

RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \
        uninstall-info-recursive all-recursive install-data-recursive \
        install-exec-recursive installdirs-recursive install-recursive \
        uninstall-recursive check-recursive installcheck-recursive
DIST_COMMON = README AUTHORS COPYING ChangeLog INSTALL Makefile.am \
        Makefile.in NEWS TODO acinclude.m4 aclocal.m4 config.guess \
        config.sub configure configure.in depcomp install-sh ltmain.sh \
        missing mkinstalldirs
DIST_SUBDIRS = $(SUBDIRS)
all: all-recursive

.SUFFIXES:
$(srcdir)/Makefile.in:  Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
        cd $(top_srcdir) && \
          $(AUTOMAKE) --gnu  Makefile
Makefile:  $(srcdir)/Makefile.in  $(top_builddir)/config.status
        cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)

$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        $(SHELL) ./config.status --recheck
$(srcdir)/configure:  $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
        cd $(srcdir) && $(AUTOCONF)

$(ACLOCAL_M4):  configure.in acinclude.m4
        cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)

mostlyclean-libtool:
        -rm -f *.lo

clean-libtool:
        -rm -rf .libs _libs

distclean-libtool:
        -rm -f libtool
uninstall-info-am:

# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
# To change the values of `make' variables: instead of editing Makefiles,
# (1) if the variable is set in `config.status', edit `config.status'
#     (which will cause the Makefiles to be regenerated when you run `make');
# (2) otherwise, pass the desired values on the `make' command line.
$(RECURSIVE_TARGETS):
        @set fnord $$MAKEFLAGS; amf=$$2; \
        dot_seen=no; \
        target=`echo $@ | sed s/-recursive//`; \
        list='$(SUBDIRS)'; for subdir in $$list; do \
          echo "Making $$target in $$subdir"; \
          if test "$$subdir" = "."; then \
            dot_seen=yes; \
            local_target="$$target-am"; \
          else \
            local_target="$$target"; \
          fi; \
          (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
           || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
        done; \
        if test "$$dot_seen" = "no"; then \
          $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
        fi; test -z "$$fail"

mostlyclean-recursive clean-recursive distclean-recursive \
maintainer-clean-recursive:
        @set fnord $$MAKEFLAGS; amf=$$2; \
        dot_seen=no; \
        case "$@" in \
          distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
          *) list='$(SUBDIRS)' ;; \
        esac; \
        rev=''; for subdir in $$list; do \
          if test "$$subdir" = "."; then :; else \
            rev="$$subdir $$rev"; \
          fi; \
        done; \
        rev="$$rev ."; \
        target=`echo $@ | sed s/-recursive//`; \
        for subdir in $$rev; do \
          echo "Making $$target in $$subdir"; \
          if test "$$subdir" = "."; then \
            local_target="$$target-am"; \
          else \
            local_target="$$target"; \
          fi; \
          (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
           || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
        done && test -z "$$fail"
tags-recursive:
        list='$(SUBDIRS)'; for subdir in $$list; do \
          test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
        done

ETAGS = etags
ETAGSFLAGS =

tags: TAGS

ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
        list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
        unique=`for i in $$list; do \
            if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
          done | \
          $(AWK) '    { files[$$0] = 1; } \
               END { for (i in files) print i; }'`; \
        mkid -fID $$unique

TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
                $(TAGS_FILES) $(LISP)
        tags=; \
        here=`pwd`; \
        list='$(SUBDIRS)'; for subdir in $$list; do \
          if test "$$subdir" = .; then :; else \
            test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
          fi; \
        done; \
        list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
        unique=`for i in $$list; do \
            if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
          done | \
          $(AWK) '    { files[$$0] = 1; } \
               END { for (i in files) print i; }'`; \
        test -z "$(ETAGS_ARGS)$$tags$$unique" \
          || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
             $$tags $$unique

GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && cd $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) $$here

distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)

top_distdir = .
distdir = $(PACKAGE)-$(VERSION)

am__remove_distdir = \
  { test ! -d $(distdir) \
    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
         && rm -fr $(distdir); }; }

GZIP_ENV = --best
distcleancheck_listfiles = find . -type f -print

distdir: $(DISTFILES)
        $(am__remove_distdir)
        mkdir $(distdir)
        @for file in $(DISTFILES); do \
          if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
          dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
          if test "$$dir" != "$$file" && test "$$dir" != "."; then \
            dir="/$$dir"; \
            $(mkinstalldirs) "$(distdir)$$dir"; \
          else \
            dir=''; \
          fi; \
          if test -d $$d/$$file; then \
            if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
              cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
            fi; \
            cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
          else \
            test -f $(distdir)/$$file \
            || cp -p $$d/$$file $(distdir)/$$file \
            || exit 1; \
          fi; \
        done
        list='$(SUBDIRS)'; for subdir in $$list; do \
          if test "$$subdir" = .; then :; else \
            test -d $(distdir)/$$subdir \
            || mkdir $(distdir)/$$subdir \
            || exit 1; \
            (cd $$subdir && \
              $(MAKE) $(AM_MAKEFLAGS) \
                top_distdir="$(top_distdir)" \
                distdir=../$(distdir)/$$subdir \
                distdir) \
              || exit 1; \
          fi; \
        done
        -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
          ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
          ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
          ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
        || chmod -R a+r $(distdir)
dist-gzip: distdir
        $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
        $(am__remove_distdir)

dist dist-all: distdir
        $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
        $(am__remove_distdir)

# This target untars the dist file and tries a VPATH configuration.  Then
# it guarantees that the distribution is self-contained by making another
# tarfile.
distcheck: dist
        $(am__remove_distdir)
        GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf -
        chmod -R a-w $(distdir); chmod a+w $(distdir)
        mkdir $(distdir)/=build
        mkdir $(distdir)/=inst
        chmod a-w $(distdir)
        dc_install_base=`$(am__cd) $(distdir)/=inst && pwd` \
          && cd $(distdir)/=build \
          && ../configure --srcdir=.. --prefix=$$dc_install_base \
            $(DISTCHECK_CONFIGURE_FLAGS) \
          && $(MAKE) $(AM_MAKEFLAGS) \
          && $(MAKE) $(AM_MAKEFLAGS) dvi \
          && $(MAKE) $(AM_MAKEFLAGS) check \
          && $(MAKE) $(AM_MAKEFLAGS) install \
          && $(MAKE) $(AM_MAKEFLAGS) installcheck \
          && $(MAKE) $(AM_MAKEFLAGS) uninstall \
          && (test `find $$dc_install_base -type f -print | wc -l` -le 1 \
              || { echo "ERROR: files left after uninstall:" ; \
                   find $$dc_install_base -type f -print ; \
                   exit 1; } >&2 ) \
          && $(MAKE) $(AM_MAKEFLAGS) dist-gzip \
          && rm -f $(distdir).tar.gz \
          && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
        $(am__remove_distdir)
        @echo "$(distdir).tar.gz is ready for distribution" | \
          sed 'h;s/./=/g;p;x;p;x'
distcleancheck: distclean
        if test '$(srcdir)' = . ; then \
          echo "ERROR: distcleancheck can only run from a VPATH build" ; \
          exit 1 ; \
        fi
        test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
          || { echo "ERROR: files left after distclean:" ; \
               $(distcleancheck_listfiles) ; \
               exit 1; } >&2
check-am: all-am
check: check-recursive
all-am: Makefile
installdirs: installdirs-recursive
installdirs-am:

install: install-recursive
install-exec: install-exec-recursive
install-data: install-data-recursive
uninstall: uninstall-recursive

install-am: all-am
        @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am

installcheck: installcheck-recursive
install-strip:
        $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
          INSTALL_STRIP_FLAG=-s \
          `test -z '$(STRIP)' || \
            echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:

clean-generic:

distclean-generic:
        -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]*

maintainer-clean-generic:
        @echo "This command is intended for maintainers to use"
        @echo "it deletes files that may require special tools to rebuild."
clean: clean-recursive

clean-am: clean-generic clean-libtool mostlyclean-am

distclean: distclean-recursive
        -rm -f config.status config.cache config.log
distclean-am: clean-am distclean-generic distclean-libtool \
        distclean-tags

dvi: dvi-recursive

dvi-am:

info: info-recursive

info-am:

install-data-am:

install-exec-am:

install-info: install-info-recursive

install-man:

installcheck-am:

maintainer-clean: maintainer-clean-recursive

maintainer-clean-am: distclean-am maintainer-clean-generic

mostlyclean: mostlyclean-recursive

mostlyclean-am: mostlyclean-generic mostlyclean-libtool

uninstall-am: uninstall-info-am

uninstall-info: uninstall-info-recursive

.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \
        clean-generic clean-libtool clean-recursive dist dist-all \
        dist-gzip distcheck distclean distclean-generic \
        distclean-libtool distclean-recursive distclean-tags \
        distcleancheck distdir dvi dvi-am dvi-recursive info info-am \
        info-recursive install install-am install-data install-data-am \
        install-data-recursive install-exec install-exec-am \
        install-exec-recursive install-info install-info-am \
        install-info-recursive install-man install-recursive \
        install-strip installcheck installcheck-am installdirs \
        installdirs-am installdirs-recursive maintainer-clean \
        maintainer-clean-generic maintainer-clean-recursive mostlyclean \
        mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \
        tags tags-recursive uninstall uninstall-am uninstall-info-am \
        uninstall-info-recursive uninstall-recursive

# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
/*
 *  Copyright (C) 2002, 2003 Tomasz Kojm <[EMAIL PROTECTED]>
 *                           Damien Curtain <[EMAIL PROTECTED]>
 *
 *  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., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

/* TODO: Handle SIGALRM more gently */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pwd.h>
#include <grp.h>

#include "options.h"
#include "shared.h"
#include "others.h"
#include "manager.h"
#include "defaults.h"
#include "freshclam.h"

#define TIMEOUT 1200

void freshclam(struct optstruct *opt)
{
        int ret;
        struct passwd *user;
        char *newdir;

#ifndef C_CYGWIN
        char *unpuser;

    if(optc(opt, 'u'))
        unpuser = getargc(opt, 'u');
    else
        unpuser = UNPUSER;

    /* freshclam shouldn't work with root priviledges */
    if(!getuid()) { 
        if((user = getpwnam(unpuser)) == NULL) {
            mprintf("@Can't get information about user %s.\n", unpuser);
            exit(60); /* this is critical problem, so we just exit here */
        }

        setgroups(1, &user->pw_gid);
        setgid(user->pw_gid);
        setuid(user->pw_uid);
    }
#endif

    /* initialize some important variables */

    if(optl(opt, "debug"))
        cl_debug();

    mprintf_disabled = 0;

    if(optc(opt, 'v')) mprintf_verbose = 1;
    else mprintf_verbose = 0;

    if(optl(opt, "quiet")) mprintf_quiet = 1;
    else mprintf_quiet = 0;

    if(optl(opt, "stdout")) mprintf_stdout = 1;
    else mprintf_stdout = 0;

    if(optc(opt, 'V')) {
        mprintf("freshclam / ClamAV version "VERSION"\n");
        mexit(0);
    }

    if(optc(opt, 'h')) {
        free_opt(opt);
        help();
    }

    /* initialize logger */

    if(optl(opt, "log-verbose")) logverbose = 1;
    else logverbose = 0;

    if(optc(opt, 'l')) {
        logfile = getargc(opt, 'l');
        if(logg("--------------------------------------\n")) {
            mprintf("!Problem with internal logger.\n");
            mexit(1);
        }
    } else 
        logfile = NULL;

    /* change current working directory */
    if(optl(opt, "datadir"))
        newdir = getargl(opt, "datadir");
    else
        newdir = VIRUSDBDIR;

    if(chdir(newdir)) {
        mprintf("Can't change dir to %s\n", newdir);
        exit(50);
    } else
        mprintf("*Current working dir is %s\n", newdir);


    if(optc(opt, 'd')) {
            int bigsleep, checks;

        if(!optc(opt, 'c')) {
            mprintf("@Daemon mode requires -c (--checks) option.\n");
            mexit(40);
        }

        checks = atoi(getargc(opt, 'c'));

        if(checks <= 0 || checks > 50) {
            mprintf("@Wrong number of checks\n");
            mexit(41);
        }

        bigsleep = 24*3600 / checks;
        daemonize();

        while(1) {
            ret = download(opt);

            if(optl(opt, "on-error-execute"))
                if(ret > 1)
                    system(getargl(opt, "on-error-execute"));

            logg("\n--------------------------------------\n");
            sleep(bigsleep);
        }

    } else
        ret = download(opt);

    if(optl(opt, "on-error-execute"))
        if(ret > 1)
            system(getargl(opt, "on-error-execute"));

    mexit(ret);

}

void d_timeout(int sig)
{
    mprintf("@Maximal time (%d seconds) reached.\n", TIMEOUT);
    exit(1);
}

int download(struct optstruct *opt)
{
        int ret = 0;
        mirrors *m = NULL, *h = NULL;
        int mirror_used = 0;
        struct sigaction sigalrm;

    sigalrm.sa_handler = d_timeout;
    sigaction(SIGALRM, &sigalrm, NULL);

    /*
     * There's an error in __nss_hostname_digits_dots () from /lib/libc.so.6
     * which gets triggered here for some reason.....
     * Calling fflush is a temp workaround
     */    
    fflush(NULL);
    
    h = m = parse_mirrorcfg(opt);
    
    while(m != NULL)
    {
        alarm(TIMEOUT);
        ret = downloadmanager(opt, m->mirror);
        alarm(0);

        if(ret == 0)
        {
            if(mirror_used)
            {
                logg("Database updated from mirror %s.\n", m->mirror);
                mprintf("Database updated from mirror %s.\n", m->mirror);
            }

            FREE_MIRROR(h);
            return ret;
        }

        /* Only continue if there is an error connecting to the host */
        if((ret != 52) && (ret != 54))
        {
            FREE_MIRROR(h);
            return ret;
        }

        mprintf("Waiting 10 seconds...\n");
        sleep(10);
        mirror_used++;
        m = m->next;
    }

    FREE_MIRROR(h);
    return ret;
}

mirrors* parse_mirrorcfg(struct optstruct *opt)
{
    mirrors *head = NULL, *curr = NULL, *prev = NULL;
    char *datadir = NULL, *mirrorcfg = NULL;
    FILE *fd = NULL;
    char buf[BUFSIZ];
    int hosts_found = 0;
       
    if(optl(opt, "datadir"))
    {
        datadir = getargl(opt, "datadir");
    }
    else
    {
        datadir = DATADIR;
    }

    if((mirrorcfg = malloc(sizeof(char) * (strlen(datadir) + strlen(MIRROR_CFG) + 1))) 
== NULL)
    {
        fprintf(stderr, "ERROR: Can't allocate sufficient memory\n");
        mexit(1);
    }

    strcpy(mirrorcfg, datadir);

    strcat(mirrorcfg, MIRROR_CFG);

    if((fd = fopen(mirrorcfg, "r")) == NULL)
    {
        fprintf(stderr, "ERROR: Can't open mirror configuration file %s !\n", 
mirrorcfg);
        free(mirrorcfg);    
        mexit(1);
    }

    while(fgets(buf, BUFSIZ, fd))
    {
        if(buf[0] == '#')
            continue;

        if(strlen(buf) > 1)
        {
            if((curr = malloc(sizeof(struct _mirrors))) == NULL)
            {
                fprintf(stderr, "ERROR: Can't allocate sufficient memory\n");
                free(mirrorcfg);    
                FREE_MIRROR(head);
                return NULL;
            }

            curr->mirror = NULL;            
            curr->next   = NULL;
            
            if(head == NULL)
                head = curr;
            
            if(prev != NULL)
                prev->next = curr;

            if((curr->mirror = malloc(sizeof(char) * (strlen(buf) +1))) == NULL)
            {
                fprintf(stderr, "ERROR: Can't allocate sufficient memory\n");
                free(mirrorcfg);    
                FREE_MIRROR(head);
                return NULL;
            }

            chomp(buf);
            strcpy(curr->mirror, buf);
            prev = curr;
            hosts_found++;
        }
    }
    
    if(fclose(fd) != 0)
    {
        fprintf(stderr, "ERROR: Can't close fd !\n");
    }
    
    if(hosts_found == 0)
    {
        fprintf(stderr, "ERROR: No hosts defined in %s !\n",  mirrorcfg);
        FREE_MIRROR(head);
        free(mirrorcfg);    
        mexit(1);
    }

    free(mirrorcfg);    
    return head;
}

void daemonize(void)
{
        int i;

    for(i = 0; i < 3; i++)
        close(i);

    umask(0);

    if(fork())
        exit(0);

    setsid();
    mprintf_disabled = 1;
}

void help(void)
{

    mprintf_stdout = 1;

    mprintf("\n");
    mprintf("                          Clam AntiVirus: freshclam  "VERSION"\n");
    mprintf("                (c) 2002, 2003 Tomasz Kojm <[EMAIL PROTECTED]>\n\n");

    mprintf("    --help               -h              show help\n");
    mprintf("    --version            -V              print version number and 
exit\n");
    mprintf("    --verbose            -v              be verbose\n");
    mprintf("    --debug                              enable debug messages\n");
    mprintf("    --quiet                              be quiet, output only error 
messages\n");
    mprintf("    --stdout                             write to stdout instead of 
stderr\n");
    mprintf("                                         (this help is always written to 
stdout)\n");
    mprintf("\n");
    mprintf("    --user=USER          -u USER         run as USER\n");
    mprintf("    --daemon             -d              run in daemon mode\n");
    mprintf("    --checks=#n          -c #n           #n checks by day, 1 <= n <= 
50\n");
    mprintf("    --datadir=DIRECTORY                  download new database in 
DIRECTORY\n");
    mprintf("    --log=FILE           -l FILE         save download report in FILE\n");
    mprintf("    --log-verbose                        save additional informations\n");
    mprintf("    --http-proxy=hostname[:port]         use proxy server hostname\n");
    mprintf("    --proxy-user=username:passwd         use username/password for proxy 
auth\n");
#ifdef BUILD_CLAMD
    mprintf("    --daemon-notify[=/path/clamav.conf]  send RELOAD command to clamd\n");
#endif
    mprintf("    --on-update-execute=COMMAND          execute COMMAND after successful 
update\n");
    mprintf("    --on-error-execute=COMMAND           execute COMMAND if errors 
occured\n");
    mprintf("\n");
    exit(0);
}

Reply via email to