PERFORCE change 127145 for review
Fredrik Lindberg
fli at FreeBSD.org
Wed Oct 3 14:15:20 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=127145
Change 127145 by fli at fli_nexus on 2007/10/03 21:14:58
- Follow changes to record subsystem.
- Remove csc_suser field from struct cs_client and replace with
a generic flags field.
- Fix a shutdown race that sometimes caused a dead lock.
- Ignore SIGPIPE.
- Add some new comments and whitespace cleaning.
Affected files ...
.. //depot/projects/soc2007/fli-mdns_sd/mdnsd/clisrv.c#10 edit
.. //depot/projects/soc2007/fli-mdns_sd/mdnsd/clisrv.h#3 edit
Differences ...
==== //depot/projects/soc2007/fli-mdns_sd/mdnsd/clisrv.c#10 (text+ko) ====
@@ -110,6 +110,7 @@
path, strerror(errno));
return (-1);
}
+ signal(SIGPIPE, SIG_IGN);
eva.ptr = cs;
evai.fd = sock;
cs->cs_evid = event_add(g->g_evl, EVENT_TYPE_IO, evh_newcli, &eva,
@@ -146,6 +147,7 @@
MTX_UNLOCK(cs, cs_mtx);
MTX_DESTROY(cs, cs_mtx);
MDNS_INIT_UNSET(cs, cs_magic);
+ signal(SIGPIPE, SIG_DFL);
dprintf(DEBUG_CS, "Closed UNIX client pipe cs=%x", cs);
}
@@ -244,7 +246,7 @@
TAILQ_INSERT_TAIL(&cs->cs_head, csc, csc_next);
csc->csc_sock = sock;
csc->csc_serv = cs;
- csc->csc_suser = 0;
+ csc->csc_flags = 0;
eva.ptr = csc;
csc->csc_evid = event_add(g->g_evl, EVENT_TYPE_IO, evh_cli, &eva,
evh_clisetup_init, &eva);
@@ -278,14 +280,18 @@
if (csc == NULL)
break;
MDNS_INIT_ASSERT(csc, csc_magic);
+
+ MTX_LOCK(csc, csc_mtx);
+ csc->csc_flags |= CSC_DYING;
cs = csc->csc_serv;
MDNS_INIT_ASSERT(cs, cs_magic);
- MTX_LOCK(csc, csc_mtx);
MTX_LOCK(cs, cs_mtx);
TAILQ_REMOVE(&cs->cs_head, csc, csc_next);
MTX_UNLOCK(cs, cs_mtx);
/* Remove outstanding queries this client has */
+
TAILQ_FOREACH_SAFE(cscq, &csc->csc_queries, cscq_next, cscq2) {
+ TAILQ_REMOVE(&csc->csc_queries, cscq, cscq_next);
query_dereg(cscq->cscq_q, &cscq->cscq_qs, cscq);
TAILQ_REMOVE(&csc->csc_queries, cscq, cscq_next);
free(cscq->cscq_qs.q_name);
@@ -353,7 +359,10 @@
if (cmptr->cmsg_type == SCM_CREDS &&
cmptr->cmsg_level == SOL_SOCKET) {
cred = (struct sockcred *)CMSG_DATA(cmptr);
- csc->csc_suser = (cred->sc_euid == 0) ? 1 : 0;
+ if (cred->sc_euid == 0)
+ csc->csc_flags |= CSC_SUSER;
+ else
+ csc->csc_flags &= ~CSC_SUSER;
}
}
@@ -390,9 +399,10 @@
break;
dprintf(DEBUG_CS, "Received packet on UNIX pipe csc=%x, "
- "len=%d, suser=%d, sock=%d", csc, n, csc->csc_suser, sock);
+ "len=%d, suser=%d, sock=%d", csc, n,
+ csc->csc_flags & CSC_SUSER, sock);
- error = cp_parse(csc, buf, len, csc->csc_suser);
+ error = cp_parse(csc, buf, len, csc->csc_flags & CSC_SUSER);
if (error != 0) {
dprintf(DEBUG_CS, "Failed to parse packet csc=%x", csc);
}
@@ -1423,6 +1433,7 @@
struct cache *c;
struct record_res *rr;
struct record_type *rt;
+ struct record_class *rc;
struct record *r;
struct mipc_head rmih;
struct mipc_cache mc;
@@ -1463,10 +1474,11 @@
c = &mif->mif_cache;
TAILQ_FOREACH(cr, &c->c_list, cr_next) {
rr = &cr->cr_res;
- rt = rr->rr_type;
- r = rt->rt_record;
+ rt = record_get_type(rr);
+ rc = record_get_class(rt);
+ r = record_get_record(rc);
- mc.mc_class = mdns_c_in; /* XXX */
+ mc.mc_class = rc->rc_class;
mc.mc_type = rt->rt_type;
mc.mc_ttl = cr->cr_ttl_abs;
mc.mc_ttl_left = cr->cr_ttl_abs - (curtime - cr->cr_ctime);
@@ -1552,7 +1564,6 @@
dprintf(DEBUG_CS, "Ack sent to client csc=%x, id=%d", csc, id);
}
-
/*
* Response callback from query system, called when a response to
* a query comes in.
@@ -1576,6 +1587,9 @@
cscq = data;
MDNS_INIT_ASSERT(cscq, cscq_magic);
csc = cscq->cscq_csc;
+ if (csc->csc_flags & CSC_DYING)
+ return;
+
MDNS_INIT_ASSERT(csc, csc_magic);
MTX_LOCK(csc, csc_mtx);
@@ -1583,7 +1597,7 @@
* Timeout occurred
*/
if (rs == NULL) {
- query_dereg(cscq->cscq_q, &cscq->cscq_qs, cscq);
+ //query_dereg(cscq->cscq_q, &cscq->cscq_qs, cscq);
TAILQ_REMOVE(&csc->csc_queries, cscq, cscq_next);
send_error(csc, cscq->cscq_id, MIE_TOUT);
@@ -1633,6 +1647,15 @@
rs->r_class, rs->r_type, rs->r_ttl);
}
+/*
+ * Dispatch a query to the query system, if the given interface index
+ * is 0 a query is dispatched for each active interface.
+ * csc - Client handle
+ * cscq - Query data
+ * ifidx - Interface index
+ * fam - Address familty (AF_{UNSPEC,INET,INET6})
+ * tout - Timeout
+ */
static int
queryadd(struct cs_client *csc, struct csc_query *cscq, unsigned int ifidx,
int fam, int tout)
@@ -1678,6 +1701,12 @@
return (0);
}
+/*
+ * Remove an outstanding query, removes any active queries matching the
+ * data given in `cscq'.
+ * csc - Client handle
+ * cscq - Query data
+ */
static int
querydel(struct cs_client *csc, struct csc_query *cscq , unsigned int ifidx)
{
==== //depot/projects/soc2007/fli-mdns_sd/mdnsd/clisrv.h#3 (text+ko) ====
@@ -55,10 +55,12 @@
struct clisrv *csc_serv;
DEF_MTX(csc_mtx);
TAILQ_ENTRY(cs_client) csc_next;
- int csc_sock; /* client sock */
- int csc_evid; /* client event id */
- int csc_suser; /* client have super user privileges */
TAILQ_HEAD(, csc_query) csc_queries;
+ int csc_sock; /* client sock */
+ int csc_evid; /* client event id */
+ int csc_flags;
+#define CSC_SUSER 0x01 /* client have super user privileges */
+#define CSC_DYING 0x02 /* client is dead, shutdown in progress */
};
/*
@@ -67,12 +69,12 @@
struct csc_query {
MAGIC(cscq_magic);
TAILQ_ENTRY(csc_query) cscq_next;
- struct cs_client *cscq_csc; /* back-pointer */
- struct queries *cscq_q; /* queries back-pointer */
- int cscq_id; /* message id */
- int cscq_resp; /* responses sent */
- unsigned int cscq_ifidx; /* interface index */
- struct mdns_qset cscq_qs; /* original query */
+ struct cs_client *cscq_csc; /* back-pointer */
+ struct queries *cscq_q; /* queries back-pointer */
+ int cscq_id; /* message id */
+ int cscq_resp; /* responses sent */
+ unsigned int cscq_ifidx; /* interface index */
+ struct mdns_qset cscq_qs; /* original query */
};
int csrv_open(struct clisrv *, struct md_glob *, const char *);
More information about the p4-projects
mailing list