Annotation of researchv10dc/cmd/post/call.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Call server module
        !             3:  */
        !             4: 
        !             5: #include <stdio.h>
        !             6: #include <string.h>
        !             7: #include <malloc.h>
        !             8: #include <errno.h>
        !             9: #include "server.h"
        !            10: 
        !            11: typedef struct {
        !            12:        char    *tag;
        !            13:        char    line[BUFSIZ];
        !            14:        char    buf[BUFSIZ];
        !            15:        char    *ptr, *end;
        !            16: } call_t;
        !            17: 
        !            18: static int     stalk(), sgetc();
        !            19: extern char    *pq_open();
        !            20: 
        !            21: char *
        !            22: call_open(argv)
        !            23: char   *argv[];
        !            24: {
        !            25:        register call_t *call = (call_t *) malloc(sizeof (call_t));
        !            26: 
        !            27:        if (call->tag = pq_open(argv)) {
        !            28:                call->ptr = call->end = call->buf;
        !            29:                if (stalk(call, 0, "") != -1)
        !            30:                        return (char *) call;
        !            31:        }
        !            32:        free((char *) call);
        !            33:        return 0;
        !            34: }
        !            35: 
        !            36: call_close(call)
        !            37: call_t *call;
        !            38: {
        !            39:        register int    r1, r2;
        !            40: 
        !            41:        r1 = stalk(call, CLOSE, "");
        !            42:        if ((r2 = pq_close(call->tag)) == -1)
        !            43:                error(-1, "call: close");
        !            44:        free((char *) call);
        !            45:        return (r1 != -1 && r2 != -1) ? 0 : -1;
        !            46: }
        !            47: 
        !            48: call_read(call, argv)
        !            49: call_t *call;
        !            50: char   *argv[];
        !            51: {
        !            52:        register char   *s;
        !            53:        register int    rv;
        !            54: 
        !            55:        if ((rv = stalk(call, READ, "")) > 0) {
        !            56:                s = call->line;
        !            57:                while (s = strchr(s, VALUE))
        !            58:                        *s++ = 0, *argv++ = s;
        !            59:                *argv = 0;
        !            60:        }
        !            61:        return rv;
        !            62: }
        !            63: 
        !            64: call_write(call, argv)
        !            65: call_t *call;
        !            66: char   *argv[];
        !            67: {
        !            68:        char    line[BUFSIZ];
        !            69:        char    *a, *s = line;
        !            70: 
        !            71:        while (a = *argv++) {
        !            72:                *s++ = VALUE;
        !            73:                while (*s++ = *a++);
        !            74:                s--;
        !            75:        }
        !            76:        return stalk(call, WRITE, line);
        !            77: }
        !            78: 
        !            79: static int
        !            80: stalk(call, cmd, arg)
        !            81: call_t *call;
        !            82: char   cmd;
        !            83: char   *arg;
        !            84: {
        !            85:        register char   *s;
        !            86:        register int    c;
        !            87: 
        !            88:        if (cmd) {
        !            89:                s = call->line;
        !            90:                *s++ = cmd;
        !            91:                if (arg) {
        !            92:                        while (*s++ = *arg++);
        !            93:                        s--;
        !            94:                }
        !            95:                *s++ = '\n';
        !            96:                c = s - call->line;
        !            97:                if (pq_write(call->tag, call->line, c) != c)
        !            98:                        return error(-1, "call: write");
        !            99:        }
        !           100:        switch (c = sgetc(call)) {
        !           101:        case EOF:
        !           102:                return -1;
        !           103:        case PROMPT:
        !           104:                return 0;
        !           105:        case '\n':
        !           106:        case VALUE:
        !           107:        case ERROR:
        !           108:                s = call->line;
        !           109:                while (c != EOF && c != '\n')
        !           110:                        *s++ = c, c = sgetc(call);
        !           111:                if (c == EOF)
        !           112:                        return -1;
        !           113:                *s = 0;
        !           114:                if (sgetc(call) == PROMPT)
        !           115:                        return (*call->line != ERROR) ? 1
        !           116:                                : error(0, "%s", call->line + 1);
        !           117:                /* fall thru */
        !           118:        default:
        !           119:                return error(0, "call: Protocol error");
        !           120:        }
        !           121: }
        !           122: 
        !           123: static int
        !           124: sgetc(call)
        !           125: register call_t        *call;
        !           126: {
        !           127:        if (call->ptr == call->end) {
        !           128:                int n = pq_read(call->tag, call->buf, sizeof call->buf);
        !           129:                if (n <= 0) {
        !           130:                        error(n == 0 ? EPIPE : -1, "call: read");
        !           131:                        return EOF;
        !           132:                }
        !           133:                call->ptr = call->buf;
        !           134:                call->end = call->buf + n;
        !           135:        }
        !           136:        return *call->ptr++;
        !           137: }

unix.superglobalmegacorp.com

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