Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Aug 2007 17:22:07 GMT
From:      Fredrik Lindberg <fli@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 125434 for review
Message-ID:  <200708201722.l7KHM7NE052989@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=125434

Change 125434 by fli@fli_nexus on 2007/08/20 17:22:03

	Change how resource lists are obtained, no record names
	are copied.

Affected files ...

.. //depot/projects/soc2007/fli-mdns_sd/mdnsd/dbrec.c#6 edit
.. //depot/projects/soc2007/fli-mdns_sd/mdnsd/dbrec.h#4 edit

Differences ...

==== //depot/projects/soc2007/fli-mdns_sd/mdnsd/dbrec.c#6 (text+ko) ====

@@ -588,32 +588,30 @@
 
 	MTX_LOCK(dbi, dbi_mtx);
 	sz = dbi->dbi_numnam;
+	if (dbi->dbi_records > 0) {
+		sz += (dbi->dbi_records - 1);
+	}
 
-	for (i = 0; i < dbi->dbi_numnam; i++)
-		sz += dbi->dbi_records;
-
 	dn = malloc(sizeof(struct dbr_name) * sz);
 	if (dn == NULL)
 		goto out2;
 
+	j = 0;
+	TAILQ_FOREACH(dr, &dbi->dbi_rech, dr_next) {
+		dnp = &dn[j];
+		dnp->dn_name = _wcsdup(dbi->dbi_names[dbi->dbi_curnam]);
+		dnp->dn_curnam = 1;
+		dnp->dn_ename = _wcsdup(dr->dr_name);
+		j++;
+	}
+
 	for (i = 0; i < dbi->dbi_numnam; i++) {
-		if (dbi->dbi_records == 0) {
-			if (dbi->dbi_curnam == i)
-				dn[i].dn_curnam = 1;
-			dn[i].dn_ename = NULL;
-			dn[i].dn_name = _wcsdup(dbi->dbi_names[i]);
+		if (i == dbi->dbi_curnam)
 			continue;
-		}
-
-		j = 0;
-		TAILQ_FOREACH(dr, &dbi->dbi_rech, dr_next) {
-			dnp = &dn[i + j];
-			dnp->dn_name = _wcsdup(dbi->dbi_names[i]);
-			if (dbi->dbi_curnam == i)
-				dnp->dn_curnam = 1;
-			dnp->dn_ename = _wcsdup(dr->dr_name);
-			j++;
-		}
+		dnp = &dn[j];
+		dnp->dn_name = _wcsdup(dbi->dbi_names[i]);
+		dnp->dn_curnam = 0;
+		dnp->dn_ename = NULL;
 	}
 
 	*namlen = sz;
