/* sapd: main.c */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include "sapmanager.h"
#include "sapbtlistener.h"

#include "capabilityagent.h"
#include "hostmanageragent.h"

static int signal_init(int signum, void (*fn)(int));
static void sigint(int signum);
volatile int sigint_flag=0;

int main(int argc, char *argv[])
{
        sap_manager *manager;
        sap_listener *listener;
	capability_agent *agent;
        char *bt_address;

        if(argc!=2 || strcmp(argv[argc-1],"--help")==0) {
                printf("Syntax: %s bt_address\n",argv[0]);
                return(1);
        }

        if((manager=sap_manager_new())==NULL) {
                printf("ERROR: Couldn't initialize sap manager\n");
                return(2);
        }

        if((agent=capability_agent_new(manager))==NULL) {
                printf("ERROR: Couldn't initialize sap capability agent\n");
                sap_manager_free(manager),manager=NULL;
                return(3);
        }
        host_manager_agent_register_services(manager);

        if((listener=sap_listener_new())==NULL) {
                printf("ERROR: Couldn't initialize sap listener\n");
                capability_agent_free(agent),agent=NULL;
                sap_manager_free(manager),manager=NULL;
                return(4);
        }

        bt_address=argv[1];

        sap_listener_start(listener);
        sap_listener_nudge(listener,bt_address);

        sigint_flag=0;
        signal_init(SIGINT,sigint);
        while(!sigint_flag) {
                sap_manager_loop(manager,0);
                sap_listener_loop(listener,100);
        }
        sap_listener_free(listener),listener=NULL;
        capability_agent_free(agent),agent=NULL;
        sap_manager_free(manager),manager=NULL;
        return(0);
}

static int
signal_init(int signum, void (*fn)(int))
{
        struct sigaction sa;
        sa.sa_handler=fn;
        sigemptyset(&sa.sa_mask);
        sa.sa_flags=0;
        return(sigaction(signum,&sa,0));
}

static void
sigint(int signum)
{
        sigint_flag=1;
}