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