/*
 * Copyright (C) Tildeslash Ltd. All rights reserved.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License version 3.
 *
 * 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 Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * In addition, as a special exception, the copyright holders give
 * permission to link the code of portions of this program with the
 * OpenSSL library under certain conditions as described in each
 * individual source file, and distribute linked combinations
 * including the two.
 *
 * You must obey the GNU Affero General Public License in all respects
 * for all of the code used other than OpenSSL.  
 */

#include "config.h"

#ifdef HAVE_STDIO_H
#include <stdio.h>
#endif

#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif

#include "monit.h"
#include "protocol.h"
#include "process.h"
#include "ssl.h"
#include "engine.h"


/* Private prototypes */
static void _gc_service_list(Service_T *);
static void _gc_service(Service_T *);
static void _gc_servicegroup(ServiceGroup_T *);
static void _gc_servicegroup_member(ServiceGroupMember_T *);
static void _gc_mail_server(MailServer_T *);
static void _gcppl(Port_T *);
static void _gcfilesystem(Filesystem_T *);
static void _gcicmp(Icmp_T *);
static void _gcpql(Resource_T *);
static void _gcptl(Timestamp_T *);
static void _gcparl(ActionRate_T *);
static void _gc_action(Action_T *);
static void _gc_eventaction(EventAction_T *);
static void _gc_inf(Info_T *);
static void _gcpdl(Dependant_T *);
static void _gcso(Size_T *);
static void _gcmatch(Match_T *);
static void _gcchecksum(Checksum_T *);
static void _gcperm(Perm_T *);
static void _gcprogram(Program_T *);
static void _gcuid(Uid_T *);
static void _gcgid(Gid_T *);
static void _gcgrc(Generic_T *);
static void _gcath(Auth_T *);
static void _gc_mmonit(Mmonit_T *);
static void _gc_url(URL_T *);
static void _gc_request(Request_T *);


/**
 *  Release allocated memory.
 *
 *  @file
 */


/* ------------------------------------------------------------------ Public */


void gc() {
        
        destroy_hosts_allow();
        
        if(Run.doprocess) {
                delprocesstree(&oldptree, &oldptreesize);
                delprocesstree(&ptree, &ptreesize);
        }
        
        if(servicelist)
                _gc_service_list(&servicelist);
        
        if(servicegrouplist)
                _gc_servicegroup(&servicegrouplist);
        
        if(Run.credentials)
                _gcath(&Run.credentials);
        
        if(Run.maillist)
                gc_mail_list(&Run.maillist);
        
        if(Run.mailservers)
                _gc_mail_server(&Run.mailservers);
        
        if(Run.mmonits)
                _gc_mmonit(&Run.mmonits);
        
        if(Run.eventlist)
                gc_event(&Run.eventlist);
        
        FREE(Run.eventlist_dir);
        FREE(Run.mygroup);
        FREE(Run.localhostname);
        FREE(Run.httpsslpem);
        FREE(Run.httpsslclientpem);
        FREE(Run.bind_addr);
        FREE(Run.MailFormat.from);
        FREE(Run.MailFormat.subject);
        FREE(Run.MailFormat.message);
        FREE(Run.mail_hostname);
        
}


void gc_mail_list(Mail_T *m) {
        
        ASSERT(m);
        
        if((*m)->next)
                gc_mail_list(&(*m)->next);
        
        FREE((*m)->to);
        FREE((*m)->from);
        FREE((*m)->replyto);
        FREE((*m)->subject);
        FREE((*m)->message);
        FREE(*m);
        
}


void gccmd(command_t *c) {
        
        int i;
        
        ASSERT(c&&*c);
        
        for(i= 0; (*c)->arg[i]; i++)
                FREE((*c)->arg[i]);
        FREE(*c);
        
}


void gc_event(Event_T *e) {
        
        ASSERT(e&&*e);
        
        if((*e)->next)
                gc_event(&(*e)->next);
        
        (*e)->action= NULL;
        FREE((*e)->source);
        FREE((*e)->message);
        FREE(*e);
        
}


/* ----------------------------------------------------------------- Private */


static void _gc_service_list(Service_T *s) {
        
        ASSERT(s&&*s);
        
        if((*s)->next)
                _gc_service_list(&(*s)->next);
        
        _gc_service(&(*s));
        
}


