/*
 * snmpvacm.c - send snmp SET requests to a network entity to change the
 *             vacm database
 *
 */
#include <net-snmp/net-snmp-config.h>

#if HAVE_STDLIB_H
#include <stdlib.h>
#endif
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#if HAVE_STRING_H
#include <string.h>
#else
#include <strings.h>
#endif
#include <sys/types.h>
#if HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#include <stdio.h>
#include <ctype.h>
#if TIME_WITH_SYS_TIME
# ifdef WIN32
#  include <sys/timeb.h>
# else
#  include <sys/time.h>
# endif
# include <time.h>
#else
# if HAVE_SYS_TIME_H
#  include <sys/time.h>
# else
#  include <time.h>
# endif
#endif
#if HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
#if HAVE_WINSOCK_H
#include <winsock.h>
#endif
#if HAVE_NETDB_H
#include <netdb.h>
#endif
#if HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif

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

int             main(int, char **);

#define CMD_CREATESEC2GROUP_NAME    "createSec2Group"
#define CMD_CREATESEC2GROUP         1
#define CMD_DELETESEC2GROUP_NAME    "deleteSec2Group"
#define CMD_DELETESEC2GROUP         2
#define CMD_CREATEACCESS_NAME    	"createAccess"
#define CMD_CREATEACCESS         	3
#define CMD_DELETEACCESS_NAME 		"deleteAccess"
#define CMD_DELETEACCESS      		4
#define CMD_CREATEVIEW_NAME 		"createView"
#define CMD_CREATEVIEW      		5
#define CMD_DELETEVIEW_NAME 		"deleteView"
#define CMD_DELETEVIEW      		6
#define CMD_CREATEAUTH_NAME     	"createAuth"
#define CMD_CREATEAUTH          	7
#define CMD_DELETEAUTH_NAME 		"deleteAuth"
#define CMD_DELETEAUTH      		8

#define CMD_NUM    8

static const char *successNotes[CMD_NUM] = {
    "Sec2group successfully created.",
    "Sec2group successfully deleted.",
    "Access successfully created.",
    "Access successfully deleted.",
    "View successfully created.",
    "View successfully deleted.",
    "AuthAccess successfully created.",
    "AuthAccess successfully deleted."
};

#define                   SEC2GROUP_OID_LEN	11
#define                   ACCESS_OID_LEN   	11
#define                   VIEW_OID_LEN    	12
#define                   AUTH_OID_LEN   	12

static oid      vacmGroupName[MAX_OID_LEN] =
    { 1, 3, 6, 1, 6, 3, 16, 1, 2, 1, 3 },
    vacmSec2GroupStorageType[MAX_OID_LEN] = {
1, 3, 6, 1, 6, 3, 16, 1, 2, 1, 4}, vacmSec2GroupStatus[MAX_OID_LEN] = {
1, 3, 6, 1, 6, 3, 16, 1, 2, 1, 5}, vacmAccessContextMatch[MAX_OID_LEN] = {
1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 4}, vacmAccessReadViewName[MAX_OID_LEN] = {
1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 5}, vacmAccessWriteViewName[MAX_OID_LEN] = {
1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 6}, vacmAccessNotifyViewName[MAX_OID_LEN] = {
1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 7}, vacmAccessStorageType[MAX_OID_LEN] = {
1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 8}, vacmAccessStatus[MAX_OID_LEN] = {
1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 9}, vacmViewTreeFamilyMask[MAX_OID_LEN] = {
1, 3, 6, 1, 6, 3, 16, 1, 5, 2, 1, 3}, vacmViewTreeFamilyType[MAX_OID_LEN] = {
1, 3, 6, 1, 6, 3, 16, 1, 5, 2, 1, 4},
    vacmViewTreeFamilyStorageType[MAX_OID_LEN] = {
1, 3, 6, 1, 6, 3, 16, 1, 5, 2, 1, 5},
    vacmViewTreeFamilyStatus[MAX_OID_LEN] = {
1, 3, 6, 1, 6, 3, 16, 1, 5, 2, 1, 6}

;

