commit - c2185b3bb9a36fa0ea2a7335c6b9b3573398d77d
commit + 5c69b561db9f5713670e2f1e1519cc7f61b06645
blob - 9bbf4b79d279c616c9b3697e3930aff8489fc7dd
blob + aadf317de3e8ea13055245a097ed246217c0c34d
--- kamid/client.c
+++ kamid/client.c
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 *);
{
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;
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)
}
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;
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
#define CONTROL_BACKLOG 5
+uint32_t peeridcnt;
+
struct {
struct event ev;
struct event evt;
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);
return;
}
+ c->peerid = peeridcnt++;
imsg_init(&c->iev.ibuf, connfd);
c->iev.handler = control_dispatch_imsg;
c->iev.events = EV_READ;
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;
}
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;
{
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
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
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,
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
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:
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);