mib2c를 이용하여 만든 소스에서 table값을 초기화 하려고 하는데 잘 안됩니다.

bakdorazi의 이미지

제가 snmp테스트용으로 MIB을 만들고 그 MIB을 가지고 mib2c를 이용하여 소스를 생성하였습니다.
아래는 소스 일부입니다.

/** Initializes the exam module */
 
char *firstname[] = {"choi", "kim", "lee", "kang", "han"};
 
//일단 테이블의 entry는 아래와 같습니다. 간단하게 name, num1, num2 입니다.
struct examNEXTable_entry {
 
    char            name;
    char            old_name;
    long            num1;
    long            old_num1;
    long            num2;
    long            old_num2;
 
    int             valid;
    struct examNEXTable_entry *next;
};
 
struct examNEXTable_entry *examNEXTable_head;
 
// create a new row in the (unsorted) table 
//저는 여기를 테이블의 entry를 생성하는 함수라고 생각했습니다. 그리하여 제 나름대로의 함수값을 넣어줍니다.
 
struct examNEXTable_entry *examNEXTable_createEntry(char *fname, int i)
{
    struct examNEXTable_entry *entry;
 
    entry = SNMP_MALLOC_TYPEDEF(struct examNEXTable_entry);
    if (!entry)
        return NULL;
 
    entry->name = *fname;
    entry->num1= i;
    entry->num2= i;
    entry->next = examNEXTable_head;
    examNEXTable_head = entry;
    return entry;
}
 
 
 
char *getname(int i)
{
        return firstname[i];
 
}
 
void firstval(void)
{
        struct examNEXTable_entry *tmpentry;
        char *fname;
        int i;
        for(i=0; i < 5; i++) {
                fname = getname(i);
                tmpentry = examNEXTable_createEntry(fname, i);
                tmpentry->valid=1;
        }
}
 
 
void initialize_table_examNEXTable(void)
{
    static oid      examNEXTable_oid[] = { 1, 3, 6, 1, 4, 1, 50000, 3 };
    size_t          examNEXTable_oid_len = OID_LENGTH(examNEXTable_oid);
    netsnmp_handler_registration *reg;
    netsnmp_iterator_info *iinfo;
    netsnmp_table_registration_info *table_info;
 
    reg = netsnmp_create_handler_registration("examNEXTable",
                                            examNEXTable_handler,
                                            examNEXTable_oid,
                                            examNEXTable_oid_len,
                                            HANDLER_CAN_RWRITE);
 
    table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
    netsnmp_table_helper_add_indexes(table_info, 0);
    table_info->min_column = COLUMN_NAME;
    table_info->max_column = COLUMN_NUM2;
 
    iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
    iinfo->get_first_data_point = examNEXTable_get_first_data_point;
    iinfo->get_next_data_point = examNEXTable_get_next_data_point;
    iinfo->table_reginfo = table_info;
 
    netsnmp_register_table_iterator(reg, iinfo);
 
 //  Initialise the contents of the table herete a new row in the (unsorted) table 
// 여기에 테이블을 초기화 하여 생성하는 함수를 넣어주었습니다.
     firstval();
}
 
//여기는 net-snmp가 get/set 등의 명령에 대하여 값을 넘겨주는 부분입니다.
int examNEXTable_handler(netsnmp_mib_handler *handler,
                     netsnmp_handler_registration *reginfo,
                     netsnmp_agent_request_info *reqinfo,
                     netsnmp_request_info *requests)
{
 
    netsnmp_request_info *request;
    netsnmp_table_request_info *table_info;
    struct examNEXTable_entry *table_entry;
    int len;
    char strval[128];
 
    switch (reqinfo->mode) {
        /*
         * Read-support (also covers GetNext requests)
         */
//GET 명령이 왔을때 처리해 주는 부분입니다.
    case MODE_GET:
        for (request = requests; request; request = request->next) {
            table_entry = (struct examNEXTable_entry *)
                netsnmp_extract_iterator_context(request);
            table_info = netsnmp_extract_table_info(request);
 
            switch (table_info->colnum) {
 
                case COLUMN_NAME:
                    sprintf(strval, "a");
                    len = strlen((char*)strval);
 
                    if (!table_entry) {
                       netsnmp_set_request_error(reqinfo, request,
                                              SNMP_NOSUCHINSTANCE);
                       continue;
                    }
                    //아래의 함수가 GET요청이 들어왔을때 값을 전달해 주는 부분입니다.
                    <span>snmp_set_var_typed_value</span>(request->requestvb, ASN_OCTET_STR,
                                        (u_char *)table_entry->name, sizeof(table_entry->name));
                 break;
 
               case COLUMN_NUM1:
                    if (!table_entry) {
                       netsnmp_set_request_error(reqinfo, request,
                                              SNMP_NOSUCHINSTANCE);
                       continue;
                    }
                    snmp_set_var_typed_value(request->requestvb, ASN_INTEGER,
                                         (u_char*)&table_entry->num1 , sizeof(table_entry->num1));
                    break;

저는 대충 소스를 위와 같이 하였습니다.
위의 소스를 컴파일 하였을때 아래와 같은 경고가 뜹니다.
단순히 하나의 경고 이므로 실행파일은 무사히 만들어 졌습니다.

[root@localhost Test]# net-snmp-config --compile-subagent nex exam.c
generating the tmporary code file: netsnmptmp.3961.c
void            init_exam(void);
checking for init_exam in exam.c
init_exam(void)
running: gcc  -g -O2 -Dlinux -I/usr/include/rpm  -I. -I/usr/local/include -o nex netsnmptmp.3961.c  exam.c  -L/usr/local/lib -lnetsnmpmibs -lnetsnmpagent -lnetsnmphelpers -lnetsnmp -ldl -lrpm -lrpmio -lpopt  -lz -lcrypto -lm    
exam.c: In function ‘examNEXTable_handler’:
exam.c:241: warning: cast to pointer from integer of different size
removing the tmporary code file: netsnmptmp.3961.c
subagent program nex created

그러나 그 실행파일을 실행해 보면 실제로 리턴되는 값이 없습니다.

[root@localhost Test]# ./nex &
[1] 3985
[root@localhost Test]# NET-SNMP version 5.3.3 AgentX subagent connected
 
[root@localhost Test]# snmpwalk -v 1 -c public localhost exam
improperly registered table found
name: table, table info: 0x828ee88, indexes: (nil)
improperly registered table found
name: table, table info: 0x828ee88, indexes: (nil)
Error in packet.
Reason: (genError) A general failure occured
<span>Failed object: NEXCOMM-EXAM-MIB::exam</span>

소스를 가만히 뜯어 보아도 잘 몰라서 여기다 올립니다.
월요일까지 해야 하는 일입니다.
좀 도와주세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.