ref: 0b43ac046ca81d78e9eca535ab1e92971d30405a
parent: daf2ab4550e555cdb6c58f2a9e647c2259a634de
author: Jacob Moody <[email protected]>
date: Tue Mar 18 00:13:18 EDT 2025
devip: track connection initialization time as mtime sync from 9front
--- a/kern/devip.c
+++ b/kern/devip.c
@@ -40,6 +40,8 @@
#define QID(p, c, y) (((p)<<16) | ((c)<<4) | (y))
#define ipzero(x) memset(x, 0, IPaddrlen)
+#define DEVDOT -2
+
typedef struct Proto Proto;
typedef struct Conv Conv;
struct Conv
@@ -55,6 +57,7 @@
uchar raddr[IPaddrlen];
ushort rport;
int restricted;
+ ulong ctime;
char cerr[KNAMELEN];
Proto* p;
};
@@ -94,13 +97,13 @@
return -1;
case Qctl:
devdir(c, q, "ctl", 0, cv->owner, cv->perm, dp);
- return 1;
+ goto done;
case Qdata:
devdir(c, q, "data", 0, cv->owner, cv->perm, dp);
- return 1;
+ goto done;
case Qlisten:
devdir(c, q, "listen", 0, cv->owner, cv->perm, dp);
- return 1;
+ goto done;
case Qlocal:
p = "local";
break;
@@ -112,6 +115,8 @@
break;
}
devdir(c, q, p, 0, cv->owner, 0444, dp);
+done:
+ dp->mtime = cv->ctime;
return 1;
}
@@ -159,7 +164,7 @@
switch(TYPE(c->qid)) {
case Qtopdir:
- if(s == DEVDOTDOT){
+ if(s == DEVDOTDOT || s == DEVDOT){
mkqid(&q, QID(0, 0, Qtopdir), 0, QTDIR);
snprint(up->genbuf, sizeof up->genbuf, "#I%lud", c->dev);
devdir(c, q, up->genbuf, 0, network, 0555, dp);
@@ -166,6 +171,7 @@
return 1;
}
if(s < np) {
+ Protodir:
mkqid(&q, QID(s, 0, Qprotodir), 0, QTDIR);
devdir(c, q, proto[s].name, 0, network, 0555, dp);
return 1;
@@ -181,11 +187,17 @@
devdir(c, q, up->genbuf, 0, network, 0555, dp);
return 1;
}
+ if(s == DEVDOT){
+ s = PROTO(c->qid);
+ goto Protodir;
+ }
if(s < proto[PROTO(c->qid)].nc) {
+ Convdir:
cv = proto[PROTO(c->qid)].conv[s];
snprint(up->genbuf, sizeof up->genbuf, "%d", s);
mkqid(&q, QID(PROTO(c->qid), s, Qconvdir), 0, QTDIR);
devdir(c, q, up->genbuf, 0, cv->owner, 0555, dp);
+ dp->mtime = cv->ctime;
return 1;
}
s -= proto[PROTO(c->qid)].nc;
@@ -199,6 +211,10 @@
devdir(c, q, proto[s].name, 0, network, 0555, dp);
return 1;
}
+ if(s == DEVDOT){
+ s = CONV(c->qid);
+ goto Convdir;
+ }
return ip3gen(c, s+Qconvbase, dp);
case Qctl:
case Qdata:
@@ -269,6 +285,16 @@
int
ipstat(Chan *c, uchar *dp, int n)
{
+ Dir d;
+
+ if(c->qid.type == QTDIR){
+ ipgen(c, nil, nil, 0, DEVDOT, &d);
+ n = convD2M(&d, dp, n);
+ if(n == 0)
+ error(Ebadarg);
+ return n;
+ }
+
return devstat(c, dp, n, 0, 0, ipgen);
}
@@ -631,6 +657,7 @@
c->lport = 0;
c->rport = 0;
c->sfd = nfd;
+ c->ctime = seconds();
unlock(&c->r.lk);
unlock(&p->l);