|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)imsg.c 5.4 (Berkeley) 2/24/88";
3: #endif
4:
5: #include "uucp.h"
6: #include <ctype.h>
7:
8: char Msync[2] = "\020";
9:
10: /* to talk to both eunice and x.25 without also screwing up tcp/ip
11: * we must adaptively choose what character to end the msg with
12: *
13: * The idea is that initially we send ....\000\n
14: * Then, after they have sent us a message, we use the first character
15: * they send.
16: */
17:
18: int seenend = 0;
19: char Mend = '\0';
20:
21: /*
22: * this is the initial read message routine -
23: * used before a protocol is agreed upon.
24: *
25: * return codes:
26: * FAIL - no more messages
27: * SUCCESS - message returned
28: */
29:
30: imsg(amsg, fn)
31: char *amsg;
32: register int fn;
33: {
34: register char *msg = amsg;
35: register int nchars = 0;
36: int foundsync = FAIL;
37: char c;
38:
39: DEBUG(5, "imsg looking for SYNC<", CNULL);
40: for (;;) {
41: if (read(fn, &c, 1) != 1)
42: return FAIL;
43: DEBUG(9,"\t%o", c&0377);
44: c &= 0177;
45: if (c == '\n' || c == '\r')
46: DEBUG(5, "%c", c);
47: else
48: DEBUG(5, (isprint(c) || isspace(c)) ? "%c" : "\\%o",
49: c & 0377);
50: c &= 0177;
51: if (c == Msync[0]) {
52: DEBUG(5, ">\nimsg input<", CNULL);
53: msg = amsg;
54: nchars = 0;
55: foundsync = SUCCESS;
56: continue;
57: } else if (foundsync != SUCCESS)
58: continue;
59: if (c == '\n' || c == '\0') {
60: if (!seenend) {
61: Mend = c;
62: seenend++;
63: DEBUG(9, "\nUsing \\%o as End of message char\n", Mend);
64: }
65: break;
66: }
67: *msg++ = c;
68: /* MAXFULLNAME should really be passed in as a parameter */
69: if (nchars++ > MAXFULLNAME) {
70: DEBUG(1, "buffer overrun in imsg", CNULL);
71: return FAIL;
72: }
73: fflush(stderr);
74: }
75: *msg = '\0';
76: DEBUG(5, ">got %d characters\n", strlen(amsg));
77: return foundsync;
78: }
79:
80:
81: /*
82: * this is the initial write message routine -
83: * used before a protocol is agreed upon.
84: *
85: * return code: always 0
86: */
87:
88: omsg(type, msg, fn)
89: register char *msg;
90: char type;
91: int fn;
92: {
93: char buf[MAXFULLNAME];
94: register char *c;
95:
96: c = buf;
97: *c = '\0'; /* avoid pdp 11/23,40 auto-incr stack trap bug */
98: *c++ = Msync[0];
99: *c++ = type;
100: while (*msg)
101: *c++ = *msg++;
102: *c++ = '\0';
103: DEBUG(5, "omsg <%s>\n", buf);
104: if (seenend)
105: c[-1] = Mend;
106: else
107: *c++ = '\n';
108: write(fn, buf, (int)(c - buf));
109: return 0;
110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.