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