|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.