PERFORCE change 125434 for review
Fredrik Lindberg
fli at FreeBSD.org
Mon Aug 20 10:22:09 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=125434
Change 125434 by fli at 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 */
};
/*
More information about the p4-projects
mailing list