static void _gc_service(Service_T *s) {
        
        ASSERT(s&&*s);
        
        if((*s)->portlist)
                _gcppl(&(*s)->portlist);
        
        if((*s)->filesystemlist)
                _gcfilesystem(&(*s)->filesystemlist);
        
        if((*s)->icmplist)
                _gcicmp(&(*s)->icmplist);
        
        if((*s)->maillist)
                gc_mail_list(&(*s)->maillist);
        
        if((*s)->resourcelist)
                _gcpql(&(*s)->resourcelist);
        
        if((*s)->inf)
                _gc_inf(&(*s)->inf);
        
        if((*s)->timestamplist)
                _gcptl(&(*s)->timestamplist);
        
        if((*s)->actionratelist)
                _gcparl(&(*s)->actionratelist);
        
        if((*s)->sizelist)
                _gcso(&(*s)->sizelist);
        
        if((*s)->matchlist)
                _gcmatch(&(*s)->matchlist);
        
        if((*s)->matchignorelist)
                _gcmatch(&(*s)->matchignorelist);
        
        if((*s)->checksum)
                _gcchecksum(&(*s)->checksum);
        
        if((*s)->perm)
                _gcperm(&(*s)->perm);
        
        if ((*s)->program)
                _gcprogram(&(*s)->program);
        
        if ((*s)->every.type == EVERY_CRON || (*s)->every.type == EVERY_NOTINCRON)
                FREE((*s)->every.spec.cron);
        
        if((*s)->uid)
                _gcuid(&(*s)->uid);
        
        if((*s)->gid)
                _gcgid(&(*s)->gid);
        
        if((*s)->dependantlist)
                _gcpdl(&(*s)->dependantlist);
        
        if((*s)->start)
                gccmd(&(*s)->start);
        
        if((*s)->stop)
                gccmd(&(*s)->stop);
        
        if((*s)->action_DATA)
                _gc_eventaction(&(*s)->action_DATA);
        
        if((*s)->action_EXEC)
                _gc_eventaction(&(*s)->action_EXEC);
        
        if((*s)->action_INVALID)
                _gc_eventaction(&(*s)->action_INVALID);
        
        if((*s)->action_NONEXIST)
                _gc_eventaction(&(*s)->action_NONEXIST);
        
        if((*s)->action_PID)
                _gc_eventaction(&(*s)->action_PID);
        
        if((*s)->action_PPID)
                _gc_eventaction(&(*s)->action_PPID);
        
        if((*s)->action_FSFLAG)
                _gc_eventaction(&(*s)->action_FSFLAG);
        
        if((*s)->action_MONIT_START)
                _gc_eventaction(&(*s)->action_MONIT_START);
        
        if((*s)->action_MONIT_STOP)
                _gc_eventaction(&(*s)->action_MONIT_STOP);
        
        if((*s)->action_MONIT_RELOAD)
                _gc_eventaction(&(*s)->action_MONIT_RELOAD);
        
        if((*s)->action_ACTION)
                _gc_eventaction(&(*s)->action_ACTION);
        
        if((*s)->eventlist)
                gc_event(&(*s)->eventlist);
        
        FREE((*s)->name);
        FREE((*s)->path);
        
        (*s)->next= NULL;
        
        FREE(*s);
        
}


static void _gc_servicegroup(ServiceGroup_T *sg) {
        ASSERT(sg && *sg);
        
        if((*sg)->next)
                _gc_servicegroup(&(*sg)->next);
        
        if((*sg)->members)
                _gc_servicegroup_member(&(*sg)->members);
        FREE((*sg)->name);
        FREE(*sg);
}


static void _gc_servicegroup_member(ServiceGroupMember_T *m) {
        ASSERT(m && *m);
        
        if((*m)->next)
                _gc_servicegroup_member(&(*m)->next);
        
        FREE((*m)->name);
        FREE(*m);
}


static void _gc_request(Request_T *r) {
        
        ASSERT(r);
        
        if((*r)->url)
                _gc_url(&(*r)->url);
#ifdef HAVE_REGEX_H
        if ((*r)->regex)
                regfree((*r)->regex);
#endif
        FREE((*r)->regex);
        FREE(*r);
        
}


static void _gc_url(URL_T *url) {
        
        ASSERT(url);
        
        FREE((*url)->url);
        FREE((*url)->protocol);
        FREE((*url)->user);
        FREE((*url)->password);
        FREE((*url)->hostname);
        FREE((*url)->path);
        FREE((*url)->query);
        FREE(*url);
        
}


static void _gc_mail_server(MailServer_T *s) {
        
        if (! s || ! *s)
                return;
        
        if ((*s)->next)
                _gc_mail_server(&(*s)->next);
        
        FREE((*s)->host);
        FREE((*s)->username);
        FREE((*s)->password);
        FREE((*s)->ssl.certmd5);
        FREE((*s)->ssl.clientpemfile);
        FREE(*s);
        
}


static void _gc_action(Action_T *a) {
        
        ASSERT(a&&*a);
        
        if((*a)->exec)
                gccmd(&(*a)->exec);
        FREE(*a);
        
}


static void _gc_eventaction(EventAction_T *e) {
        
        ASSERT(e&&*e);
        
        _gc_action(&(*e)->failed);
        _gc_action(&(*e)->succeeded);
        FREE(*e);
        
}


