Lines Matching refs:work

98  * table row's. The entry list and the work list parallel each other.
100 struct work {
101 TAILQ_ENTRY(work) link;
104 TAILQ_HEAD(worklist, work);
135 * Free the entire table and work list. If table is NULL only the worklist
139 table_free(struct tabwork *work, int all)
141 struct work *w;
146 while ((w = TAILQ_FIRST(&work->worklist)) != NULL) {
147 TAILQ_REMOVE(&work->worklist, w, link);
154 while ((e = TAILQ_FIRST(work->table)) != NULL) {
155 for (i = 0; work->descr->entries[i].syntax != SNMP_SYNTAX_NULL;
157 d = &work->descr->entries[i];
163 TAILQ_REMOVE(work->table, e, link);
173 table_find(struct tabwork *work, const struct asn_oid *var)
176 struct work *w, *w1;
183 asn_slice_oid(&oid, var, work->descr->table.len + 2, var->len);
185 e = TAILQ_FIRST(work->table);
186 w = TAILQ_FIRST(&work->worklist);
195 if ((e = malloc(work->descr->entry_size)) == NULL) {
205 memset(e, 0, work->descr->entry_size);
208 p = work->descr->table.len + 2;
209 for (i = 0; i < work->descr->index_size; i++) {
210 switch (work->descr->entries[i].syntax) {
223 work->descr->entries[i].offset) = var->subs[p++];
254 work->descr->entries[i].offset) = ptr;
256 work->descr->entries[i].offset + sizeof(u_char *))
275 work->descr->entries[i].offset) = oid;
291 work->descr->entries[i].offset)[j] =
308 work->descr->entries[i].offset) = var->subs[p++];
324 e1 = TAILQ_FIRST(work->table);
325 w1 = TAILQ_FIRST(&work->worklist);
333 TAILQ_INSERT_TAIL(work->table, e, link);
334 TAILQ_INSERT_TAIL(&work->worklist, w, link);
347 for (i = 0; i < work->descr->index_size; i++) {
348 if (work->descr->entries[i].syntax == SNMP_SYNTAX_OCTETSTRING &&
351 work->descr->entries[i].offset));
468 table_check_response(struct tabwork *work, const struct snmp_pdu *resp)
477 ((work->descr->last_change.len == 0) ? 1 : 2))
487 if (work->descr->last_change.len != 0 && b == resp->bindings) {
488 if (!asn_is_suboid(&work->descr->last_change, &b->var) ||
489 b->var.len != work->descr->last_change.len + 1 ||
490 b->var.subs[work->descr->last_change.len] != 0) {
500 if (work->first) {
501 work->last_change = b->v.uint32;
502 work->first = 0;
504 } else if (work->last_change != b->v.uint32) {
505 if (++work->iter >= work->descr->max_iter) {
510 table_free(work, 1);
516 if (!asn_is_suboid(&work->descr->table, &b->var) ||
520 if ((e = table_find(work, &b->var)) == NULL)
522 if (table_value(work->descr, e, b))
532 table_check_cons(struct tabwork *work)
536 TAILQ_FOREACH(e, work->table, link)
537 if ((e->found & work->descr->req_mask) !=
538 work->descr->req_mask) {
539 if (work->descr->last_change.len == 0) {
540 if (++work->iter >= work->descr->max_iter) {
548 e->found, work->descr->req_mask);
562 struct tabwork work;
565 work.descr = descr;
566 work.table = (struct table *)list;
567 work.iter = 0;
568 TAILQ_INIT(work.table);
569 TAILQ_INIT(&work.worklist);
570 work.callback = NULL;
571 work.arg = NULL;
578 work.first = 1;
579 work.last_change = 0;
580 table_init_pdu(descr, &work.pdu);
583 if (snmp_dialog(&work.pdu, &resp)) {
584 table_free(&work, 1);
587 if ((ret = table_check_response(&work, &resp)) == 0) {
593 table_free(&work, 1);
601 work.pdu.bindings[work.pdu.nbindings - 1].var =
607 if ((ret = table_check_cons(&work)) == -1) {
608 table_free(&work, 1);
612 table_free(&work, 1);
618 table_free(&work, 0);
628 struct tabwork *work = arg;
634 table_free(work, 1);
635 work->callback(work->table, work->arg, -1);
636 free(work);
640 if ((ret = table_check_response(work, resp)) == 0) {
644 if ((ret = table_check_cons(work)) == -1) {
646 table_free(work, 1);
647 work->callback(work->table, work->arg, -1);
648 free(work);
654 table_free(work, 1);
655 work->first = 1;
656 work->last_change = 0;
657 table_init_pdu(work->descr, &work->pdu);
658 if (snmp_pdu_send(&work->pdu, table_cb, work) == -1) {
659 work->callback(work->table, work->arg, -1);
660 free(work);
668 table_free(work, 0);
669 work->callback(work->table, work->arg, 0);
670 free(work);
677 table_free(work, 1);
678 work->callback(work->table, work->arg, -1);
679 free(work);
691 work->pdu.bindings[work->pdu.nbindings - 1].var =
696 if (snmp_pdu_send(&work->pdu, table_cb, work) == -1) {
697 table_free(work, 1);
698 work->callback(work->table, work->arg, -1);
699 free(work);
708 struct tabwork *work;
710 if ((work = malloc(sizeof(*work))) == NULL) {
715 work->descr = descr;
716 work->table = (struct table *)list;
717 work->iter = 0;
718 TAILQ_INIT(work->table);
719 TAILQ_INIT(&work->worklist);
721 work->callback = func;
722 work->arg = arg;
727 work->first = 1;
728 work->last_change = 0;
729 table_init_pdu(descr, &work->pdu);
731 if (snmp_pdu_send(&work->pdu, table_cb, work) == -1) {
732 free(work);
733 work = NULL;