Annotation of lucent/sys/src/9/port/f002541, revision 1.1.1.1

1.1       root        1: /*
                      2:  *  reboot stream module and device
                      3:  */
                      4: 
                      5: #include       "u.h"
                      6: #include       "../port/lib.h"
                      7: #include       "mem.h"
                      8: #include       "dat.h"
                      9: #include       "fns.h"
                     10: #include       "../port/error.h"
                     11: 
                     12: #include       "devtab.h"
                     13: 
                     14: enum{
                     15:        Dirqid,
                     16:        Deltatqid,
                     17:        Zotqid,
                     18: };
                     19: 
                     20: Dirtab Reboottab[]={
                     21:        "deltat",       {Deltatqid, 0}, NUMSIZE,        0660,
                     22:        "zot",          {Zotqid, 0},    0,              0220,
                     23: };
                     24: 
                     25: #define NReboottab (sizeof(Reboottab)/sizeof(Dirtab))
                     26: 
                     27: /*
                     28:  *  stream module definition
                     29:  */
                     30: static void rebootstopen(Queue*, Stream*);
                     31: static void rebootiput(Queue*, Block*);
                     32: static void rebootoput(Queue*, Block*);
                     33: static Qinfo rebootinfo =
                     34: {
                     35:        rebootiput,
                     36:        rebootoput,
                     37:        rebootstopen,
                     38:        0,
                     39:        "reboot",
                     40:        0
                     41: };
                     42: 
                     43: static Rendez  timer;
                     44: static int     deltat;
                     45: 
                     46: void
                     47: rebootreset(void)
                     48: {
                     49:        newqinfo(&rebootinfo);
                     50: }
                     51: 
                     52: void
                     53: rebootinit(void)
                     54: {
                     55: }
                     56: 
                     57: Chan *
                     58: rebootattach(char *spec)
                     59: {
                     60:        return devattach(L'↑', spec);
                     61: }
                     62: 
                     63: Chan *
                     64: rebootclone(Chan *c, Chan *nc)
                     65: {
                     66:        return devclone(c, nc);
                     67: }
                     68: 
                     69: int
                     70: rebootwalk(Chan *c, char *name)
                     71: {
                     72:        return devwalk(c, name, Reboottab, NReboottab, devgen);
                     73: }
                     74: 
                     75: void
                     76: rebootstat(Chan *c, char *db)
                     77: {
                     78:        devstat(c, db, Reboottab, NReboottab, devgen);
                     79: }
                     80: 
                     81: Chan *
                     82: rebootopen(Chan *c, int omode)
                     83: {
                     84:        return devopen(c, omode, Reboottab, NReboottab, devgen);
                     85: }
                     86: 
                     87: void
                     88: rebootcreate(Chan *c, char *name, int omode, ulong perm)
                     89: {
                     90:        USED(c, name, omode, perm);
                     91:        error(Eperm);
                     92: }
                     93: 
                     94: void
                     95: rebootremove(Chan *c)
                     96: {
                     97:        USED(c);
                     98:        error(Eperm);
                     99: }
                    100: 
                    101: void
                    102: rebootwstat(Chan *c, char *dp)
                    103: {
                    104:        USED(c, dp);
                    105:        error(Eperm);
                    106: }
                    107: 
                    108: void
                    109: rebootclose(Chan *c)
                    110: {
                    111:        USED(c);
                    112: }
                    113: 
                    114: long
                    115: rebootread(Chan *c, void *a, long n, ulong offset)
                    116: {
                    117:        switch(c->qid.path & ~CHDIR){
                    118:        case Dirqid:
                    119:                return devdirread(c, a, n, Reboottab, NReboottab, devgen);
                    120:        case Deltatqid:
                    121:                return readnum(offset, a, n, deltat, NUMSIZE);
                    122:        default:
                    123:                n=0;
                    124:                break;
                    125:        }
                    126:        return n;
                    127: }
                    128: 
                    129: long
                    130: rebootwrite(Chan *c, char *a, long n, ulong offset)
                    131: {
                    132:        char buf[NUMSIZE];
                    133:        Block *bp;
                    134: 
                    135:        USED(offset);
                    136:        switch(c->qid.path & ~CHDIR){
                    137:        case Deltatqid:
                    138:                if(n > NUMSIZE-1)
                    139:                        n = NUMSIZE-1;
                    140:                memmove(buf, a, n);
                    141:                buf[n] = 0;
                    142:                deltat = strtoul(buf, 0, 0);
                    143:                break;
                    144:        case Zotqid:
                    145:                bp = allocb(0);
                    146:                bp->type = M_HANGUP;
                    147:                rebootiput(0, bp);
                    148:                break;
                    149:        default:
                    150:                error(Ebadusefd);
                    151:        }
                    152:        return n;
                    153: }
                    154: 
                    155: /*
                    156:  *  stream routines
                    157:  */
                    158: 
                    159: static void
                    160: rebootstopen(Queue *q, Stream *s)
                    161: {
                    162:        USED(q, s);
                    163:        if(strcmp(u->p->user, eve) != 0)
                    164:                error(Eperm);
                    165: }
                    166: 
                    167: void
                    168: rebootoput(Queue *q, Block *bp)
                    169: {
                    170:        PUTNEXT(q, bp);
                    171: }
                    172: 
                    173: static void
                    174: rebootiput(Queue *q, Block *bp)
                    175: {
                    176:        if(bp->type == M_HANGUP){
                    177:                tsleep(&timer, return0, 0, deltat);
                    178:                exit(0);
                    179:        }
                    180:        PUTNEXT(q, bp);
                    181: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.