commit 5c69b561db9f5713670e2f1e1519cc7f61b06645 from: Omar Polo date: Sat Jan 29 11:04:27 2022 UTC add IMSG_CTL_DEBUG to debug the opened fid meant to be used from kamictl to dump all the opened fid by every connection. 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);