@@ -800,12 +798,11 @@
 dbr_res_list(struct dbr *dbr, char *ident, size_t *reslen)
 {
 	struct dbr_resource *dres;
-	struct dbr_rec *dr;
 	struct dbr_ident *dbi, *dbip;
 	struct dbr_ident_res *dir;
 	struct dbr_res *dsh, *ds;
 	struct record_res *rr;
-	size_t ilen, sz;
+	size_t ilen, sz, i, j;
 
 	ilen = strlen(ident);
 	RW_RLOCK(dbr, dbr_lock);
@@ -817,51 +814,52 @@
 
 	sz = 0;
 	dres = NULL;
-	
+
 	TAILQ_FOREACH(dir, &dbi->dbi_res, dir_next) {
 		MDNS_INIT_ASSERT(dir, dir_magic);
+
+		dres = realloc(dres, sizeof(struct dbr_resource) * (sz+1));
+		dres[sz].dres_class = dir->dir_class;
+		dres[sz].dres_type = dir->dir_type;
+		dres[sz].dres_ttl = dir->dir_ttl;
+		if (dir->dir_flags & DIR_POINTER) {
+			dbip = dir->dir_data.dbi;
+			dres[sz].dres_resptr = strdup(dbip->dbi_ident);
+			dres[sz].dres_res =
+			    _wcsdup(dbip->dbi_names[dbi->dbi_curnam]);
+		}
+		else {
+			dres[sz].dres_resptr = NULL;
+			dres[sz].dres_res = _wcsdup(dir->dir_data.wp);
+		}
+		dres[sz].dres_len = 0;
+		dres[sz].dres_data = NULL;
+
+		j = i = sz;
+		sz++;
 		TAILQ_FOREACH(dsh, &dir->dir_resh, ds_dir_next) {
 			dres = realloc(dres, sizeof(struct dbr_resource) *
-			    (sz + 1 + dsh->ds_clones));
-			dr = dsh->ds_rec;
-			dres[sz].dres_name = _wcsdup(dr->dr_name);
-			dres[sz].dres_res = _wcsdup(dsh->ds_data);
-			dres[sz].dres_resptr = NULL;
-			if (dir->dir_flags & DIR_POINTER)
-				dres[sz].dres_resptr =
-				    strdup(dir->dir_data.dbi->dbi_ident);
-			dres[sz].dres_class = dir->dir_class;
-			dres[sz].dres_type = dir->dir_type;
-			dres[sz].dres_ttl = dir->dir_ttl;
+			    (sz + dsh->ds_clones));
+
+			memcpy(&dres[i], &dres[j], sizeof(struct dbr_resource));
 
 			rr = &dsh->ds_res;
-			dres[sz].dres_len = rr->rr_len;
-			dres[sz].dres_data = malloc(rr->rr_len);
-			memcpy(dres[sz].dres_data, (char *)rr->rr_data,
+			dres[i].dres_len = rr->rr_len;
+			dres[i].dres_data = malloc(rr->rr_len);
+			memcpy(dres[i].dres_data, (char *)rr->rr_data,
 			    rr->rr_len);
-
-			sz++;
+			i++;
+			sz += dsh->ds_clones;
 			TAILQ_FOREACH(ds, &dsh->ds_clone.head, ds_clone.next) {
-				dres[sz].dres_name = _wcsdup(dr->dr_name);
-				dres[sz].dres_res = _wcsdup(dsh->ds_data);
-				dres[sz].dres_resptr = NULL;
-				if (dir->dir_flags & DIR_POINTER) {
-					dbip = dir->dir_data.dbi;
-					MDNS_INIT_ASSERT(dbip, dbi_magic);
-					dres[sz].dres_resptr =
-					    strdup(dbip->dbi_ident);
-				}
-				dres[sz].dres_class = dir->dir_class;
-				dres[sz].dres_type = dir->dir_type;
-				dres[sz].dres_ttl = dir->dir_ttl;
-				rr = &ds->ds_res;
-				dres[sz].dres_len = rr->rr_len;
-				dres[sz].dres_data = malloc(rr->rr_len);
-				memcpy(dres[sz].dres_data, (char *)rr->rr_data,
-				    rr->rr_len);
-				sz++;
+				i++;
+				memcpy(&dres[i], &dres[j],
+				    sizeof(struct dbr_resource));
+				dres[i].dres_len = rr->rr_len;
+				dres[i].dres_data = malloc(rr->rr_len);
+				memcpy(dres[i].dres_data, (char *)rr->rr_data,
+			    	    rr->rr_len);
 			}
-		} 	
+		}
 	}
 
 	*reslen = sz;
@@ -883,13 +881,22 @@
 dbr_res_list_free(struct dbr_resource *dres, size_t reslen)
 {
 	size_t i;
+	void *tmp_res, *tmp_resptr;
 
+	tmp_res = tmp_resptr = NULL;
+	/* Several pointers may point to the same allocated data */
 	for (i = 0; i < reslen; i++) {
-		free(dres[i].dres_name);
-		free(dres[i].dres_res);
-		free(dres[i].dres_data);
-		if (dres[i].dres_resptr != NULL)
+		if (dres[i].dres_res != tmp_res) {
+			tmp_res = dres[i].dres_res;
+			free(dres[i].dres_res);
+		}
+		if (dres[i].dres_resptr != NULL &&
+		    dres[i].dres_resptr != tmp_resptr) {
+			tmp_resptr = dres[i].dres_resptr;
 			free(dres[i].dres_resptr);
+		}
+		if (dres[i].dres_data != NULL)
+			free(dres[i].dres_data);
 	}
 	free(dres);
 }

==== //depot/projects/soc2007/fli-mdns_sd/mdnsd/dbrec.h#4 (text+ko) ====

@@ -74,7 +74,7 @@
 
 /*
  * Used to return information about current names assigned to
- * an identifier. 
+ * an identifier.
  */
 struct dbr_name {
 	wchar_t		*dn_name;
@@ -110,14 +110,13 @@
  * an identifier.
  */
 struct dbr_resource {
-	wchar_t		*dres_name;	/* Resource name */
-	wchar_t		*dres_res;	/* Resource data source */
+	wchar_t		*dres_res;	/* Unexpanded source */
 	char		*dres_resptr;	/* Pointer identifier */
 	uint16_t	dres_class;
 	uint16_t	dres_type;
 	uint32_t	dres_ttl;
-	char		*dres_data;
-	size_t		dres_len;
+	size_t		dres_len;	/* Length of real resource */
+	char		*dres_data;	/* Expanded/encoded resource */
 };
 
 /*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200708201722.l7KHM7NE052989>