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