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>