#define NSVACMACCESSTABLE    1, 3, 6, 1, 4, 1, 8072, 1, 9, 1
static oid nsVacmContextPfx[MAX_OID_LEN]  = { NSVACMACCESSTABLE, 1, 2 };
static oid nsVacmViewName[MAX_OID_LEN]    = { NSVACMACCESSTABLE, 1, 3 };
static oid nsVacmStorageType[MAX_OID_LEN] = { NSVACMACCESSTABLE, 1, 4 };
static oid nsVacmRowStatus[MAX_OID_LEN]   = { NSVACMACCESSTABLE, 1, 5 };

int             viewTreeFamilyType = 1;

void
usage(void)
{
    fprintf(stderr, "Usage: snmpvacm ");
    snmp_parse_args_usage(stderr);
    fprintf(stderr, " COMMAND\n\n");
    snmp_parse_args_descriptions(stderr);
    fprintf(stderr, "\nsnmpvacm commands:\n");
    fprintf(stderr, "        createAccess     GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL CONTEXTMATCH READVIEWNAME WRITEVIEWNAME NOTIFYVIEWNAME\n");
    fprintf(stderr, "        deleteAccess     GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL\n");
    fprintf(stderr, "        createSec2Group  MODEL SECURITYNAME  GROUPNAME\n");
    fprintf(stderr, "        deleteSec2Group  MODEL SECURITYNAME\n");
    fprintf(stderr, "  [-Ce] createView       NAME SUBTREE [MASK]\n");
    fprintf(stderr, "        deleteView       NAME SUBTREE\n");
    fprintf(stderr, "        createAuth       GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL AUTHTYPE CONTEXTMATCH VIEWNAME\n");
    fprintf(stderr, "        deleteAuth       GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL AUTHTYPE\n");
}


void
auth_oid(oid * it, size_t * len, const char *groupName,
           const char *prefix, int model, int level, const char *authtype)
{
    int             i;
    int             itIndex = AUTH_OID_LEN;

    it[itIndex++] = strlen(groupName);
    for (i = 0; i < (int) strlen(groupName); i++)
        it[itIndex++] = groupName[i];

    if (prefix) {
        *len += strlen(prefix);
        it[itIndex++] = strlen(prefix);
        for (i = 0; i < (int) strlen(prefix); i++)
            it[itIndex++] = prefix[i];
    } else
        it[itIndex++] = 0;

    it[itIndex++] = model;
    it[itIndex++] = level;

    it[itIndex++] = strlen(authtype);
    for (i = 0; i < (int) strlen(authtype); i++)
        it[itIndex++] = authtype[i];

    *len = itIndex;
}

void
access_oid(oid * it, size_t * len, const char *groupName,
           const char *prefix, int model, int level)
{
    int             i;

    int             itIndex = ACCESS_OID_LEN;

    *len = itIndex + 4 + +strlen(groupName);

    it[itIndex++] = strlen(groupName);
    for (i = 0; i < (int) strlen(groupName); i++)
        it[itIndex++] = groupName[i];

    if (prefix) {
        *len += strlen(prefix);
        it[itIndex++] = strlen(prefix);
        for (i = 0; i < (int) strlen(prefix); i++)
            it[itIndex++] = prefix[i];
    } else
        it[itIndex++] = 0;

    it[itIndex++] = model;
    it[itIndex++] = level;
}


void
sec2group_oid(oid * it, size_t * len, int model, const char *name)
{
    int             i;

    int             itIndex = SEC2GROUP_OID_LEN;

    *len = itIndex + 2 + strlen(name);

    it[itIndex++] = model;

    it[itIndex++] = strlen(name);
    for (i = 0; i < (int) strlen(name); i++)
        it[itIndex++] = name[i];
}

