⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rows.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
📖 第 1 页 / 共 2 页
字号:
         * VALID when entry doesn't exit, in this case PDU has to have         * the nessessary & valid set of non-default values          */        if (table_ptr->ClbkValidate) {            return table_ptr->ClbkValidate(eptr);        }        break;    case RMON1_ENTRY_UNDER_CREATION:        /*         * Our MIB understanding extension: we permit to travel from          * VALID to 'UNDER_CREATION' state          */        break;    }    return SNMP_ERR_NOERROR;}intROWAPI_commit(TABLE_DEFINTION_T * table_ptr, u_long ctrl_index){    register RMON_ENTRY_T *eptr;    eptr = ROWAPI_find(table_ptr, ctrl_index);    if (!eptr) {        ag_trace("Smth wrong ?");        return SNMP_ERR_GENERR;    }    eptr->only_just_created = 0;    switch (eptr->new_status) { /* this status we want to set */    case RMON1_ENTRY_CREATE_REQUEST:   /* copy tmp => eprt */        if (eptr->new_owner) {            if (eptr->owner)                AGFREE(eptr->owner);            eptr->owner = AGSTRDUP(eptr->new_owner);        }        if (table_ptr->ClbkCopy && eptr->tmp)            table_ptr->ClbkCopy(eptr);        break;    case RMON1_ENTRY_INVALID:        ROWAPI_delete_clone(table_ptr, ctrl_index);        rowapi_delete(eptr);#if 0                           /* for debug */        dbg_f_AG_MEM_REPORT();#endif        break;    case RMON1_ENTRY_VALID:    /* copy tmp => eprt and activate */        /*         * Our MIB understanding extension: we permit to set         * VALID when entry doesn't exit, in this case PDU has to have         * the nessessary & valid set of non-default values          */        if (eptr->new_owner) {            if (eptr->owner)                AGFREE(eptr->owner);            eptr->owner = AGSTRDUP(eptr->new_owner);        }        if (table_ptr->ClbkCopy && eptr->tmp)            table_ptr->ClbkCopy(eptr);        if (RMON1_ENTRY_VALID != eptr->status) {            rowapi_activate(table_ptr, eptr);        }        break;    case RMON1_ENTRY_UNDER_CREATION:   /* deactivate (if need) and copy tmp => eprt */        /*         * Our MIB understanding extension: we permit to travel from         * VALID to 'UNDER_CREATION' state          */        rowapi_deactivate(table_ptr, eptr);        if (eptr->new_owner) {            if (eptr->owner)                AGFREE(eptr->owner);            eptr->owner = AGSTRDUP(eptr->new_owner);        }        if (table_ptr->ClbkCopy && eptr->tmp)            table_ptr->ClbkCopy(eptr);        break;    }    ROWAPI_delete_clone(table_ptr, ctrl_index);    return SNMP_ERR_NOERROR;}RMON_ENTRY_T   *ROWAPI_header_ControlEntry(struct variable * vp, oid * name,                           size_t * length, int exact,                           size_t * var_len,                           TABLE_DEFINTION_T * table_ptr,                           void *entry_ptr, size_t entry_size){    long            ctrl_index;    RMON_ENTRY_T   *hdr = NULL;    if (0 != AGUTIL_advance_index_name(vp, name, length, exact)) {        ag_trace("cannot advance_index_name");        return NULL;    }    ctrl_index = vp->namelen >= *length ? 0 : name[vp->namelen];    if (exact) {        if (ctrl_index)            hdr = ROWAPI_find(table_ptr, ctrl_index);    } else {        if (ctrl_index)            hdr = ROWAPI_next(table_ptr, ctrl_index);        else            hdr = ROWAPI_first(table_ptr);        if (hdr) {              /* set new index */            name[vp->namelen] = hdr->ctrl_index;            *length = vp->namelen + 1;        }    }    if (hdr)        memcpy(entry_ptr, hdr->body, entry_size);    return hdr;}intROWAPI_do_another_action(oid * name, int tbl_first_index_begin,                         int action, int *prev_action,                         TABLE_DEFINTION_T * table_ptr, size_t entry_size){    long            long_temp;    RMON_ENTRY_T   *tmp;    if (action == *prev_action)        return SNMP_ERR_NOERROR;        /* I want to process it only once ! */    *prev_action = action;    long_temp = name[tbl_first_index_begin];    switch (action) {    case RESERVE1:        tmp = ROWAPI_get_clone(table_ptr, long_temp, entry_size);        if (!tmp) {            ag_trace("RESERVE1: cannot get clone\n");            return SNMP_ERR_TOOBIG;        }        break;    case FREE:                 /* if RESERVEx failed: release any resources that have been allocated */    case UNDO:                 /* if ACTION failed: release any resources that have been allocated */        ROWAPI_delete_clone(table_ptr, long_temp);        break;    case ACTION:        long_temp = ROWAPI_action_check(table_ptr, long_temp);        if (0 != long_temp)            return long_temp;        break;    case COMMIT:        long_temp = ROWAPI_commit(table_ptr, long_temp);        if (0 != long_temp)     /* it MUST NOT be */            return long_temp;        break;    default:        ag_trace("Unknown action %d", (int) action);        return SNMP_ERR_GENERR;    }                           /* of switch by actions */    return SNMP_ERR_NOERROR;}/* * data tables API section  */intROWDATAAPI_init(SCROLLER_T * scrlr,                u_long data_requested,                u_long max_number_of_entries,                size_t data_size,                int (*data_destructor) (struct data_scroller *, void *)){    scrlr->data_granted = 0;    scrlr->data_created = 0;    scrlr->data_total_number = 0;    scrlr->first_data_ptr =        scrlr->last_data_ptr = scrlr->current_data_ptr = NULL;    scrlr->max_number_of_entries = max_number_of_entries;    scrlr->data_size = data_size;    scrlr->data_destructor = data_destructor;    ROWDATAAPI_set_size(scrlr, data_requested, 0);    return 0;}static intdelete_data_entry(SCROLLER_T * scrlr, void *delete_me){    NEXTED_PTR_T   *data_ptr = delete_me;    register NEXTED_PTR_T *tmp;    if (data_ptr == scrlr->first_data_ptr) {        scrlr->first_data_ptr = data_ptr->next;        if (data_ptr == scrlr->last_data_ptr)            scrlr->last_data_ptr = NULL;    } else {                    /* not first */        for (tmp = scrlr->first_data_ptr; tmp; tmp = tmp->next) {            if (tmp->next == data_ptr) {                if (data_ptr == scrlr->last_data_ptr)                    scrlr->last_data_ptr = tmp;                tmp->next = data_ptr->next;                break;            }        }                       /* for */    }                           /* not first */    if (data_ptr == scrlr->current_data_ptr)        scrlr->current_data_ptr = data_ptr->next;    if (scrlr->data_destructor)        scrlr->data_destructor(scrlr, data_ptr);    AGFREE(data_ptr);    scrlr->data_created--;    scrlr->data_stored--;    return 0;}static voidrealloc_number_of_data(SCROLLER_T * scrlr, long dlong){    void           *bptr;       /* DATA_ENTRY_T */    NEXTED_PTR_T   *prev = NULL;    void           *first = NULL;    if (dlong > 0) {        for (; dlong; dlong--, prev = bptr, scrlr->data_created++) {            bptr = AGMALLOC(scrlr->data_size);            if (!bptr) {                ag_trace("Err: no memory for data");                break;            }            memset(bptr, 0, scrlr->data_size);            if (prev)                prev->next = bptr;            else                first = bptr;        }                       /* of loop by malloc bucket */        if (!scrlr->current_data_ptr)            scrlr->current_data_ptr = first;        if (scrlr->last_data_ptr) {            scrlr->last_data_ptr->next = first;        } else            scrlr->first_data_ptr = first;        scrlr->last_data_ptr = bptr;    } else {        for (; dlong && scrlr->data_created > 0; dlong++) {            if (scrlr->current_data_ptr)                delete_data_entry(scrlr, scrlr->current_data_ptr);            else                delete_data_entry(scrlr, scrlr->first_data_ptr);        }    }}voidROWDATAAPI_set_size(SCROLLER_T * scrlr,                    u_long data_requested, u_char do_allocation){    long            dlong;    scrlr->data_requested = data_requested;    scrlr->data_granted = (data_requested < scrlr->max_number_of_entries) ?        data_requested : scrlr->max_number_of_entries;    if (do_allocation) {        dlong = (long) scrlr->data_granted - (long) scrlr->data_created;        realloc_number_of_data(scrlr, dlong);    }}voidROWDATAAPI_descructor(SCROLLER_T * scrlr){    register NEXTED_PTR_T *bptr;    register void  *next;    for (bptr = scrlr->first_data_ptr; bptr; bptr = next) {        next = bptr->next;        if (scrlr->data_destructor)            scrlr->data_destructor(scrlr, bptr);        AGFREE(bptr);    }    scrlr->data_created = 0;    scrlr->data_granted = 0;    scrlr->first_data_ptr =        scrlr->last_data_ptr = scrlr->current_data_ptr = NULL;}void           *ROWDATAAPI_locate_new_data(SCROLLER_T * scrlr){    register NEXTED_PTR_T *bptr;    if (!scrlr->current_data_ptr) {     /* there was wrap */        bptr = scrlr->first_data_ptr;        if (!bptr) {            ag_trace("Err: SCROLLER_T:locate_new_data: internal error :(");            return NULL;        }        scrlr->first_data_ptr = bptr->next;        scrlr->last_data_ptr->next = bptr;        scrlr->last_data_ptr = (NEXTED_PTR_T *) bptr;        bptr->next = 0;    } else {        bptr = scrlr->current_data_ptr;        scrlr->current_data_ptr = bptr->next;        ++scrlr->data_stored;    }    scrlr->data_total_number++;    return bptr;}u_longROWDATAAPI_get_total_number(SCROLLER_T * scrlr){    return scrlr->data_total_number;}RMON_ENTRY_T   *ROWDATAAPI_header_DataEntry(struct variable * vp, oid * name,                            size_t * length, int exact,                            size_t * var_len,                            TABLE_DEFINTION_T * table_ptr,                            SCROLLER_T * (*extract_scroller) (void *body),                            size_t data_size, void *entry_ptr){    long            ctrl_indx, data_index;    RMON_ENTRY_T   *hdr = NULL;    SCROLLER_T     *scrlr;    NEXTED_PTR_T   *bptr = NULL;    register u_long iii;    if (0 != AGUTIL_advance_index_name(vp, name, length, exact)) {        ag_trace("cannot advance_index_name");        return NULL;    }    ctrl_indx = vp->namelen >= *length ? 0 : name[vp->namelen];    if (ctrl_indx)        data_index =            ((int)(vp->namelen + 1) >= (int)*length) ? 0 : name[vp->namelen + 1];    else        data_index = 0;    if (exact) {        if (ctrl_indx && data_index) {            hdr = ROWAPI_find(table_ptr, ctrl_indx);            if (hdr) {                scrlr = extract_scroller(hdr->body);                bptr = scrlr->first_data_ptr;                for (iii = 0; iii < scrlr->data_stored && bptr;                     iii++, bptr = bptr->next) {                    if ((long)bptr->data_index == data_index)                        break;                }                if (!bptr)                    hdr = NULL;            }        }    } else {        if (ctrl_indx)            hdr = ROWAPI_find(table_ptr, ctrl_indx);        else            hdr = ROWAPI_first(table_ptr);        if (hdr) {            scrlr = extract_scroller(hdr->body);            /*             * ag_trace ("get next after (%d %d)", (int) ctrl_indx, (int) data_index);              */            bptr = scrlr->first_data_ptr;            for (iii = 0; iii < scrlr->data_stored && bptr;                 iii++, bptr = bptr->next) {                if (bptr->data_index && (long)bptr->data_index > data_index)                    break;            }            if (bptr && (long)bptr->data_index <= data_index)                bptr = NULL;            if (!bptr) {        /* travel to next row */                /*                 * ag_trace ("Dbg: travel to next row");                  */                for (hdr = hdr->next; hdr; hdr = hdr->next) {                    if (RMON1_ENTRY_VALID != hdr->status)                        continue;                    scrlr = extract_scroller(hdr->body);                    if (scrlr->data_stored <= 0)                        continue;                    for (bptr = scrlr->first_data_ptr; bptr;                         bptr = bptr->next) {                        if (bptr->data_index)                            break;                    }                    if (bptr)                        break;                }            }            if (bptr) {         /* set new index */                /*                 * ag_trace ("Dbg: So (%d %d)", (int) hdr->index, (int) bptr->data_index);                  */                name[vp->namelen] = hdr->ctrl_index;                name[vp->namelen + 1] = bptr->data_index;                *length = vp->namelen + 2;            } else                hdr = NULL;        }    }    if (hdr)        memcpy(entry_ptr, bptr, data_size);    return hdr;}voidinit_rows(void){}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -