Commit Diff


commit - c2185b3bb9a36fa0ea2a7335c6b9b3573398d77d
commit + 5c69b561db9f5713670e2f1e1519cc7f61b06645
blob - 9bbf4b79d279c616c9b3697e3930aff8489fc7dd
blob + aadf317de3e8ea13055245a097ed246217c0c34d
--- kamid/client.c
+++ kamid/client.c
@@ -108,6 +108,7 @@ static void		client_sig_handler(int, short, void *);
 static void		client_dispatch_listener(int, short, void *);
 static void		client_privdrop(const char *, const char *);
 
+static int		client_send_listenerp(int, uint32_t, const void *, uint16_t);
 static int		client_send_listener(int, const void *, uint16_t);
 
 static void		 qid_update_from_sb(struct qid *, struct stat *);
@@ -265,6 +266,8 @@ client_dispatch_listener(int fd, short event, void *d)
 {
 	static int		 auth = 0;
 	struct kd_auth_proc	 rauth;
+	struct kd_debug_info	 debug;
+	struct fid		*f;
 	struct imsg		 imsg;
 	struct imsgev		*iev = d;
 	struct imsgbuf		*ibuf;
@@ -300,6 +303,18 @@ client_dispatch_listener(int fd, short event, void *d)
 			memcpy(&verbose, imsg.data, sizeof(verbose));
 			log_setverbose(verbose);
 			break;
+		case IMSG_CTL_DEBUG:
+			STAILQ_FOREACH(f, &fids, entries) {
+				memset(&debug, 0, sizeof(debug));
+				debug.fid = f->fid;
+				strlcpy(debug.path, f->fname,
+				    sizeof(debug.path));
+				client_send_listenerp(IMSG_CTL_DEBUG_BACK,
+				    imsg.hdr.peerid, &debug, sizeof(debug));
+			}
+			client_send_listenerp(IMSG_CTL_DEBUG_END,
+			    imsg.hdr.peerid, NULL, 0);
+			break;
 		case IMSG_AUTH:
 			peerid = imsg.hdr.peerid;
 			if (auth)
@@ -372,7 +387,7 @@ client_privdrop(const char *username, const char *dir)
 }
 
 static int
-client_send_listener(int type, const void *data, uint16_t len)
+client_send_listenerp(int type, uint32_t peerid, const void *data, uint16_t len)
 {
 	int ret;
 
@@ -383,6 +398,12 @@ client_send_listener(int type, const void *data, uint1
 	return ret;
 }
 
+static int
+client_send_listener(int type, const void *data, uint16_t len)
+{
+	return client_send_listenerp(type, 0, data, len);
+}
+
 /* set qid fields from sb */
 static void
 qid_update_from_sb(struct qid *qid, struct stat *sb)
blob - d35a0bab0e6874fa81a7694b7b16c07a73b88fab
blob + 76873827510ab81bb5ff34ce7b3afebef20ae857
--- kamid/control.c
+++ kamid/control.c
@@ -38,6 +38,8 @@
 
 #define	CONTROL_BACKLOG	5
 
+uint32_t peeridcnt;
+
 struct {
 	struct event	ev;
 	struct event	evt;
@@ -46,12 +48,14 @@ struct {
 
 struct ctl_conn {
 	TAILQ_ENTRY(ctl_conn)	entry;
+	uint32_t		peerid;
 	struct imsgev		iev;
 };
 
 TAILQ_HEAD(ctl_conns, ctl_conn)	ctl_conns = TAILQ_HEAD_INITIALIZER(ctl_conns);
 
 struct ctl_conn	*control_connbyfd(int);
+struct ctl_conn	*control_connbypeer(uint32_t);
 struct ctl_conn	*control_connbypid(pid_t);
 void		 control_close(int);
 
@@ -154,6 +158,7 @@ control_accept(int listenfd, short event, void *bula)
 		return;
 	}
 
+	c->peerid = peeridcnt++;
 	imsg_init(&c->iev.ibuf, connfd);
 	c->iev.handler = control_dispatch_imsg;
 	c->iev.events = EV_READ;
@@ -171,6 +176,19 @@ control_connbyfd(int fd)
 
 	TAILQ_FOREACH(c, &ctl_conns, entry) {
 		if (c->iev.ibuf.fd == fd)
+			break;
+	}
+
+	return (c);
+}
+
+struct ctl_conn *
+control_connbypeer(uint32_t peerid)
+{
+	struct ctl_conn	*c;
+
+	TAILQ_FOREACH(c, &ctl_conns, entry) {
+		if (c->peerid == peerid)
 			break;
 	}
 
@@ -255,6 +273,10 @@ control_dispatch_imsg(int fd, short event, void *bula)
 			if (main_reload() == -1)
 				log_warnx("configuration reload failed");
 			break;
+		case IMSG_CTL_DEBUG:
+			main_imsg_compose_listener(IMSG_CTL_DEBUG, -1,
+			    c->peerid, NULL, 0);
+			break;
 		case IMSG_CTL_LOG_VERBOSE:
 			if (IMSG_DATA_SIZE(imsg) != sizeof(verbose))
 				break;
@@ -282,7 +304,7 @@ control_imsg_relay(struct imsg *imsg)
 {
 	struct ctl_conn	*c;
 
-	if ((c = control_connbypid(imsg->hdr.pid)) == NULL)
+	if ((c = control_connbypeer(imsg->hdr.peerid)) == NULL)
 		return (0);
 
 	return (imsg_compose_event(&c->iev, imsg->hdr.type, 0, imsg->hdr.pid,
blob - e4fc7afd7d2371b7ed084b4fb8c7d8d9185c2a73
blob + 147c60d36656c815c3c5f89fe1183e398f348d9b
--- kamid/kamid.c
+++ kamid/kamid.c
@@ -421,6 +421,10 @@ main_dispatch_listener(int fd, short event, void *d)
 		switch (imsg.hdr.type) {
 		case IMSG_AUTH_TLS:
 			do_auth_tls(&imsg);
+			break;
+		case IMSG_CTL_DEBUG_BACK:
+		case IMSG_CTL_DEBUG_END:
+			control_imsg_relay(&imsg);
 			break;
 		default:
 			log_debug("%s: error handling imsg %d", __func__,
blob - 0d1ede7f4975e90f4efd9d13d6239de7b10614fe
blob + cd4d70bab61ef9d618e24fb7d443c305fc293d04
--- kamid/kamid.h
+++ kamid/kamid.h
@@ -32,6 +32,9 @@ enum imsg_type {
 	IMSG_NONE,
 	IMSG_CTL_LOG_VERBOSE,
 	IMSG_CTL_RELOAD,
+	IMSG_CTL_DEBUG,
+	IMSG_CTL_DEBUG_BACK,	/* kd_debug_info */
+	IMSG_CTL_DEBUG_END,
 	IMSG_STARTUP,
 	IMSG_RECONF_CONF,
 	IMSG_RECONF_PKI,
@@ -109,6 +112,12 @@ struct kd_auth_proc {
 	char		dir[PATH_MAX];
 };
 
+struct kd_debug_info {
+	uint32_t	client_id;
+	uint32_t	fid;
+	char		path[NAME_MAX];
+};
+
 /* kamid.c */
 extern int verbose;
 int	main_reload(void);
blob - 50184c5a55eff1316f6acd4ca04a979a9d397bf1
blob + 1dbf2055ff337e1e473b5f30b224b337a27473d9
--- kamid/listener.c
+++ kamid/listener.c
@@ -315,6 +315,15 @@ listener_dispatch_main(int fd, short event, void *d)
 				listener_imsg_compose_client(client,
 				    imsg.hdr.type, 0,
 				    &verbose, sizeof(verbose));
+			break;
+		case IMSG_CTL_DEBUG:
+			if (SPLAY_EMPTY(&clients))
+				listener_imsg_compose_main(IMSG_CTL_DEBUG_END,
+				    imsg.hdr.peerid, NULL, 0);
+			SPLAY_FOREACH(client, clients_tree_id, &clients)
+				listener_imsg_compose_client(client,
+				    imsg.hdr.type, imsg.hdr.peerid,
+				    imsg.data, IMSG_DATA_SIZE(imsg));
 			break;
 		case IMSG_RECONF_CONF:
 		case IMSG_RECONF_PKI:
@@ -452,6 +461,13 @@ listener_dispatch_client(int fd, short event, void *d)
 			break;
 
 		switch (imsg.hdr.type) {
+		case IMSG_CTL_DEBUG_BACK:
+		case IMSG_CTL_DEBUG_END:
+			log_warnx("relaying back to main debug_back/end");
+			listener_imsg_compose_main(imsg.hdr.type,
+			    imsg.hdr.peerid, imsg.data, IMSG_DATA_SIZE(imsg));
+			break;
+
 		case IMSG_BUF:
 			find.id = imsg.hdr.peerid;
 			client = SPLAY_FIND(clients_tree_id, &clients, &find);