void
view_oid(oid * it, size_t * len, const char *viewName, char *viewSubtree)
{
    int             i;
    oid             c_oid[SPRINT_MAX_LEN];
    size_t          c_oid_length = SPRINT_MAX_LEN;

    int             itIndex = VIEW_OID_LEN;

    if (!snmp_parse_oid(viewSubtree, c_oid, &c_oid_length)) {
        printf("Error parsing subtree (%s)\n", viewSubtree);
        exit(1);
    }

    *len = itIndex + 2 + strlen(viewName) + c_oid_length;

    it[itIndex++] = strlen(viewName);
    for (i = 0; i < (int) strlen(viewName); i++)
        it[itIndex++] = viewName[i];

    
    it[itIndex++] = c_oid_length;
    for (i = 0; i < (int) c_oid_length; i++)
        it[itIndex++] = c_oid[i];

    /*
     * sprint_objid(c_oid, it, *len); 
     */
}

static void
optProc(int argc, char *const *argv, int opt)
{
    switch (opt) {
    case 'C':
        while (*optarg) {
            switch (*optarg++) {
            case 'e':
                viewTreeFamilyType = 2;
                break;

            default:
                fprintf(stderr,
                        "Unknown flag passed to -C: %c\n", optarg[-1]);
                exit(1);
            }
        }
        break;
    }
}


