Annotation of researchv8dc/sys/chaosld/chservice.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *             C H  S E R V I C E
        !             3:  *
        !             4:  * Built-in services for the Chaosnet line discipline.
        !             5:  *
        !             6:  *
        !             7:  * (c) Copyright 1984  Nirvonics, Inc.
        !             8:  *
        !             9:  * Written by Kurt Gollhardt
        !            10:  * Last update Tue Nov 13 14:27:51 1984
        !            11:  *
        !            12:  * This software is the property of Nirvonics, Inc.
        !            13:  * All rights reserved.
        !            14:  *
        !            15:  */
        !            16: 
        !            17: #include "ch.h"
        !            18: #if NCH > 0
        !            19: #include "../h/param.h"
        !            20: #include "../h/systm.h"
        !            21: #include "../chaosld/types.h"
        !            22: #include "../chaosld/constants.h"
        !            23: #include "../chaosld/globals.h"
        !            24: #include "../chaosld/chrouteld.h"
        !            25: 
        !            26: extern struct chroute    Chroute[];
        !            27: 
        !            28: static    status_rfc(), time_rfc(), uptime_rfc(), dumprt_rfc();
        !            29: 
        !            30: struct service Chservice[] = {
        !            31:      "STATUS",                6,   status_rfc,
        !            32:      "TIME",                  4,   time_rfc,
        !            33:      "UPTIME",                6,   uptime_rfc,
        !            34:      "DUMP-ROUTING-TABLE",    18,  dumprt_rfc,
        !            35:      0,                       0,   0
        !            36: };
        !            37: 
        !            38: /*
        !            39:  * process a RFC for contact name STATUS
        !            40:  */
        !            41: static status_rfc(pkt)
        !            42:      register struct packet   *pkt;
        !            43: {
        !            44:      register struct chroute  *r;
        !            45:      register struct chif     *ifp;
        !            46:      struct statdata     sd;
        !            47: 
        !            48:      free_pkdata(pkt);
        !            49:      append_packet(pkt, Chmyname, CHSTATNAME);
        !            50: 
        !            51:      for (r = Chroute; r < &Chroute[CHNSUBNET]; r++)
        !            52:           if (r->rt_type == CHDIRECT) {
        !            53:                ifp = r->rt_path.ifp;
        !            54:                sd.sb_ident = 0400 + ifp->my_addr.ch_subnet;
        !            55:                sd.sb_nshorts = sizeof(struct statxcvr) / sizeof(short);
        !            56:                sd.sb_xstat = ifp->if_stat;
        !            57: #ifdef pdp11
        !            58:                swaplong(&sd.sb_xstat,
        !            59:                     sizeof(struct statxcvr) / sizeof(long));
        !            60: #endif
        !            61:                append_packet(pkt, &sd, sizeof(sd));
        !            62:           }
        !            63: 
        !            64:      pkt->pk_op = ANSOP;
        !            65:      pkt->pk_didx.ci_idx = pkt->pk_pkn = pkt->pk_ackn = 0;
        !            66:      reflect(pkt);
        !            67: }
        !            68: 
        !            69: /*
        !            70:  * process an RFC for contact name TIME 
        !            71:  */
        !            72: static time_rfc(pkt)
        !            73:      register struct packet   *pkt;
        !            74: {
        !            75:      long t;
        !            76: 
        !            77:      pkt->pk_op = ANSOP;
        !            78:      pkt->pk_pkn = pkt->pk_ackn = 0;
        !            79:      ch_time(&t);
        !            80: #ifdef pdp11
        !            81:           swaplong(&t, 1);
        !            82: #endif pdp11
        !            83:      free_pkdata(pkt);
        !            84:      append_packet(pkt, &t, sizeof(long));
        !            85:      reflect(pkt);
        !            86: }
        !            87: 
        !            88: /*
        !            89:  * process an RFC for contact name UPTIME
        !            90:  */
        !            91: static uptime_rfc(pkt)
        !            92:      register struct packet   *pkt;
        !            93: {
        !            94:      long t;
        !            95: 
        !            96:      pkt->pk_op = ANSOP;
        !            97:      pkt->pk_pkn = pkt->pk_ackn = 0;
        !            98:      ch_uptime(&t);
        !            99: #ifdef pdp11
        !           100:      swaplong(&t, 1);
        !           101: #endif pdp11
        !           102:      free_pkdata(pkt);
        !           103:      append_packet(pkt, &t, sizeof(long));
        !           104:      reflect(pkt);
        !           105: }
        !           106: 
        !           107: /*
        !           108:  * process an RFC for contact name DUMP-ROUTING-TABLE
        !           109:  */
        !           110: static dumprt_rfc(pkt)
        !           111:      register struct packet   *pkt;
        !           112: {
        !           113:      register struct chroute  *r;
        !           114:      register int        ndirect, i;
        !           115:      struct {
        !           116:           short     word1, word2;
        !           117:      } sd;
        !           118: 
        !           119:      free_pkdata(pkt);
        !           120:      ndirect = i = 0;
        !           121:      for (r = Chroute; r < &Chroute[CHNSUBNET]; r++, i++) {
        !           122:           sd.word2 = r->rt_cost;
        !           123:           if (r->rt_type == CHDIRECT)
        !           124:                sd.word1 = (ndirect++ << 1) + 1;
        !           125:           else if (r->rt_type != CHNOPATH)
        !           126:                sd.word1 = r->rt_path.bridge.ch_addr;
        !           127:           else
        !           128:               sd.word1 = 0;
        !           129:           append_packet(pkt, &sd, sizeof(sd));
        !           130:      }
        !           131: 
        !           132:      pkt->pk_op = ANSOP;
        !           133:      pkt->pk_didx.ci_idx = pkt->pk_pkn = pkt->pk_ackn = 0;
        !           134:      reflect(pkt);
        !           135: }
        !           136: 
        !           137: #endif

unix.superglobalmegacorp.com

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