Lines Matching refs:work
106 struct work { struct
107 TAILQ_ENTRY(work) link;
110 TAILQ_HEAD(worklist, work); argument
145 table_free(struct tabwork *work, int all) in table_free() argument
147 struct work *w; in table_free()
152 while ((w = TAILQ_FIRST(&work->worklist)) != NULL) { in table_free()
153 TAILQ_REMOVE(&work->worklist, w, link); in table_free()
160 while ((e = TAILQ_FIRST(work->table)) != NULL) { in table_free()
161 for (i = 0; work->descr->entries[i].syntax != SNMP_SYNTAX_NULL; in table_free()
163 d = &work->descr->entries[i]; in table_free()
169 TAILQ_REMOVE(work->table, e, link); in table_free()
179 table_find(struct tabwork *work, const struct asn_oid *var) in table_find() argument
182 struct work *w, *w1; in table_find()
189 asn_slice_oid(&oid, var, work->descr->table.len + 2, var->len); in table_find()
191 e = TAILQ_FIRST(work->table); in table_find()
192 w = TAILQ_FIRST(&work->worklist); in table_find()
201 if ((e = malloc(work->descr->entry_size)) == NULL) { in table_find()
211 memset(e, 0, work->descr->entry_size); in table_find()
214 p = work->descr->table.len + 2; in table_find()
215 for (i = 0; i < work->descr->index_size; i++) { in table_find()
216 switch (work->descr->entries[i].syntax) { in table_find()
229 work->descr->entries[i].offset) = var->subs[p++]; in table_find()
260 work->descr->entries[i].offset) = ptr; in table_find()
262 work->descr->entries[i].offset + sizeof(u_char *)) in table_find()
281 work->descr->entries[i].offset) = oid; in table_find()
297 work->descr->entries[i].offset)[j] = in table_find()
314 work->descr->entries[i].offset) = var->subs[p++]; in table_find()
330 e1 = TAILQ_FIRST(work->table); in table_find()
331 w1 = TAILQ_FIRST(&work->worklist); in table_find()
339 TAILQ_INSERT_TAIL(work->table, e, link); in table_find()
340 TAILQ_INSERT_TAIL(&work->worklist, w, link); in table_find()
353 for (i = 0; i < work->descr->index_size; i++) { in table_find()
354 if (work->descr->entries[i].syntax == SNMP_SYNTAX_OCTETSTRING && in table_find()
357 work->descr->entries[i].offset)); in table_find()
474 table_check_response(struct tabwork *work, const struct snmp_pdu *resp) in table_check_response() argument
483 ((work->descr->last_change.len == 0) ? 1 : 2)) in table_check_response()
493 if (work->descr->last_change.len != 0 && b == resp->bindings) { in table_check_response()
494 if (!asn_is_suboid(&work->descr->last_change, &b->var) || in table_check_response()
495 b->var.len != work->descr->last_change.len + 1 || in table_check_response()
496 b->var.subs[work->descr->last_change.len] != 0) { in table_check_response()
506 if (work->first) { in table_check_response()
507 work->last_change = b->v.uint32; in table_check_response()
508 work->first = 0; in table_check_response()
510 } else if (work->last_change != b->v.uint32) { in table_check_response()
511 if (++work->iter >= work->descr->max_iter) { in table_check_response()
516 table_free(work, 1); in table_check_response()
522 if (!asn_is_suboid(&work->descr->table, &b->var) || in table_check_response()
526 if ((e = table_find(work, &b->var)) == NULL) in table_check_response()
528 if (table_value(work->descr, e, b)) in table_check_response()
538 table_check_cons(struct tabwork *work) in table_check_cons() argument
542 TAILQ_FOREACH(e, work->table, link) in table_check_cons()
543 if ((e->found & work->descr->req_mask) != in table_check_cons()
544 work->descr->req_mask) { in table_check_cons()
545 if (work->descr->last_change.len == 0) { in table_check_cons()
546 if (++work->iter >= work->descr->max_iter) { in table_check_cons()
554 e->found, work->descr->req_mask); in table_check_cons()
568 struct tabwork work; in snmp_table_fetch() local
571 work.descr = descr; in snmp_table_fetch()
572 work.table = (struct table *)list; in snmp_table_fetch()
573 work.iter = 0; in snmp_table_fetch()
574 TAILQ_INIT(work.table); in snmp_table_fetch()
575 TAILQ_INIT(&work.worklist); in snmp_table_fetch()
576 work.callback = NULL; in snmp_table_fetch()
577 work.arg = NULL; in snmp_table_fetch()
584 work.first = 1; in snmp_table_fetch()
585 work.last_change = 0; in snmp_table_fetch()
586 table_init_pdu(descr, &work.pdu); in snmp_table_fetch()
589 if (snmp_dialog(&work.pdu, &resp)) { in snmp_table_fetch()
590 table_free(&work, 1); in snmp_table_fetch()
593 if ((ret = table_check_response(&work, &resp)) == 0) { in snmp_table_fetch()
599 table_free(&work, 1); in snmp_table_fetch()
607 work.pdu.bindings[work.pdu.nbindings - 1].var = in snmp_table_fetch()
613 if ((ret = table_check_cons(&work)) == -1) { in snmp_table_fetch()
614 table_free(&work, 1); in snmp_table_fetch()
618 table_free(&work, 1); in snmp_table_fetch()
624 table_free(&work, 0); in snmp_table_fetch()
634 struct tabwork *work = arg; in table_cb() local
640 table_free(work, 1); in table_cb()
641 work->callback(work->table, work->arg, -1); in table_cb()
642 free(work); in table_cb()
646 if ((ret = table_check_response(work, resp)) == 0) { in table_cb()
650 if ((ret = table_check_cons(work)) == -1) { in table_cb()
652 table_free(work, 1); in table_cb()
653 work->callback(work->table, work->arg, -1); in table_cb()
654 free(work); in table_cb()
660 table_free(work, 1); in table_cb()
661 work->first = 1; in table_cb()
662 work->last_change = 0; in table_cb()
663 table_init_pdu(work->descr, &work->pdu); in table_cb()
664 if (snmp_pdu_send(&work->pdu, table_cb, work) == -1) { in table_cb()
665 work->callback(work->table, work->arg, -1); in table_cb()
666 free(work); in table_cb()
674 table_free(work, 0); in table_cb()
675 work->callback(work->table, work->arg, 0); in table_cb()
676 free(work); in table_cb()
683 table_free(work, 1); in table_cb()
684 work->callback(work->table, work->arg, -1); in table_cb()
685 free(work); in table_cb()
697 work->pdu.bindings[work->pdu.nbindings - 1].var = in table_cb()
702 if (snmp_pdu_send(&work->pdu, table_cb, work) == -1) { in table_cb()
703 table_free(work, 1); in table_cb()
704 work->callback(work->table, work->arg, -1); in table_cb()
705 free(work); in table_cb()
714 struct tabwork *work; in snmp_table_fetch_async() local
716 if ((work = malloc(sizeof(*work))) == NULL) { in snmp_table_fetch_async()
721 work->descr = descr; in snmp_table_fetch_async()
722 work->table = (struct table *)list; in snmp_table_fetch_async()
723 work->iter = 0; in snmp_table_fetch_async()
724 TAILQ_INIT(work->table); in snmp_table_fetch_async()
725 TAILQ_INIT(&work->worklist); in snmp_table_fetch_async()
727 work->callback = func; in snmp_table_fetch_async()
728 work->arg = arg; in snmp_table_fetch_async()
733 work->first = 1; in snmp_table_fetch_async()
734 work->last_change = 0; in snmp_table_fetch_async()
735 table_init_pdu(descr, &work->pdu); in snmp_table_fetch_async()
737 if (snmp_pdu_send(&work->pdu, table_cb, work) == -1) { in snmp_table_fetch_async()
738 free(work); in snmp_table_fetch_async()
739 work = NULL; in snmp_table_fetch_async()