Annotation of 43BSDTahoe/new/xns/xnslib/server.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * This file implements server functions for the XNS courier library
        !             3:  */
        !             4: 
        !             5: /*
        !             6:  $Log: server.c,v $
        !             7:  * Revision 2.2  86/12/10  14:21:10  ed
        !             8:  * Reset _serverConnection->abortseen in ReceiveCallMessage
        !             9:  * 
        !            10:  * Revision 2.1  86/11/11  09:33:42  jqj
        !            11:  * In ReceiveCallMessage, set state to inprogress so server BDT will work
        !            12:  * right.
        !            13:  * 
        !            14:  * Revision 2.0  85/11/21  07:22:19  jqj
        !            15:  * 4.3BSD standard release
        !            16:  * 
        !            17:  * Revision 1.3  85/03/11  16:37:39  jqj
        !            18:  * *** empty log message ***
        !            19:  * 
        !            20:  * Revision 1.3  85/03/11  16:37:39  jqj
        !            21:  * Public alpha-test version, released 11 March 1985
        !            22:  * 
        !            23:  * Revision 1.2  85/01/27  07:37:43  jqj
        !            24:  * finished but undebugged version
        !            25:  * 
        !            26:  * Revision 1.1  85/1/4  2:40:00  jqj
        !            27:  * Initial revision -- Mogul's tcp-based version
        !            28:  */
        !            29: #ifndef lint
        !            30: static char rcsid[] = "$Header: server.c,v 2.2 86/12/10 14:21:10 ed Exp $";
        !            31: #endif
        !            32: 
        !            33: #include <stdio.h>
        !            34: #include <sys/time.h>
        !            35: #include <sys/types.h>         /* for ns.h */
        !            36: #include <sys/socket.h>
        !            37: #include <netns/ns.h>          /* for XNS addresses and courierconnectin.h */
        !            38: #include <netns/sp.h>          /* for spphdr */
        !            39: #include "courier.h"
        !            40: #include "realcourierconnection.h"
        !            41: #include <except.h>
        !            42: #include <ctype.h>
        !            43: 
        !            44: #if DEBUG
        !            45: int CourierServerDebuggingFlag = 0;
        !            46: #endif
        !            47: 
        !            48: /*
        !            49:  * Message stream handle.
        !            50:  */
        !            51: CourierConnection *_serverConnection = 0;
        !            52: Unspecified tid;                               /* transaction ID */
        !            53: 
        !            54: 
        !            55: /* CALL, transaction id, prognumh, prognuml, version, procedurenum */
        !            56: #define CALLHDRLEN 6
        !            57: 
        !            58: 
        !            59: Unspecified *
        !            60: ReceiveCallMessage(procp, skipcount, skippedwords)
        !            61:        Cardinal *procp;
        !            62:        int skipcount;
        !            63:        Unspecified *skippedwords;
        !            64: {
        !            65:        Cardinal msgtype, version;
        !            66:        LongCardinal programnumber;
        !            67:        Unspecified *buf, *bp, hdrbuf[CALLHDRLEN];
        !            68:        int i;
        !            69: 
        !            70:        if (skipcount > 1 && _serverConnection->state == wantversion) {
        !            71:                skipcount -= 2;
        !            72:                _serverConnection->state = inprogress;  /* per Ed Flint */
        !            73:                skippedwords += 2;
        !            74:        }
        !            75: 
        !            76:        if (skipcount > CALLHDRLEN) {
        !            77:                fprintf(stderr,"ReceiveCallMessage:  skipcount=%d, too big\n",
        !            78:                        skipcount);
        !            79:                exit(1);
        !            80:        }
        !            81: 
        !            82:        _serverConnection->abortseen= FALSE;            /* reset */
        !            83: 
        !            84:        for (i=0; i < skipcount; i++)
        !            85:                hdrbuf[i] = skippedwords[i];
        !            86:        buf = ReadMessage(_serverConnection, hdrbuf+skipcount,
        !            87:                          CALLHDRLEN-skipcount);
        !            88:        bp = hdrbuf;
        !            89:        bp += internalize_Cardinal(&msgtype, bp);
        !            90:        bp += internalize_Unspecified(&tid, bp);
        !            91:        bp += internalize_LongCardinal(&programnumber, bp);
        !            92:        bp += internalize_Cardinal(&version, bp);
        !            93:        bp += internalize_Cardinal(procp, bp);
        !            94: #if DEBUG
        !            95:        if (CourierServerDebuggingFlag)
        !            96:                fprintf(stderr, "[ReceiveCallMessage %D %d %d]\n",
        !            97:                                programnumber, version, *procp);
        !            98: #endif
        !            99:        return(buf);
        !           100: }
        !           101: 
        !           102: 
        !           103: SendReturnMessage(nwords, results)
        !           104:        Cardinal nwords;
        !           105:        Unspecified *results;
        !           106: {
        !           107: #define RETHDRLEN 2
        !           108:        Unspecified *bp, buf[RETHDRLEN];
        !           109:        static Cardinal msgtype = RETURN;
        !           110: 
        !           111: #if DEBUG
        !           112:        if (CourierServerDebuggingFlag)
        !           113:                fprintf(stderr, "[SendReturnMessage %d]\n", nwords);
        !           114: #endif
        !           115:        bp = buf;
        !           116:        bp += externalize_Cardinal(&msgtype, bp);
        !           117:        bp += externalize_Unspecified(&tid, bp);
        !           118:        CourierWrite(_serverConnection, (bp-buf), buf, nwords, results);
        !           119:        _serverConnection->bdtstate = wantdata;
        !           120: }
        !           121: 
        !           122: 
        !           123: static int
        !           124: ServerInit(argc, argv, skippedwords)
        !           125:        int argc;
        !           126:        char *argv[];
        !           127:        Unspecified skippedwords[];
        !           128: {
        !           129:        extern char *malloc();
        !           130:        int skipcount;
        !           131: #if DEBUG
        !           132:        int namelen;
        !           133: #endif
        !           134:        int i;
        !           135: 
        !           136:        _serverConnection = (CourierConnection *)
        !           137:                        malloc(sizeof(CourierConnection));
        !           138:        _serverConnection->bdtstate = wantdata;
        !           139:        /* we normally don't bother to set up host, since the server will
        !           140:         * never reopen a closed connection
        !           141:         */
        !           142: #if DEBUG
        !           143:        namelen = sizeof(struct sockaddr_ns);
        !           144:        getpeername(_serverConnection->fd, &_serverConnection->host, &namelen);
        !           145:        fprintf(stderr,"[ServerInit: argc=%d]\n",argc);
        !           146:        for (i=0; i<argc; i++) fprintf(stderr,"\targv[%d]=%s\n", i,argv[i]);
        !           147: 
        !           148: #endif
        !           149:        skipcount = -1;
        !           150:        while (argc-- > 0) {
        !           151: #if DEBUG
        !           152:                if (strcmp(argv[0],"-d") == 0)
        !           153:                        CourierServerDebuggingFlag = 1;
        !           154:                else
        !           155: #endif
        !           156:                if (isdigit(*argv[0])) {
        !           157:                        if (skipcount < 0) {
        !           158:                                _serverConnection->fd = atoi(argv[0]);
        !           159:                                skipcount++;
        !           160:                        }
        !           161:                        else if (skipcount < 8)
        !           162:                                skippedwords[skipcount++] = atoi(argv[0]);
        !           163:                }
        !           164:                argv++;
        !           165:        }
        !           166:        if (skipcount < 0 || skipcount == 1) {
        !           167:                fprintf(stderr,"in ServerInit, skipcount=%d\n",skipcount);
        !           168:                exit(1);
        !           169:        }
        !           170:        _serverConnection->state = wantversion;
        !           171:        return(skipcount);
        !           172: }
        !           173: 
        !           174: 
        !           175: main(argc, argv)
        !           176:        int argc;
        !           177:        char *argv[];
        !           178: {
        !           179:        /*
        !           180:         * The caller may need to read a packet before getting to the
        !           181:         * program/version which it needs for dispatching.  Data so read
        !           182:         * is passed in the argv list, and used to set skipcount and
        !           183:         * skippedwords.
        !           184:         */
        !           185:        int skipcount;  /* actual length of skippedwords */
        !           186:        Unspecified skippedwords[8];
        !           187: 
        !           188:        /* ServerInit() contains server-independent startup code */
        !           189:        skipcount = ServerInit(argc, argv, skippedwords);
        !           190: 
        !           191:        /* Server() may terminate in 2 ways:
        !           192:         * (1)  normally, with a return(0) and a closed connection,
        !           193:         *      either from our timeout or from END sent by client.
        !           194:         * (2)  abnormally, with an exit(1) indicating a protocol
        !           195:         *      violation.  We do not currently close down the
        !           196:         *      connection in all such cases, but we should.
        !           197:         * Note that Server may also exec() a different server if
        !           198:         *      a remote procedure for a different program arrives.
        !           199:         */
        !           200:        Server(skipcount, skippedwords);
        !           201:        exit(0);
        !           202: }

unix.superglobalmegacorp.com

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