int
main(int argc, char *argv[])
{
    netsnmp_session session, *ss;
    netsnmp_pdu    *pdu = NULL, *response = NULL;
#ifdef notused
    netsnmp_variable_list *vars;
#endif

    int             arg;
#ifdef notused
    int             count;
    int             current_name = 0;
    int             current_type = 0;
    int             current_value = 0;
    char           *names[128];
    char            types[128];
    char           *values[128];
    oid             name[MAX_OID_LEN];
#endif
    size_t          name_length;
    int             status;
    int             exitval = 0;
    int             command = 0;
    long            longvar;
    int             secModel, secLevel, contextMatch, val, i = 0;
    char           *mask, *groupName, *prefix, *authtype;
    u_char          viewMask[VACMSTRINGLEN];
    char           *st;


    /*
     * get the common command line arguments 
     */
    switch (arg = snmp_parse_args(argc, argv, &session, "C:", optProc)) {
    case -2:
        exit(0);
    case -1:
        usage();
        exit(1);
    default:
        break;
    }


    SOCK_STARTUP;

    /*
     * open an SNMP session 
     */
    /*
     * Note:  this wil obtain the engineID needed below 
     */
    ss = snmp_open(&session);
    if (ss == NULL) {
        /*
         * diagnose snmp_open errors with the input netsnmp_session pointer 
         */
        snmp_sess_perror("snmpvacm", &session);
        exit(1);
    }

    /*
     * create PDU for SET request and add object names and values to request 
     */
    pdu = snmp_pdu_create(SNMP_MSG_SET);

    if (arg >= argc) {
        fprintf(stderr, "Please specify a operation to perform.\n");
        usage();
        exit(1);
    }

    if (strcmp(argv[arg], CMD_DELETEVIEW_NAME) == 0)
        /*
         * deleteView: delete a view
         *
         * deleteView NAME SUBTREE
         *
         */
    {
        if (++arg + 2 != argc) {
            fprintf(stderr, "You must specify the view to delete\n");
            usage();
            exit(1);
        }

        command = CMD_DELETEVIEW;
        name_length = VIEW_OID_LEN;
        view_oid(vacmViewTreeFamilyStatus, &name_length, argv[arg],
                 argv[arg + 1]);
        longvar = RS_DESTROY;
        snmp_pdu_add_variable(pdu, vacmViewTreeFamilyStatus, name_length,
                              ASN_INTEGER, (u_char *) & longvar,
                              sizeof(longvar));
    } else if (strcmp(argv[arg], CMD_CREATEVIEW_NAME) == 0)
        /*
         * createView: create a view
         *
         * createView NAME SUBTREE MASK
         *
         */
    {
        if (++arg + 2 > argc) {
            fprintf(stderr, "You must specify name, subtree and mask\n");
            usage();
            exit(1);
        }
        command = CMD_CREATEVIEW;
        name_length = VIEW_OID_LEN;
        view_oid(vacmViewTreeFamilyStatus, &name_length, argv[arg],
                 argv[arg + 1]);
        longvar = RS_CREATEANDGO;
        snmp_pdu_add_variable(pdu, vacmViewTreeFamilyStatus, name_length,
                              ASN_INTEGER, (u_char *) & longvar,
                              sizeof(longvar));
        /*
         * Mask
         */
        if (arg + 3 == argc) {
            mask = argv[arg + 2];
            for (mask = strtok_r(mask, ".:", &st); mask; mask = strtok_r(NULL, ".:", &st)) {
                if (i >= sizeof(viewMask)) {
                    printf("MASK too long\n");
                    exit(1);
                }
                if (sscanf(mask, "%x", &val) == 0) {
                    printf("invalid MASK\n");
                    exit(1);
                }
                viewMask[i] = val;
                i++;
            }
	} else {
            for (i=0 ; i < ((int)name_length+7)/8; i++)
                viewMask[i] = (u_char)0xff;
        }
        view_oid(vacmViewTreeFamilyMask, &name_length, argv[arg],
                 argv[arg + 1]);
        snmp_pdu_add_variable(pdu, vacmViewTreeFamilyMask, name_length,
                              ASN_OCTET_STR, viewMask, i);

        view_oid(vacmViewTreeFamilyType, &name_length, argv[arg],
                 argv[arg + 1]);
        snmp_pdu_add_variable(pdu, vacmViewTreeFamilyType, name_length,
                              ASN_INTEGER, (u_char *) & viewTreeFamilyType,
                              sizeof(viewTreeFamilyType));

    } else if (strcmp(argv[arg], CMD_DELETESEC2GROUP_NAME) == 0)
        /*
         * deleteSec2Group: delete security2group
         *
         * deleteSec2Group  MODEL SECURITYNAME
         *
         */
    {
        if (++arg + 2 != argc) {
            fprintf(stderr, "You must specify the sec2group to delete\n");
            usage();
            exit(1);
        }

        command = CMD_DELETESEC2GROUP;
        name_length = SEC2GROUP_OID_LEN;
        if (sscanf(argv[arg], "%d", &secModel) == 0) {
            printf("invalid security model\n");
            usage();
            exit(1);
        }
        sec2group_oid(vacmSec2GroupStatus, &name_length, secModel,
                      argv[arg + 1]);
        longvar = RS_DESTROY;
        snmp_pdu_add_variable(pdu, vacmSec2GroupStatus, name_length,
                              ASN_INTEGER, (u_char *) & longvar,
                              sizeof(longvar));
    } else if (strcmp(argv[arg], CMD_CREATESEC2GROUP_NAME) == 0)
        /*
         * createSec2Group: create a security2group
         *
         * createSec2Group  MODEL SECURITYNAME GROUPNAME
         *
         */
    {
        if (++arg + 3 != argc) {
            fprintf(stderr,
                    "You must specify model, security name and group name\n");
            usage();
            exit(1);
        }

        command = CMD_CREATESEC2GROUP;
        name_length = SEC2GROUP_OID_LEN;
        if (sscanf(argv[arg], "%d", &secModel) == 0) {
            printf("invalid security model\n");
            usage();
            exit(1);
        }
        sec2group_oid(vacmSec2GroupStatus, &name_length, secModel,
                      argv[arg + 1]);
        longvar = RS_CREATEANDGO;
        snmp_pdu_add_variable(pdu, vacmSec2GroupStatus, name_length,
                              ASN_INTEGER, (u_char *) & longvar,
                              sizeof(longvar));
        sec2group_oid(vacmGroupName, &name_length, secModel,
                      argv[arg + 1]);
        snmp_pdu_add_variable(pdu, vacmGroupName, name_length,
                              ASN_OCTET_STR, (u_char *) argv[arg + 2],
                              strlen(argv[arg + 2]));
    } else if (strcmp(argv[arg], CMD_DELETEACCESS_NAME) == 0)
        /*
         * deleteAccess: delete access entry
         *
         * deleteAccess  GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL
         *
         */
    {
        if (++arg + 3 > argc) {
            fprintf(stderr,
                    "You must specify the access entry to delete\n");
            usage();
            exit(1);
        }

        command = CMD_DELETEACCESS;
        name_length = ACCESS_OID_LEN;
        groupName = argv[arg];
        if (arg + 4 == argc)
            prefix = argv[++arg];
        else
            prefix = NULL;

        if (sscanf(argv[arg + 1], "%d", &secModel) == 0) {
            printf("invalid security model\n");
            usage();
            exit(1);
        }
        if (sscanf(argv[arg + 2], "%d", &secLevel) == 0) {
            printf("invalid security level\n");
            usage();
            exit(1);
        }
        access_oid(vacmAccessStatus, &name_length, groupName, prefix,
                   secModel, secLevel);
        longvar = RS_DESTROY;
        snmp_pdu_add_variable(pdu, vacmAccessStatus, name_length,
                              ASN_INTEGER, (u_char *) & longvar,
                              sizeof(longvar));
    } else if (strcmp(argv[arg], CMD_CREATEACCESS_NAME) == 0)
        /*
         * createAccess: create access entry
         *
         * createAccess  GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL CONTEXTMATCH READVIEWNAME WRITEVIEWNAME NOTIFYVIEWNAME
         *
         */
    {
        if (++arg + 7 > argc) {
            fprintf(stderr,
                    "You must specify the access entry to create\n");
            usage();
            exit(1);
        }

        command = CMD_CREATEACCESS;
        name_length = ACCESS_OID_LEN;
        groupName = argv[arg];
        if (arg + 8 == argc)
            prefix = argv[++arg];
        else
            prefix = NULL;

        if (sscanf(argv[arg + 1], "%d", &secModel) == 0) {
            printf("invalid security model\n");
            usage();
            exit(1);
        }
        if (sscanf(argv[arg + 2], "%d", &secLevel) == 0) {
            printf("invalid security level\n");
            usage();
            exit(1);
        }
        access_oid(vacmAccessStatus, &name_length, groupName, prefix,
                   secModel, secLevel);
        longvar = RS_CREATEANDGO;
        snmp_pdu_add_variable(pdu, vacmAccessStatus, name_length,
                              ASN_INTEGER, (u_char *) & longvar,
                              sizeof(longvar));

        access_oid(vacmAccessContextMatch, &name_length, groupName, prefix,
                   secModel, secLevel);
        if (sscanf(argv[arg + 3], "%d", &contextMatch) == 0) {
            printf("invalid contextMatch\n");
            usage();
            exit(1);
        }
        snmp_pdu_add_variable(pdu, vacmAccessContextMatch, name_length,
                              ASN_INTEGER, (u_char *) & contextMatch,
                              sizeof(contextMatch));

        access_oid(vacmAccessReadViewName, &name_length, groupName, prefix,
                   secModel, secLevel);
        snmp_pdu_add_variable(pdu, vacmAccessReadViewName, name_length,
                              ASN_OCTET_STR, (u_char *) argv[arg + 4],
                              strlen(argv[arg + 4]));

        access_oid(vacmAccessWriteViewName, &name_length, groupName,
                   prefix, secModel, secLevel);
        snmp_pdu_add_variable(pdu, vacmAccessWriteViewName, name_length,
                              ASN_OCTET_STR, (u_char *) argv[arg + 5],
                              strlen(argv[arg + 5]));

        access_oid(vacmAccessNotifyViewName, &name_length, groupName,
                   prefix, secModel, secLevel);
        snmp_pdu_add_variable(pdu, vacmAccessNotifyViewName, name_length,
                              ASN_OCTET_STR, (u_char *) argv[arg + 6],
                              strlen(argv[arg + 6]));
    } else if (strcmp(argv[arg], CMD_DELETEAUTH_NAME) == 0)
        /*
         * deleteAuth: delete authAccess entry
         *
         * deleteAuth  GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL AUTHTYPE
         *
         */
    {
        if (++arg + 4 > argc) {
            fprintf(stderr,
                    "You must specify the authAccess entry to delete\n");
            usage();
            exit(1);
        }

        command = CMD_DELETEAUTH;
        name_length = AUTH_OID_LEN;
        groupName = argv[arg];
        if (arg + 5 == argc)
            prefix = argv[++arg];
        else
            prefix = NULL;

        if (sscanf(argv[arg + 1], "%d", &secModel) == 0) {
            printf("invalid security model\n");
            usage();
            exit(1);
        }
        if (sscanf(argv[arg + 2], "%d", &secLevel) == 0) {
            printf("invalid security level\n");
            usage();
            exit(1);
        }
        authtype = argv[arg+3];
        auth_oid(nsVacmRowStatus, &name_length, groupName, prefix,
                   secModel, secLevel, authtype);
        longvar = RS_DESTROY;
        snmp_pdu_add_variable(pdu, nsVacmRowStatus, name_length,
                              ASN_INTEGER, (u_char *) & longvar,
                              sizeof(longvar));
    } else if (strcmp(argv[arg], CMD_CREATEAUTH_NAME) == 0)
        /*
         * createAuth: create authAccess entry
         *
         * createAuth  GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL AUTHTYPE CONTEXTMATCH VIEWNAME
         *
         */
    {
        if (++arg + 6 > argc) {
            fprintf(stderr,
                    "You must specify the authAccess entry to create\n");
            usage();
            exit(1);
        }

        command = CMD_CREATEAUTH;
        name_length = AUTH_OID_LEN;
        groupName = argv[arg];
        if (arg + 7 == argc)
            prefix = argv[++arg];
        else
            prefix = NULL;

        if (sscanf(argv[arg + 1], "%d", &secModel) == 0) {
            printf("invalid security model\n");
            usage();
            exit(1);
        }
        if (sscanf(argv[arg + 2], "%d", &secLevel) == 0) {
            printf("invalid security level\n");
            usage();
            exit(1);
        }
        authtype = argv[arg+3];
        auth_oid(nsVacmRowStatus, &name_length, groupName, prefix,
                   secModel, secLevel, authtype);
        longvar = RS_CREATEANDGO;
        snmp_pdu_add_variable(pdu, nsVacmRowStatus, name_length,
                              ASN_INTEGER, (u_char *) & longvar,
                              sizeof(longvar));

        auth_oid(nsVacmContextPfx, &name_length, groupName, prefix,
                   secModel, secLevel, authtype);
        if (sscanf(argv[arg + 4], "%d", &contextMatch) == 0) {
            printf("invalid contextMatch\n");
            usage();
            exit(1);
        }
        snmp_pdu_add_variable(pdu, nsVacmContextPfx, name_length,
                              ASN_INTEGER, (u_char *) & contextMatch,
                              sizeof(contextMatch));

        auth_oid(nsVacmViewName, &name_length, groupName, prefix,
                   secModel, secLevel, authtype);
        snmp_pdu_add_variable(pdu, nsVacmViewName, name_length,
                              ASN_OCTET_STR, (u_char *) argv[arg + 5],
                              strlen(argv[arg + 5]));
    } else {
        printf("Unknown command\n");
        usage();
        exit(1);
    }

    /*
     * do the request 
     */
    status = snmp_synch_response(ss, pdu, &response);
    if (status == STAT_SUCCESS) {
        if (response) {
            if (response->errstat == SNMP_ERR_NOERROR) {
                fprintf(stderr, "%s\n", successNotes[command - 1]);
            } else {
                fprintf(stderr, "Error in packet.\nReason: %s\n",
                        snmp_errstring(response->errstat));
		if (response->errindex != 0){
		    int count;
		    struct variable_list *vars = response->variables;
		    fprintf(stderr, "Failed object: ");
		    for(count = 1; vars && (count != response->errindex);
			    vars = vars->next_variable, count++)
			;
		    if (vars)
			fprint_objid(stderr, vars->name, vars->name_length);
		    fprintf(stderr, "\n");
		}
                exitval = 2;
            }
        }
    } else if (status == STAT_TIMEOUT) {
        fprintf(stderr, "Timeout: No Response from %s\n",
                session.peername);
        exitval = 1;
    } else {
        snmp_sess_perror("snmpset", ss);
        exitval = 1;
    }

    if (response)
        snmp_free_pdu(response);

    snmp_close(ss);
    SOCK_CLEANUP;
    return exitval;
}
