Annotation of lucent/sys/src/9/port/devicmp.c, revision 1.1.1.1

1.1       root        1: #include       "u.h"
                      2: #include       "../port/lib.h"
                      3: #include       "mem.h"
                      4: #include       "dat.h"
                      5: #include       "fns.h"
                      6: #include       "../port/error.h"
                      7: #include       "arp.h"
                      8: #include       "../port/ipdat.h"
                      9: 
                     10: #include       "devtab.h"
                     11: 
                     12: static Streamput       icmpoput;
                     13: static Streamopen      icmpstopen;
                     14: static Streamclose     icmpstclose;
                     15: static void            icmprcvmsg(Ipifc*, Block*);
                     16: 
                     17: Qinfo icmpinfo  = { 0,    icmpoput,    icmpstopen,    icmpstclose,    "icmp"  };
                     18: 
                     19: static struct {
                     20:        QLock;
                     21:        Queue   *rq;
                     22:        Ipifc   *ifc;
                     23: } icmp;
                     24: 
                     25: Ipifc  *ipifc[];
                     26: 
                     27: /*
                     28:  *  device interface
                     29:  */
                     30: Dirtab icmptab[]={
                     31:        "icmp",         {Sdataqid},             0,      0666,
                     32: };
                     33: #define Nicmptab (sizeof(icmptab)/sizeof(Dirtab))
                     34: 
                     35: void
                     36: icmpreset(void)
                     37: {
                     38: }
                     39: 
                     40: void
                     41: icmpinit(void)
                     42: {
                     43:        Ipifc **p;
                     44: 
                     45:        /* add into protocol list */
                     46:        for(p = ipifc; *p; p++)
                     47:                ;
                     48:        icmp.ifc = *p = xalloc(sizeof(Ipifc));
                     49:        icmp.ifc->name = "icmp";
                     50: }
                     51: 
                     52: Chan *
                     53: icmpattach(char *spec)
                     54: {
                     55:        return devattach('Q', spec);
                     56: }
                     57: 
                     58: Chan *
                     59: icmpclone(Chan *c, Chan *nc)
                     60: {
                     61:        return devclone(c, nc);
                     62: }
                     63: 
                     64: int
                     65: icmpwalk(Chan *c, char *name)
                     66: {
                     67:        return devwalk(c, name, icmptab, (long)Nicmptab, devgen);
                     68: }
                     69: 
                     70: void
                     71: icmpstat(Chan *c, char *db)
                     72: {
                     73:        devstat(c, db, icmptab, (long)Nicmptab, devgen);
                     74: }
                     75: 
                     76: Chan *
                     77: icmpopen(Chan *c, int omode)
                     78: {
                     79:        if(c->qid.path == CHDIR){
                     80:                if(omode != OREAD)
                     81:                        error(Eperm);
                     82:        } else
                     83:                streamopen(c, &icmpinfo);
                     84:        c->mode = openmode(omode);
                     85:        c->flag |= COPEN;
                     86:        c->offset = 0;
                     87:        return c;
                     88: }
                     89: 
                     90: void
                     91: icmpcreate(Chan *c, char *name, int omode, ulong perm)
                     92: {
                     93:        USED(c, name, omode, perm);
                     94:        error(Eperm);
                     95: }
                     96: 
                     97: void
                     98: icmpremove(Chan *c)
                     99: {
                    100:        USED(c);
                    101:        error(Eperm);
                    102: }
                    103: 
                    104: void
                    105: icmpwstat(Chan *c, char *dp)
                    106: {
                    107:        USED(c, dp);
                    108:        error(Eperm);
                    109: }
                    110: 
                    111: void
                    112: icmpclose(Chan *c)
                    113: {
                    114:        if((c->qid.path&CHDIR) == 0)
                    115:                streamclose(c);
                    116: }
                    117: 
                    118: long
                    119: icmpread(Chan *c, void *a, long n, ulong offset)
                    120: {
                    121:        USED(offset);
                    122: 
                    123:        if(c->qid.path&CHDIR)
                    124:                return devdirread(c, a, n, icmptab, Nicmptab, devgen);
                    125:        return streamread(c, a, n);
                    126: }
                    127: 
                    128: long
                    129: icmpwrite(Chan *c, char *a, long n, ulong offset)
                    130: {
                    131:        USED(offset);
                    132: 
                    133:        return streamwrite(c, a, n, 1);
                    134: }
                    135: 
                    136: static void
                    137: icmpstclose(Queue *q)
                    138: {
                    139:        USED(q);
                    140:        qlock(&icmp);
                    141:        icmp.rq = 0;
                    142:        qunlock(&icmp);
                    143: }
                    144: 
                    145: static void
                    146: icmpstopen(Queue *q, Stream *s)
                    147: {
                    148:        USED(s);
                    149:        initipifc(icmp.ifc, IP_ICMPPROTO, icmprcvmsg);
                    150:        icmp.rq = q;
                    151: }
                    152: 
                    153: static void
                    154: icmprcvmsg(Ipifc *ifc, Block *bp)
                    155: {
                    156:        USED(ifc);
                    157: 
                    158:        qlock(&icmp);
                    159:        if(icmp.rq == 0 || QFULL(icmp.rq->next))
                    160:                freeb(bp);
                    161:        else
                    162:                PUTNEXT(icmp.rq, bp);
                    163:        qunlock(&icmp);
                    164: }
                    165: 
                    166: static void
                    167: icmpoput(Queue *q, Block *bp)
                    168: {
                    169:        USED(q);
                    170:        ipmuxoput(0, bp);
                    171: }

unix.superglobalmegacorp.com

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