Skip site navigation (1)Skip section navigation (2)
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>