| plan 9 kernel history: overview | file list | diff list |
1990/11211/gnot/devproc.c (diff list | history)
| 1990/1115/sys/src/9/gnot/devproc.c:5,10 – 1990/11211/sys/src/9/gnot/devproc.c:5,13 (short | long | prev | next) | ||
| 1990/03091 | #include "fns.h" #include "errno.h" | |
| 1990/11211 | /* BUG mips only TAKE IT OUT */ #include "io.h" | |
| 1990/03091 | #include "devtab.h" enum{ | |
| 1990/1115/sys/src/9/gnot/devproc.c:19,46 – 1990/11211/sys/src/9/gnot/devproc.c:22,49 | ||
| 1990/03091 | }; Dirtab procdir[]={ | |
| 1990/1106 |
| |
| 1990/03091 |
| |
| 1990/11211 | "ctl", {Qctl}, 0, 0600, "mem", {Qmem}, 0, 0600, "note", {Qnote}, 0, 0600, "notepg", {Qnotepg}, 0, 0200, "proc", {Qproc}, sizeof(Proc), 0600, "status", {Qstatus}, NAMELEN+12+6*12, 0600, "text", {Qtext}, 0, 0600, | |
| 1990/03091 | }; /* | |
| 1990/11211 | * Qids are, in path: | |
| 1990/03091 | * 4 bits of file type (qids above) | |
| 1990/11211 | * 24 bits of process slot number + 1 * in vers, * 32 bits of pid, for consistency checking * If notepg, c->pgrpid.path is pgrp slot, .vers is pgrpid. | |
| 1990/03091 | */ #define NPROC (sizeof procdir/sizeof(Dirtab)) #define QSHIFT 4 /* location in qid of proc slot # */ | |
| 1990/11211 | #define QID(q) (((q).path&0x0000000F)>>0) #define SLOT(q) ((((q).path&0x0FFFFFFF0)>>QSHIFT)-1) #define PID(q) ((q).vers) | |
| 1990/03091 | int procgen(Chan *c, Dirtab *tab, int ntab, int s, Dir *dp) | |
| 1990/1115/sys/src/9/gnot/devproc.c:49,55 – 1990/11211/sys/src/9/gnot/devproc.c:52,58 | ||
| 1990/03091 | char buf[NAMELEN]; ulong pid; | |
| 1990/11211 | if(c->qid.path == CHDIR){ | |
| 1990/03091 | if(s >= conf.nproc) return -1; p = proctab(s); | |
| 1990/1115/sys/src/9/gnot/devproc.c:57,63 – 1990/11211/sys/src/9/gnot/devproc.c:60,66 | ||
| 1990/03091 | if(pid == 0) return 0; sprint(buf, "%d", pid); | |
| 1990/11211 | devdir(c, (Qid){CHDIR|((s+1)<<QSHIFT), pid}, buf, 0, CHDIR|0500, dp); | |
| 1990/03091 | return 1; } if(s >= NPROC) | |
| 1990/1115/sys/src/9/gnot/devproc.c:65,71 – 1990/11211/sys/src/9/gnot/devproc.c:68,75 | ||
| 1990/03091 | if(tab) panic("procgen"); tab = &procdir[s]; | |
| 1990/11211 | devdir(c, (Qid){(~CHDIR)&(c->qid.path|tab->qid.path), c->qid.vers}, tab->name, tab->length, tab->perm, dp); | |
| 1990/03091 | return 1; } | |
| 1990/1115/sys/src/9/gnot/devproc.c:114,129 – 1990/11211/sys/src/9/gnot/devproc.c:118,133 | ||
| 1990/03091 | Orig *o; Chan *tc; | |
| 1990/11211 | if(c->qid.path == CHDIR){ | |
| 1990/03091 | if(omode != OREAD) | |
| 1990/11211 | error(Eperm); | |
| 1990/03091 | goto done; } p = proctab(SLOT(c->qid)); | |
| 1990/1106 | pg = p->pgrp; | |
| 1990/03091 |
| |
| 1990/11211 | if(p->pid != PID(c->qid)) | |
| 1990/03091 | Died: | |
| 1990/11211 | error(Eprocdied); | |
| 1990/03091 | omode = openmode(omode); switch(QID(c->qid)){ | |
| 1990/1115/sys/src/9/gnot/devproc.c:141,147 – 1990/11211/sys/src/9/gnot/devproc.c:145,151 | ||
| 1990/03091 | } if(!(tc->flag&COPEN) || tc->mode!=OREAD) goto Close; | |
| 1990/11211 | if(p->pid != PID(c->qid)) | |
| 1990/03091 | goto Close; qlock(tc); tc->offset = 0; | |
| 1990/1115/sys/src/9/gnot/devproc.c:153,160 – 1990/11211/sys/src/9/gnot/devproc.c:157,165 | ||
| 1990/1106 | case Qnotepg: | |
| 1990/1115 | if(omode!=OWRITE || pg->pgrpid==1) /* easy to do by mistake */ | |
| 1990/1106 |
| |
| 1990/11211 | error(Eperm); c->pgrpid.path = pg->index+1; c->pgrpid.vers = pg->pgrpid; | |
| 1990/1106 | break; | |
| 1990/03091 | case Qdir: | |
| 1990/1115/sys/src/9/gnot/devproc.c:162,178 – 1990/11211/sys/src/9/gnot/devproc.c:167,183 | ||
| 1990/03091 | case Qproc: case Qstatus: | |
| 1990/1106 | if(omode != OREAD) | |
| 1990/03091 |
| |
| 1990/11211 | error(Eperm); | |
| 1990/03091 | break; default: pprint("unknown qid in devopen\n"); | |
| 1990/11211 | error(Egreg); | |
| 1990/03091 | } /* * Affix pid to qid */ if(p->state != Dead) | |
| 1990/11211 | c->qid.vers = p->pid; | |
| 1990/03091 | done: c->mode = omode; c->flag |= COPEN; | |
| 1990/1115/sys/src/9/gnot/devproc.c:183,201 – 1990/11211/sys/src/9/gnot/devproc.c:188,206 | ||
| 1990/03091 | void proccreate(Chan *c, char *name, int omode, ulong perm) { | |
| 1990/11211 | error(Eperm); | |
| 1990/03091 | } void procremove(Chan *c) { | |
| 1990/11211 | error(Eperm); | |
| 1990/03091 | } void procwstat(Chan *c, char *db) { | |
| 1990/11211 | error(Eperm); | |
| 1990/03091 | } void | |
| 1990/1115/sys/src/9/gnot/devproc.c:219,225 – 1990/11211/sys/src/9/gnot/devproc.c:224,230 | ||
| 1990/03091 | long pid; User *up; | |
| 1990/11211 | if(c->qid.path & CHDIR) | |
| 1990/03091 | return devdirread(c, a, n, 0, 0, procgen); /* | |
| 1990/1115/sys/src/9/gnot/devproc.c:226,233 – 1990/11211/sys/src/9/gnot/devproc.c:231,238 | ||
| 1990/03091 | * BUG: should lock(&p->debug)? */ p = proctab(SLOT(c->qid)); | |
| 1990/11211 | if(p->pid != PID(c->qid)) error(Eprocdied); | |
| 1990/03091 | switch(QID(c->qid)){ case Qmem: | |
| 1990/1115/sys/src/9/gnot/devproc.c:240,254 – 1990/11211/sys/src/9/gnot/devproc.c:245,259 | ||
| 1990/03091 | if(s){ o = s->o; if(o == 0) | |
| 1990/11211 | error(Eprocdied); | |
| 1990/03091 | lock(o); | |
| 1990/11211 | if(s->o!=o || p->pid!=PID(c->qid)){ | |
| 1990/03091 | unlock(o); | |
| 1990/11211 | error(Eprocdied); | |
| 1990/03091 | } if(seg(p, c->offset) != s){ unlock(o); | |
| 1990/11211 | error(Egreg); | |
| 1990/03091 | } | |
| 1990/05313 | pte = &o->pte[(c->offset-o->va)>>PGSHIFT]; if(s->mod){ | |
| 1990/1115/sys/src/9/gnot/devproc.c:278,285 – 1990/11211/sys/src/9/gnot/devproc.c:283,290 | ||
| 1990/03091 | if(c->offset+n > USERADDR+BY2PG) n = USERADDR+BY2PG - c->offset; pg = p->upage; | |
| 1990/11211 | if(pg==0 || p->pid!=PID(c->qid)) error(Eprocdied); | |
| 1990/06021 | k = kmap(pg); | |
| 1990/0614 | b = (char*)VA(k); | |
| 1990/03091 | memcpy(a, b+(c->offset-USERADDR), n); | |
| 1990/1115/sys/src/9/gnot/devproc.c:303,319 – 1990/11211/sys/src/9/gnot/devproc.c:308,324 | ||
| 1990/03091 | unlock(&p->debug); nexterror(); } | |
| 1990/11211 | if(p->pid != PID(c->qid)) error(Eprocdied); | |
| 1990/06021 | k = kmap(p->upage); | |
| 1990/0614 | up = (User*)VA(k); | |
| 1990/03091 | if(up->p != p){ | |
| 1990/06021 | kunmap(k); | |
| 1990/03091 | pprint("note read u/p mismatch"); | |
| 1990/11211 | error(Egreg); | |
| 1990/03091 | } if(n < ERRLEN) | |
| 1990/11211 | error(Etoosmall); | |
| 1990/03091 | if(up->nnote == 0) n = 0; else{ | |
| 1990/1115/sys/src/9/gnot/devproc.c:350,356 – 1990/11211/sys/src/9/gnot/devproc.c:355,361 | ||
| 1990/03091 | memcpy(a, statbuf+c->offset, n); return n; } | |
| 1990/11211 | error(Egreg); | |
| 1990/03091 | } | |
| 1990/1115/sys/src/9/gnot/devproc.c:363,382 – 1990/11211/sys/src/9/gnot/devproc.c:368,387 | ||
| 1990/06021 | KMap *k; | |
| 1990/03091 | char buf[ERRLEN]; | |
| 1990/11211 | if(c->qid.path & CHDIR) error(Eisdir); | |
| 1990/1106 | /* * Special case: don't worry about process, just use remembered group */ if(QID(c->qid) == Qnotepg){ | |
| 1990/11211 | pg = pgrptab(c->pgrpid.path-1); | |
| 1990/1106 | lock(&pg->debug); if(waserror()){ unlock(&pg->debug); nexterror(); } | |
| 1990/11211 | if(pg->pgrpid != c->pgrpid.vers){ | |
| 1990/1106 | unlock(&pg->debug); goto Died; } | |
| 1990/1115/sys/src/9/gnot/devproc.c:391,399 – 1990/11211/sys/src/9/gnot/devproc.c:396,404 | ||
| 1990/03091 | unlock(&p->debug); nexterror(); } | |
| 1990/11211 | if(p->pid != PID(c->qid)) | |
| 1990/03091 | Died: | |
| 1990/11211 | error(Eprocdied); | |
| 1990/03091 | switch(QID(c->qid)){ case Qctl: | |
| 1990/1115/sys/src/9/gnot/devproc.c:400,406 – 1990/11211/sys/src/9/gnot/devproc.c:405,411 | ||
| 1990/03091 | if(p->state==Broken && n>=4 && strncmp(va, "exit", 4)==0) ready(p); else | |
| 1990/11211 | error(Ebadctl); | |
| 1990/03091 | break; case Qnote: | |
| 1990/06021 | k = kmap(p->upage); | |
| 1990/1115/sys/src/9/gnot/devproc.c:408,441 – 1990/11211/sys/src/9/gnot/devproc.c:413,434 | ||
| 1990/03091 | if(up->p != p){ | |
| 1990/06021 | kunmap(k); | |
| 1990/03091 | pprint("note write u/p mismatch"); | |
| 1990/11211 | error(Egreg); | |
| 1990/03091 | } | |
| 1990/06021 | kunmap(k); | |
| 1990/03091 | if(n >= ERRLEN-1) | |
| 1990/11211 | error(Etoobig); | |
| 1990/03091 | if(n>=4 && strncmp(va, "sys:", 4)==0) | |
| 1990/11211 | error(Ebadarg); | |
| 1990/03091 | memcpy(buf, va, n); buf[n] = 0; if(!postnote(p, 0, buf, NUser)) | |
| 1990/11211 | error(Enonote); | |
| 1990/03091 | break; default: pprint("unknown qid in procwrite\n"); | |
| 1990/11211 | error(Egreg); | |
| 1990/03091 | } unlock(&p->debug); return n; | |