static void _gcppl(Port_T *p) {
        
        ASSERT(p&&*p);
        
        if((*p)->next)
                _gcppl(&(*p)->next);
        
        if((*p)->action)
                _gc_eventaction(&(*p)->action);
        if((*p)->generic)
                _gcgrc(&(*p)->generic);
        if((*p)->url_request)
                _gc_request(&(*p)->url_request);
        
        FREE((*p)->request);
        FREE((*p)->hostname);
        FREE((*p)->pathname);
        FREE((*p)->SSL.certmd5);
        FREE((*p)->SSL.clientpemfile);
        FREE((*p)->request_checksum);
        FREE((*p)->request_hostheader);
        FREE(*p);
}


static void _gcfilesystem(Filesystem_T *d) {
        
        ASSERT(d&&*d);
        
        if((*d)->next)
                _gcfilesystem(&(*d)->next);
        
        if((*d)->action)
                _gc_eventaction(&(*d)->action);
        
        FREE(*d);
        
}


static void _gcicmp(Icmp_T *i) {
        
        ASSERT(i&&*i);
        
        if((*i)->next)
                _gcicmp(&(*i)->next);
        
        if((*i)->action)
                _gc_eventaction(&(*i)->action);
        
        FREE(*i);
        
}


static void _gcpql(Resource_T *q) {
        
        ASSERT(q);
        
        if((*q)->next)
                _gcpql(&(*q)->next);
        
        if((*q)->action)
                _gc_eventaction(&(*q)->action);
        
        FREE(*q);
        
}


static void _gc_inf(Info_T *i) {
        ASSERT(i);
        FREE(*i);
}


static void _gcptl(Timestamp_T *p) {
        ASSERT(p);
        
        if((*p)->next)
                _gcptl(&(*p)->next);
        
        if((*p)->action)
                _gc_eventaction(&(*p)->action);
        
        FREE(*p);
}


static void _gcparl(ActionRate_T *ar) {
        ASSERT(ar);
        
        if((*ar)->next)
                _gcparl(&(*ar)->next);
        
        if((*ar)->action)
                _gc_eventaction(&(*ar)->action);
        
        FREE(*ar);
}


static void _gcso(Size_T *s) {
        
        ASSERT(s);
        
        if((*s)->next)
                _gcso(&(*s)->next);
        
        if((*s)->action)
                _gc_eventaction(&(*s)->action);
        
        FREE(*s);
        
}

static void _gcmatch(Match_T *s) {
        
        ASSERT(s);
        
        if((*s)->next)
                _gcmatch(&(*s)->next);
        
        if((*s)->action)
                _gc_eventaction(&(*s)->action);
        
        FREE((*s)->match_path);
        FREE((*s)->match_string);
        
#ifdef HAVE_REGEX_H
        if((*s)->regex_comp) {
                regfree((*s)->regex_comp);
                FREE((*s)->regex_comp);
        }
#endif
        
        FREE(*s);
        
}


static void _gcchecksum(Checksum_T *s) {
        ASSERT(s);
        
        if ((*s)->action)
                _gc_eventaction(&(*s)->action);
        
        FREE(*s);
}


static void _gcperm(Perm_T *s) {
        
        ASSERT(s);
        
        if((*s)->action)
                _gc_eventaction(&(*s)->action);
        
        FREE(*s);
        
}


static void _gcprogram(Program_T *p) {
        
        ASSERT(p);
        
        if((*p)->action)
                _gc_eventaction(&(*p)->action);
        if ((*p)->P)
                Process_free(&(*p)->P);
        if ((*p)->C)
                Command_free(&(*p)->C);
        FREE(*p);
}


static void _gcuid(Uid_T *s) {
        
        ASSERT(s);
        
        if((*s)->action)
                _gc_eventaction(&(*s)->action);
        
        FREE(*s);
        
}


static void _gcgid(Gid_T *s) {
        
        ASSERT(s);
        
        if((*s)->action)
                _gc_eventaction(&(*s)->action);
        
        FREE(*s);
        
}


static void _gcpdl(Dependant_T *d) {
        
        ASSERT(d);
        
        if((*d)->next)
                _gcpdl(&(*d)->next);
        
        FREE((*d)->dependant);
        FREE(*d);
        
}


static void _gcgrc(Generic_T *g) {
        
        ASSERT(g);
        
        if((*g)->next)
                _gcgrc(&(*g)->next);
        
        FREE((*g)->send);
#ifdef HAVE_REGEX_H
        if ((*g)->expect!=NULL)
                regfree((*g)->expect);
#endif
        FREE((*g)->expect);
        FREE(*g);
        
}


static void _gcath(Auth_T *c) {
        
        ASSERT(c);
        
        if((*c)->next)
                _gcath(&(*c)->next);
        
        FREE((*c)->uname);
        FREE((*c)->passwd);
        FREE((*c)->groupname);
        FREE(*c);
        
}


static void _gc_mmonit(Mmonit_T *recv) {
        
        ASSERT(recv);
        
        if((*recv)->next)
                _gc_mmonit(&(*recv)->next);
        
        _gc_url(&(*recv)->url);
        
        FREE((*recv)->ssl.certmd5);
        FREE((*recv)->ssl.clientpemfile);
        FREE(*recv);
        
}


