|
|
1.1 root 1: /* vmhsbr.c - routines to help vmh along */
2:
3: /* TODO (for vrsn 2):
4: INI: include width of windows
5: */
6:
7: #include "../h/mh.h"
8: #include "../h/vmhsbr.h"
9: #include <stdio.h>
10:
11: /* */
12:
13: static char *types[] = {
14: "OK",
15: "INI", "ACK", "ERR", "CMD", "QRY", "TTY", "WIN", "DATA", "EOF", "FIN",
16: "XXX", NULL
17: };
18:
19: static FILE *fp = NULL;
20:
21: static int PEERrfd = NOTOK;
22: static int PEERwfd = NOTOK;
23:
24:
25: extern int errno;
26: extern int sys_nerr;
27: extern char *sys_errlist[];
28:
29: /* */
30:
31: int rcinit (rfd, wfd)
32: int rfd,
33: wfd;
34: {
35: char *cp,
36: buffer[BUFSIZ];
37:
38: PEERrfd = rfd;
39: PEERwfd = wfd;
40:
41: if ((cp = getenv ("MHVDEBUG"))
42: && *cp
43: && (fp = fopen (sprintf (buffer, "%s.out", invo_name), "w"))) {
44: (void) fseek (fp, 0L, 2);
45: fprintf (fp, "%d: rcinit (%d, %d)\n", getpid (), rfd, wfd);
46: (void) fflush (fp);
47: }
48:
49: return OK;
50: }
51:
52:
53: int rcdone () {
54: if (PEERrfd != NOTOK)
55: (void) close (PEERrfd);
56: if (PEERwfd != NOTOK)
57: (void) close (PEERwfd);
58:
59: if (fp) {
60: (void) fclose (fp);
61: fp = NULL;
62: }
63: return OK;
64: }
65:
66: /* */
67:
68: int rc2rc (code, len, data, rc)
69: char code;
70: int len;
71: char *data;
72: struct record *rc;
73: {
74: if (rc2peer (code, len, data) == NOTOK)
75: return NOTOK;
76:
77: return peer2rc (rc);
78: }
79:
80:
81: int str2rc (code, str, rc)
82: char code;
83: char *str;
84: struct record *rc;
85: {
86: return rc2rc (code, str ? strlen (str) : 0, str, rc);
87: }
88:
89: /* */
90:
91: int peer2rc (rc)
92: register struct record *rc;
93: {
94: if (rc -> rc_data)
95: free (rc -> rc_data);
96:
97: if (read (PEERrfd, (char *) rc_head (rc), RHSIZE (rc)) != RHSIZE (rc))
98: return rclose (rc, "read from peer lost(1)");
99: if (rc -> rc_len) {
100: if ((rc -> rc_data = malloc ((unsigned) rc -> rc_len)) == NULL)
101: return rclose (rc, "malloc of %d lost", rc -> rc_len);
102: if (read (PEERrfd, rc -> rc_data, rc -> rc_len) != rc -> rc_len)
103: return rclose (rc, "read from peer lost(2)");
104: rc -> rc_data[rc -> rc_len] = NULL;
105: }
106: else
107: rc -> rc_data = NULL;
108:
109: if (fp) {
110: (void) fseek (fp, 0L, 2);
111: fprintf (fp, "%d: <--- %s %d: \"%*.*s\"\n", getpid (),
112: types[rc -> rc_type], rc -> rc_len,
113: rc -> rc_len, rc -> rc_len, rc -> rc_data);
114: (void) fflush (fp);
115: }
116:
117: return rc -> rc_type;
118: }
119:
120: /* */
121:
122: int rc2peer (code, len, data)
123: char code;
124: int len;
125: char *data;
126: {
127: struct record rcs;
128: register struct record *rc = &rcs;
129:
130: rc -> rc_type = code;
131: rc -> rc_len = len;
132:
133: if (fp) {
134: (void) fseek (fp, 0L, 2);
135: fprintf (fp, "%d: ---> %s %d: \"%*.*s\"\n", getpid (),
136: types[rc -> rc_type], rc -> rc_len,
137: rc -> rc_len, rc -> rc_len, data);
138: (void) fflush (fp);
139: }
140:
141: if (write (PEERwfd, (char *) rc_head (rc), RHSIZE (rc)) != RHSIZE (rc))
142: return rclose (rc, "write to peer lost(1)");
143:
144: if (rc -> rc_len)
145: if (write (PEERwfd, data, rc -> rc_len) != rc -> rc_len)
146: return rclose (rc, "write to peer lost(2)");
147:
148: return OK;
149: }
150:
151: /* */
152:
153: int str2peer (code, str)
154: char code;
155: char *str;
156: {
157: return rc2peer (code, str ? strlen (str) : 0, str);
158: }
159:
160:
161: /* VARARGS2 */
162:
163: int fmt2peer (code, fmt, a, b, c, d, e, f)
164: char code;
165: char *fmt,
166: *a,
167: *b,
168: *c,
169: *d,
170: *e,
171: *f;
172: {
173: return err2peer (code, NULLCP, fmt, a, b, c, d, e, f);
174: }
175:
176: /* */
177:
178: /* VARARGS3 */
179:
180: int err2peer (code, what, fmt, a, b, c, d, e, f)
181: char code;
182: char *what,
183: *fmt,
184: *a,
185: *b,
186: *c,
187: *d,
188: *e,
189: *f;
190: {
191: int eindex = errno;
192: register char *bp;
193: char buffer[BUFSIZ * 2];
194:
195: (void) sprintf (buffer, fmt, a, b, c, d, e, f);
196: bp = buffer + strlen (buffer);
197: if (what) {
198: if (*what) {
199: (void) sprintf (bp, " %s: ", what);
200: bp += strlen (bp);
201: }
202: if (eindex > 0 && eindex < sys_nerr)
203: (void) strcpy (bp, sys_errlist[eindex]);
204: else
205: (void) sprintf (bp, "Error %d", eindex);
206: bp += strlen (bp);
207: }
208:
209: return rc2peer (code, bp - buffer, buffer);
210: }
211:
212: /* */
213:
214: /* VARARGS2 */
215:
216: static int rclose (rc, fmt, a, b, c, d, e, f)
217: register struct record *rc;
218: char *fmt,
219: *a,
220: *b,
221: *c,
222: *d,
223: *e,
224: *f;
225: {
226: static char buffer[BUFSIZ * 2];
227:
228: (void) sprintf (buffer, fmt, a, b, c, d, e, f);
229:
230: rc -> rc_len = strlen (rc -> rc_data = getcpy (buffer));
231: return (rc -> rc_type = RC_XXX);
232: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.