#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>

#include <stdio.h>
#include <strings.h>

#define TRAP_XNOF_SESSION_4         4

#define SNMP_SST_IDLE               0
#define SNMP_SST_CREATED            1

#define IP4800_NO_FFFF              0XFFFF

#define XSZ_SNMP_COMM_64 64

#define SNMP_FIND_FREE_TRAP_SESS_IX(free_sess_ix)\
{\
   u_short ii;\
   for(ii=0; ii<TRAP_XNOF_SESSION_4 ;ii++)\
      { if(trap_sess_tab[ii].st == SNMP_SST_IDLE) break;  }\
   if (ii== TRAP_XNOF_SESSION_4 )\
      free_sess_ix = IP4800_NO_FFFF;\
   else\
      free_sess_ix = ii;\
}\

void init_agent_read_config(const char *app);
void snmpd_parse_config_trapsink(const char *token, char *cptr);
void snmpd_parse_config_trap2sink(const char *word, char *cptr);

char           *snmp_trapcommunity = NULL;

struct  _SNMP_trap_session
{
    u_short     st;
    u_int       mger_ip;
    u_short     dport;    
    u_short     version;
    u_short     comm_len;
    u_char      comm[XSZ_SNMP_COMM_64]; //#define XSZ_SNMP_COMM_64 64
};

struct  _SNMP_trap_session    trap_sess_tab[TRAP_XNOF_SESSION_4];	

int main(void)
{
     printf("parse snmpd.conf\n");
     
     init_agent_read_config("snmpd");
     init_snmp("snmpd");

     return 1;
}


void
init_agent_read_config(const char *app)
{
    if (app != NULL) {
        netsnmp_ds_set_string(NETSNMP_DS_LIBRARY_ID, 
			      NETSNMP_DS_LIB_APPTYPE, app);
    } else {
        app = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, 
				    NETSNMP_DS_LIB_APPTYPE);
           }
 
    register_app_config_handler("trapsink",
                                snmpd_parse_config_trapsink, 
                                NULL, NULL);
    register_app_config_handler("trap2sink",
                                snmpd_parse_config_trap2sink, 
                                NULL, NULL);
/*******************************************************************************************************
    register_app_config_handler("informsink",
                                snmpd_parse_config_informsink, 
                                NULL, NULL);
*********************************************************************************************************/
    
}
    

void
snmpd_parse_config_trapsink(const char *token, char *cptr)
{
    char            tmpbuf[1024];
    char            *sp, *cp, *pp = NULL;
    u_short         sinkport;
    u_short         free_sess_ix;

    if (!snmp_trapcommunity)
        snmp_trapcommunity = strdup("public");
    sp = strtok(cptr, " \t\n");
    cp = strtok(NULL, " \t\n");
    if (cp)
        pp = strtok(NULL, " \t\n");
    if (cp && pp) {
        sinkport = atoi(pp);
        if ((sinkport < 1) || (sinkport > 0xffff)) {
            printf("trapsink port out of range");
            sinkport = SNMP_TRAP_PORT; //UDP PORT: 162
                      }
    } else {
        sinkport = SNMP_TRAP_PORT;
           }   
        
    snprintf(tmpbuf, sizeof(tmpbuf), "cannot create trapsink: %s", cptr);
    tmpbuf[sizeof(tmpbuf)-1] = '\0';

    SNMP_FIND_FREE_TRAP_SESS_IX(free_sess_ix)
    if( free_sess_ix == IP4800_NO_FFFF)
           {
       printf("NO free_sess_ix\n");  
       return;
           }

    //trap_sess_tab[free_sess_ix].st     	
    //trap_sess_tab[free_sess_ix].mger_ip
    //trap_sess_tab[free_sess_ix].comm_ix
    //trap_sess_tab[free_sess_ix].dport
    //trap_sess_tab[free_sess_ix].version
    //trap_sess_tab[free_sess_ix].comm_len
    //trap_sess_tab[free_sess_ix].comm

    
        
}


void
snmpd_parse_config_trap2sink(const char *word, char *cptr)
{
    char            tmpbuf[1024];
    char            *sp, *cp, *pp = NULL;
    u_short         sinkport;

    if (!snmp_trapcommunity)
        snmp_trapcommunity = strdup("public");
    sp = strtok(cptr, " \t\n");
    cp = strtok(NULL, " \t\n");
    if (cp)
        pp = strtok(NULL, " \t\n");
    if (cp && pp) {
        sinkport = atoi(pp);
        if ((sinkport < 1) || (sinkport > 0xffff)) {
            printf("trapsink port out of range");
            sinkport = SNMP_TRAP_PORT;
                      }
    } else {
        sinkport = SNMP_TRAP_PORT;
           }

    snprintf(tmpbuf, sizeof(tmpbuf), "cannot create trap2sink: %s", cptr);
    tmpbuf[sizeof(tmpbuf)-1] = '\0';

    //trap_sess_tab[free_sess_ix].st     	
    //trap_sess_tab[free_sess_ix].mger_ip
    //trap_sess_tab[free_sess_ix].comm_ix
    //trap_sess_tab[free_sess_ix].dport
    //trap_sess_tab[free_sess_ix].version
    //trap_sess_tab[free_sess_ix].comm_len
    //trap_sess_tab[free_sess_ix].comm

}

/**********************************************************************************************
void
snmpd_parse_config_informsink(const char *word, char *cptr)
{
    char            tmpbuf[1024];
    char           *sp, *cp, *pp = NULL;
    u_short         sinkport;

    if (!snmp_trapcommunity)
        snmp_trapcommunity = strdup("public");
    sp = strtok(cptr, " \t\n");
    cp = strtok(NULL, " \t\n");
    if (cp)
        pp = strtok(NULL, " \t\n");
    if (cp && pp) {
        sinkport = atoi(pp);
        if ((sinkport < 1) || (sinkport > 0xffff)) {
            config_perror("trapsink port out of range");
            sinkport = SNMP_TRAP_PORT;
        }
    } else {
        sinkport = SNMP_TRAP_PORT;
    }
    if (create_v2_inform_session(sp, sinkport,
                                 cp ? cp : snmp_trapcommunity) == 0) {
        snprintf(tmpbuf, sizeof(tmpbuf), "cannot create informsink: %s", cptr);
        tmpbuf[sizeof(tmpbuf)-1] = '\0';
        config_perror(tmpbuf);
    }
}
****************************************************************************************************/
