Date: Wed, 3 Oct 2007 21:15:19 GMT From: Fredrik Lindberg <fli@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 127145 for review Message-ID: <200710032115.l93LFJc8096327@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=127145 Change 127145 by fli@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 *);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200710032115.l93LFJc8096327>