From owner-p4-projects@FreeBSD.ORG Mon Jul 16 01:26:18 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A8DC216A407; Mon, 16 Jul 2007 01:26:18 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 3861B16A402 for ; Mon, 16 Jul 2007 01:26:18 +0000 (UTC) (envelope-from fli@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id D034413C441 for ; Mon, 16 Jul 2007 01:26:17 +0000 (UTC) (envelope-from fli@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l6G1QH2l090850 for ; Mon, 16 Jul 2007 01:26:17 GMT (envelope-from fli@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l6G1QHsf090847 for perforce@freebsd.org; Mon, 16 Jul 2007 01:26:17 GMT (envelope-from fli@FreeBSD.org) Date: Mon, 16 Jul 2007 01:26:17 GMT Message-Id: <200707160126.l6G1QHsf090847@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to fli@FreeBSD.org using -f From: Fredrik Lindberg To: Perforce Change Reviews Cc: Subject: PERFORCE change 123571 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 Jul 2007 01:26:19 -0000 http://perforce.freebsd.org/chv.cgi?CH=123571 Change 123571 by fli@fli_nexus on 2007/07/16 01:26:07 - Add record_type_find() which returns the given record type - Change record_res_find() to find an exact match to a resource exists. - Add some convenient macros to traverse types and resources. - Style fixes. Affected files ... .. //depot/projects/soc2007/fli-mdns_sd/mdnsd/record.c#3 edit .. //depot/projects/soc2007/fli-mdns_sd/mdnsd/record.h#3 edit Differences ... ==== //depot/projects/soc2007/fli-mdns_sd/mdnsd/record.c#3 (text+ko) ==== @@ -28,11 +28,17 @@ #include #include +#include "debug.h" +#include "log.h" #include "record.h" -#include "log.h" + +#define record_aquire(r) (r)->r_refcnt++; \ + dprintf(DEBUG_REC, "Refcount on r=%x increased to %d",\ + r, (r)->r_refcnt); -#define record_aquire(r) (r)->r_refcnt++; -#define record_type_aquire(rt) (rt)->rt_refcnt++; +#define record_type_aquire(rt) (rt)->rt_refcnt++; \ + dprintf(DEBUG_REC, "Refcount on rt=%x increased to %d",\ + rt, (rt)->rt_refcnt); /* * Initialize a record set for `class' @@ -84,7 +90,7 @@ * recs - Record set * r - Pointer to record * name - Resource name - * flags - RECORD_NOALLOC will supress memory allocation + * flags - RECORD_NOALLOC will supress memory allocation */ int record_get(struct records *recs, struct record **r, int flags, char *name) @@ -123,7 +129,8 @@ *r = rec; } record_aquire(*r); - dprintf(DEBUG_REC, "Record aquired r=%x, refcnt=%d", *r, (*r)->r_refcnt); + dprintf(DEBUG_REC, "Record aquired r=%x, name=%s, refcnt=%d", + *r, (*r)->r_name, (*r)->r_refcnt); return (0); } @@ -152,7 +159,8 @@ dprintf(DEBUG_REC, "References cleared on r=%x, removed", r); } else { - dprintf(DEBUG_REC, "Record released r=%x, refs=%d", r, r->r_refcnt); + dprintf(DEBUG_REC, "Record released r=%x, refs=%d", + r, r->r_refcnt); } } @@ -198,7 +206,7 @@ * Get a record type for a record, will be intialized if needed * r - Record * rt - Pointer to the new record type - * flags - RECORD_NOALLOC will supress memory allocation + * flags - RECORD_NOALLOC will supress memory allocation * type - DNS type */ int @@ -327,6 +335,12 @@ dprintf(DEBUG_REC, "Resource rr=%x removed, rt=%x", rr, rt); } +/* + * Set resource data on a resource record + * rr - Resource record + * data - Data pointer + * dlen - Length of data + */ void record_res_setdata(struct record_res *rr, void *data, size_t dlen) { @@ -347,7 +361,8 @@ * type - Resource type */ struct record_res * -record_res_find(struct records *recs, char *name, uint16_t type) +record_res_find(struct records *recs, char *name, uint16_t type, char *data, + size_t dlen) { struct record *r; struct record_type *rt; @@ -368,10 +383,35 @@ if (rt == NULL) return (NULL); - rr = TAILQ_FIRST(&rt->rt_list); + TAILQ_FOREACH(rr, &rt->rt_list, rr_next) { + if (rr->rr_len == dlen) + if (memcmp(rr->rr_data, data, dlen) == 0) + break; + } return (rr); } +struct record_type * +record_type_find(struct records *recs, char *name, uint16_t type) +{ + struct record *r; + struct record_type *rt; + size_t len; + + MDNS_INIT_ASSERT(recs, r_magic); + + len = strlen(name); + r = hashtbl_find(&recs->r_recs, name, len); + if (r == NULL) + return (NULL); + + TAILQ_FOREACH(rt, &r->r_list, rt_next) { + if (rt->rt_type == type) + break; + } + return (rt); +} + static void rec_walk(__unused struct hashtbl *ht, __unused const void *key, __unused size_t keylen, void *data, void *arg) @@ -426,7 +466,8 @@ rr = rr_head = TAILQ_FIRST(&rt->rt_list); } else { - rr_tmp = TAILQ_NEXT(TAILQ_NEXT(rr_prev, rr_next), rr_next); + rr_tmp = TAILQ_NEXT( + TAILQ_NEXT(rr_prev, rr_next), rr_next); if (rr_tmp != NULL && rr_tmp != rr_next) rr = rr_tmp; else ==== //depot/projects/soc2007/fli-mdns_sd/mdnsd/record.h#3 (text+ko) ==== @@ -71,7 +71,7 @@ struct record *rt_record; void *rt_parent; TAILQ_ENTRY(record_type) rt_next; - int rt_type; + uint16_t rt_type; int rt_flags; size_t rt_refcnt; TAILQ_HEAD(record_res_head, record_res) rt_list; @@ -111,7 +111,9 @@ int record_res_add(struct record *, struct record_res **, int, uint16_t, void *, size_t); void record_res_del(struct record_res *); -struct record_res * record_res_find(struct records *, char *, uint16_t); +struct record_res * record_res_find(struct records *, char *, uint16_t, + char *, size_t); +struct record_type * record_type_find(struct records *, char *, uint16_t); void record_res_setdata(struct record_res *, void *, size_t); typedef void (*record_foreach)(struct record *, void *); @@ -132,4 +134,13 @@ #define record_res_setparent(x, y) __getparent(x, rr_parent) = y #define record_res_getparent(x) __getparent(x, rr_parent) +#define record_type_foreach(rr, rt) \ + TAILQ_FOREACH(rr, &((rt)->rt_list), rr_next) +#define record_type_first(rt) TAILQ_FIRST(&(rt)->rt_list) +#define record_type_next(rr) TAILQ_NEXT((rr), rr_next) +#define record_foreach(rt, r) \ + TAILQ_FOREACH(rt, &((r)->r_list), rt_next) +#define record_first(r) TAILQ_FIRST(&(r)->r_list) +#define record_next(r) TAILQ_NEXT((r), rt_next) + #endif /* _RECORD_H_ */