annotate 3rdparty/packages/uucpbb/src/openuucp.c @ 2913:1c1600cc9f02

makefiles: Stop if a component fails to build The unconditional looping of subdirectories in the makefiles would just carry on even if one of them failed. To avoid that build errors go unnoticed, the build should stop on any error. For this, commands should be chained with "&&" and not ";" in makefile recipes.
author Tormod Volden <debian.tormod@gmail.com>
date Sun, 12 Jan 2014 01:32:45 +0100
parents 5ba8e711a1a3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1772
5ba8e711a1a3 source added
boisy
parents:
diff changeset
1 /* openuucp.c Establish a uucp connection with the remote.
5ba8e711a1a3 source added
boisy
parents:
diff changeset
2 Copyright (C) 1990, 1993 Rick Adams and Bob Billson
5ba8e711a1a3 source added
boisy
parents:
diff changeset
3
5ba8e711a1a3 source added
boisy
parents:
diff changeset
4 This file is part of the OS-9 UUCP package, UUCPbb.
5ba8e711a1a3 source added
boisy
parents:
diff changeset
5
5ba8e711a1a3 source added
boisy
parents:
diff changeset
6 This program is free software; you can redistribute it and/or modify
5ba8e711a1a3 source added
boisy
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
5ba8e711a1a3 source added
boisy
parents:
diff changeset
8 the Free Software Foundation; either version 2 of the License, or
5ba8e711a1a3 source added
boisy
parents:
diff changeset
9 (at your option) any later version.
5ba8e711a1a3 source added
boisy
parents:
diff changeset
10
5ba8e711a1a3 source added
boisy
parents:
diff changeset
11 This program is distributed in the hope that it will be useful,
5ba8e711a1a3 source added
boisy
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
5ba8e711a1a3 source added
boisy
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5ba8e711a1a3 source added
boisy
parents:
diff changeset
14 GNU General Public License for more details.
5ba8e711a1a3 source added
boisy
parents:
diff changeset
15
5ba8e711a1a3 source added
boisy
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
5ba8e711a1a3 source added
boisy
parents:
diff changeset
17 along with this program; if not, write to the Free Software
5ba8e711a1a3 source added
boisy
parents:
diff changeset
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
5ba8e711a1a3 source added
boisy
parents:
diff changeset
19
5ba8e711a1a3 source added
boisy
parents:
diff changeset
20 The author of UUCPbb, Bob Billson, can be contacted at:
5ba8e711a1a3 source added
boisy
parents:
diff changeset
21 bob@kc2wz.bubble.org or uunet!kc2wz!bob or by snail mail:
5ba8e711a1a3 source added
boisy
parents:
diff changeset
22 21 Bates Way, Westfield, NJ 07090
5ba8e711a1a3 source added
boisy
parents:
diff changeset
23 */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
24
5ba8e711a1a3 source added
boisy
parents:
diff changeset
25 #include "uucp.h"
5ba8e711a1a3 source added
boisy
parents:
diff changeset
26 #include "uucico.h"
5ba8e711a1a3 source added
boisy
parents:
diff changeset
27 #include <ctype.h>
5ba8e711a1a3 source added
boisy
parents:
diff changeset
28
5ba8e711a1a3 source added
boisy
parents:
diff changeset
29 #define DLE '\x10' /* DLE character */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
30
5ba8e711a1a3 source added
boisy
parents:
diff changeset
31 static char *handshake_ok = "Handshake successful",
5ba8e711a1a3 source added
boisy
parents:
diff changeset
32 *no_proto = "no supported protocol",
5ba8e711a1a3 source added
boisy
parents:
diff changeset
33 *startG = "start g protocol handshake",
5ba8e711a1a3 source added
boisy
parents:
diff changeset
34 *whoweare = "telling remote who we are: ";
5ba8e711a1a3 source added
boisy
parents:
diff changeset
35
5ba8e711a1a3 source added
boisy
parents:
diff changeset
36
5ba8e711a1a3 source added
boisy
parents:
diff changeset
37 /**********************************\
5ba8e711a1a3 source added
boisy
parents:
diff changeset
38 * open uucp session in master mode *
5ba8e711a1a3 source added
boisy
parents:
diff changeset
39 \**********************************/
5ba8e711a1a3 source added
boisy
parents:
diff changeset
40
5ba8e711a1a3 source added
boisy
parents:
diff changeset
41 int mopenuucp()
5ba8e711a1a3 source added
boisy
parents:
diff changeset
42 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
43 char string[200];
5ba8e711a1a3 source added
boisy
parents:
diff changeset
44 register char *p;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
45 int i;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
46
5ba8e711a1a3 source added
boisy
parents:
diff changeset
47 p = string;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
48
5ba8e711a1a3 source added
boisy
parents:
diff changeset
49 if (debuglvl > 0)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
50 fprintf (log, "mopenuucp: %s\n", startG);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
51
5ba8e711a1a3 source added
boisy
parents:
diff changeset
52 /* receive "Shere" from remote */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
53 if (recv0 (p) == TIMEDOUT)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
54 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
55 logerror ("mopenuucp: remote didn't send Shere");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
56 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
57 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
58
5ba8e711a1a3 source added
boisy
parents:
diff changeset
59 if (strncmp (p, "Shere", 5) != 0)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
60 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
61 logerror ("mopenuucp: Bad Shere string from remote");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
62
5ba8e711a1a3 source added
boisy
parents:
diff changeset
63 if (debuglvl > 3)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
64 fprintf (log, "mopenuucp: remote sent: %s\n", p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
65
5ba8e711a1a3 source added
boisy
parents:
diff changeset
66 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
67 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
68
5ba8e711a1a3 source added
boisy
parents:
diff changeset
69 if (debuglvl > 0)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
70 fputs ("mopenuucp: got Shere\n", log);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
71
5ba8e711a1a3 source added
boisy
parents:
diff changeset
72 lognorm ("Login successful");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
73
5ba8e711a1a3 source added
boisy
parents:
diff changeset
74 /* called the right remote, right? */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
75 if (*(p+5) == '=')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
76 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
77 if (strncmp (p+6, sysname, strlen (sysname)) != 0) /* oops!! */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
78 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
79 char tmp[60];
5ba8e711a1a3 source added
boisy
parents:
diff changeset
80
5ba8e711a1a3 source added
boisy
parents:
diff changeset
81 sprintf (tmp, "called wrong system (%s)", p+6);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
82 logerror (tmp);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
83 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
84 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
85 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
86 else if (*(p+5) != '\0')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
87 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
88 char tmp[65];
5ba8e711a1a3 source added
boisy
parents:
diff changeset
89
5ba8e711a1a3 source added
boisy
parents:
diff changeset
90 sprintf (tmp, "mopenuucp: Strange Shere: %s", p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
91 logerror (tmp);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
92 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
93
5ba8e711a1a3 source added
boisy
parents:
diff changeset
94 /* tell 'em who we are */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
95 sprintf (p, "S%s", nodename);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
96
5ba8e711a1a3 source added
boisy
parents:
diff changeset
97 if (debuglvl > 0)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
98 fprintf (log, "mopenuucp: %s%s\n", whoweare, p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
99
5ba8e711a1a3 source added
boisy
parents:
diff changeset
100 send0 (p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
101
5ba8e711a1a3 source added
boisy
parents:
diff changeset
102 /* find out what remote thinks of us */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
103 if (recv0 (p) == TIMEDOUT)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
104 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
105
5ba8e711a1a3 source added
boisy
parents:
diff changeset
106 if (*p != 'R')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
107 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
108 char tmp[128];
5ba8e711a1a3 source added
boisy
parents:
diff changeset
109
5ba8e711a1a3 source added
boisy
parents:
diff changeset
110 sprintf (tmp, "Bad response to handshake string (%s)", p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
111 logerror (tmp);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
112 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
113 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
114
5ba8e711a1a3 source added
boisy
parents:
diff changeset
115 if (strncmp (p+1, "OK", 2) == 0)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
116 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
117 if (debuglvl > 0)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
118 fputs ("mopenuucp: remote says we are OK\n", log);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
119 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
120 else if (strcmp (p+1, "LCK") == 0)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
121 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
122 logerror ("Remote says we are already talking");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
123 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
124 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
125 else if (strcmp (p+1, "CB") == 0)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
126 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
127 logerror ("Remote will call back");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
128 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
129 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
130 else if (strcmp (p+1, "BADSEQ") == 0)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
131 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
132 logerror ("bad sequence number");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
133 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
134 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
135 else
5ba8e711a1a3 source added
boisy
parents:
diff changeset
136 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
137 char tmp[65];
5ba8e711a1a3 source added
boisy
parents:
diff changeset
138
5ba8e711a1a3 source added
boisy
parents:
diff changeset
139 sprintf (tmp, "Handshake failed (%s)", p+1);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
140 logerror (tmp);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
141 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
142
5ba8e711a1a3 source added
boisy
parents:
diff changeset
143 /* receive list of supported protocols from remote */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
144 if (recv0 (p) == TIMEDOUT)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
145 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
146
5ba8e711a1a3 source added
boisy
parents:
diff changeset
147 /* is "g" protocol supported? */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
148 if (*p != 'P')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
149 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
150 logerror ("mopenuucp: Bad protocol handshake");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
151 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
152 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
153
5ba8e711a1a3 source added
boisy
parents:
diff changeset
154 if (strstr (p, "g") == NULL)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
155 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
156 send0 ("UN");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
157 logerror (no_proto);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
158 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
159 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
160
5ba8e711a1a3 source added
boisy
parents:
diff changeset
161 /* tell 'em to use g protocol */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
162 protocol = 'g';
5ba8e711a1a3 source added
boisy
parents:
diff changeset
163 sprintf (p, "U%c", protocol);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
164 send0 (p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
165 sprintf (p, "%s (protocol '%c')", handshake_ok, protocol);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
166 lognorm (p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
167 return (MS_SNDRCV);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
168 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
169
5ba8e711a1a3 source added
boisy
parents:
diff changeset
170
5ba8e711a1a3 source added
boisy
parents:
diff changeset
171
5ba8e711a1a3 source added
boisy
parents:
diff changeset
172 /*********************************\
5ba8e711a1a3 source added
boisy
parents:
diff changeset
173 * open uucp session in slave mode *
5ba8e711a1a3 source added
boisy
parents:
diff changeset
174 \*********************************/
5ba8e711a1a3 source added
boisy
parents:
diff changeset
175
5ba8e711a1a3 source added
boisy
parents:
diff changeset
176 int sopenuucp()
5ba8e711a1a3 source added
boisy
parents:
diff changeset
177 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
178 char string[200];
5ba8e711a1a3 source added
boisy
parents:
diff changeset
179 register char *p;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
180 char *incoming = "Incoming call from ";
5ba8e711a1a3 source added
boisy
parents:
diff changeset
181
5ba8e711a1a3 source added
boisy
parents:
diff changeset
182 p = string;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
183
5ba8e711a1a3 source added
boisy
parents:
diff changeset
184 if (debuglvl > 0)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
185 fprintf (log, "sopenuucp: %s\n", startG);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
186
5ba8e711a1a3 source added
boisy
parents:
diff changeset
187 /* send "Shere" to remote */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
188 sprintf (p, "Shere=%s", nodename);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
189
5ba8e711a1a3 source added
boisy
parents:
diff changeset
190 if (debuglvl > 0)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
191 fprintf (log, "sopenuucp: %s%s\n", whoweare, p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
192
5ba8e711a1a3 source added
boisy
parents:
diff changeset
193 send0 (p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
194
5ba8e711a1a3 source added
boisy
parents:
diff changeset
195 /* find out who they are */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
196 if (recv0 (p) == TIMEDOUT)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
197 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
198
5ba8e711a1a3 source added
boisy
parents:
diff changeset
199 if (*p != 'S')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
200 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
201 strcpy (sysname, "unknown");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
202 sprintf (p, "%s%s (port %s)", incoming, sysname, device);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
203 lognorm (p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
204 logerror ("sopenuucp: Bad introduction string");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
205 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
206 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
207
5ba8e711a1a3 source added
boisy
parents:
diff changeset
208 if (debuglvl > 0)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
209 fputs ("sopenuucp: got remote's S<hostname>\n", log);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
210
5ba8e711a1a3 source added
boisy
parents:
diff changeset
211 /* isolate system name */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
212 if ((p = strchr (string, ' ')) != NULL)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
213 *p = '\0';
5ba8e711a1a3 source added
boisy
parents:
diff changeset
214
5ba8e711a1a3 source added
boisy
parents:
diff changeset
215 p = string;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
216 strcpy (sysname, p+1);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
217
5ba8e711a1a3 source added
boisy
parents:
diff changeset
218 /* log the connection */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
219 sprintf (p, "%s%s on port %s",
5ba8e711a1a3 source added
boisy
parents:
diff changeset
220 incoming, sysname, *device != '\0' ? device : "unknown");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
221 lognorm (p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
222
5ba8e711a1a3 source added
boisy
parents:
diff changeset
223 /* Are they allowed in here? */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
224 if (SystemIsOK (FALSE) == FALSE)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
225 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
226 send0 ("RYou are unknown to me");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
227 sprintf (p, "WARNING--call from unknown system: %s", sysname);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
228 lognorm (p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
229 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
230 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
231
5ba8e711a1a3 source added
boisy
parents:
diff changeset
232 /* For now we don't tell the remote we will call them back or reject
5ba8e711a1a3 source added
boisy
parents:
diff changeset
233 the login otherwise. Instead, we tell remote that all is fine. */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
234 send0 ("ROK");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
235
5ba8e711a1a3 source added
boisy
parents:
diff changeset
236 /* send list of supported protocols to remote */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
237 send0 ("Pg");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
238
5ba8e711a1a3 source added
boisy
parents:
diff changeset
239 /* is "g" protocol okay? */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
240 if (recv0 (p) == TIMEDOUT)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
241 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
242
5ba8e711a1a3 source added
boisy
parents:
diff changeset
243 /* Ug if okay, UN if not */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
244 if (*p != 'U' || *(p+2) != '\0')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
245 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
246 logerror ("sopenuucp: Bad protocol response string");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
247 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
248 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
249
5ba8e711a1a3 source added
boisy
parents:
diff changeset
250 if (*(p+1) == 'N')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
251 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
252 logerror ("sopenuucp: No supported protocol");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
253 return (ABORT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
254 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
255 protocol = *(p+1);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
256 sprintf (string, "%s (protocol '%c')", handshake_ok, protocol);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
257 lognorm (string);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
258 return (MS_SNDRCV);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
259 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
260
5ba8e711a1a3 source added
boisy
parents:
diff changeset
261
5ba8e711a1a3 source added
boisy
parents:
diff changeset
262
5ba8e711a1a3 source added
boisy
parents:
diff changeset
263 /* Is this valid system? The remote's name is in the global variable
5ba8e711a1a3 source added
boisy
parents:
diff changeset
264 'sysname'. TRUE is returned if we talk to the remote. FALSE if not or on
5ba8e711a1a3 source added
boisy
parents:
diff changeset
265 error. */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
266
5ba8e711a1a3 source added
boisy
parents:
diff changeset
267 int SystemIsOK (quitonerror)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
268 int quitonerror;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
269 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
270 char buff[SYSLINE];
5ba8e711a1a3 source added
boisy
parents:
diff changeset
271 int sysnamlen = strlen (sysname);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
272 register char *p;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
273 char *p1;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
274 FILE *fpsys;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
275
5ba8e711a1a3 source added
boisy
parents:
diff changeset
276 p = buff;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
277
5ba8e711a1a3 source added
boisy
parents:
diff changeset
278 if ((fpsys = fopen (SYSTEMS, "r")) == NULL)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
279 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
280 openlog();
5ba8e711a1a3 source added
boisy
parents:
diff changeset
281 strcpy (p, "SystemIsOk: can't open Systems file");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
282 logerror (p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
283 closelog();
5ba8e711a1a3 source added
boisy
parents:
diff changeset
284
5ba8e711a1a3 source added
boisy
parents:
diff changeset
285 if (quitonerror)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
286 fatal (p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
287 else
5ba8e711a1a3 source added
boisy
parents:
diff changeset
288 return (FALSE);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
289 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
290
5ba8e711a1a3 source added
boisy
parents:
diff changeset
291 /* ignore comment lines beginning with #, <space>, <tab> or CR */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
292 while (mfgets (p, SYSLINE, fpsys) != NULL)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
293 if (ISCOMMENT (*p) == FALSE)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
294 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
295 /* isolate system name */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
296 if ((p1 = strchr (p, ' ')) != NULL)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
297 *p1 = '\0';
5ba8e711a1a3 source added
boisy
parents:
diff changeset
298
5ba8e711a1a3 source added
boisy
parents:
diff changeset
299 if (strucmp (sysname, p) == 0)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
300 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
301 fclose (fpsys);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
302 return (TRUE);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
303 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
304 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
305
5ba8e711a1a3 source added
boisy
parents:
diff changeset
306 /* no entry for this system */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
307 fclose (fpsys);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
308 sprintf (p, "no entry in Systems file for: %s", sysname);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
309 openlog();
5ba8e711a1a3 source added
boisy
parents:
diff changeset
310 logerror (p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
311
5ba8e711a1a3 source added
boisy
parents:
diff changeset
312 if (!quiet && log != stderr)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
313 fprintf (stderr, "%s\n\n", buff);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
314
5ba8e711a1a3 source added
boisy
parents:
diff changeset
315 return (FALSE);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
316 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
317
5ba8e711a1a3 source added
boisy
parents:
diff changeset
318
5ba8e711a1a3 source added
boisy
parents:
diff changeset
319
5ba8e711a1a3 source added
boisy
parents:
diff changeset
320 /* Receive a NULL terminated string. This is one used when no protocol is
5ba8e711a1a3 source added
boisy
parents:
diff changeset
321 being used. The basic idea for this is borrowed from Taylor (GNU) UUCP. */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
322
5ba8e711a1a3 source added
boisy
parents:
diff changeset
323 int recv0 (string)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
324 char *string;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
325 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
326 register char *p;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
327 char c;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
328 flag gotDLE = FALSE;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
329
5ba8e711a1a3 source added
boisy
parents:
diff changeset
330 if (debuglvl > 7)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
331 fputs ("<< ", log);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
332
5ba8e711a1a3 source added
boisy
parents:
diff changeset
333 /* Keep reading the port until we time out or get an ending null */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
334 p = string;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
335 while (readport (&c, PKTTIME, MAXTRY) != TIMEDOUT)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
336 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
337 /* strip any parity bit */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
338 c &= 0x7f;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
339
5ba8e711a1a3 source added
boisy
parents:
diff changeset
340 /* Log the byte if the debug level is high enough. Don't bother
5ba8e711a1a3 source added
boisy
parents:
diff changeset
341 logging the terminating null since we know it must be there. */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
342
5ba8e711a1a3 source added
boisy
parents:
diff changeset
343 if (debuglvl > 7)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
344 if (gotDLE && c == '\0')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
345 ;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
346 else
5ba8e711a1a3 source added
boisy
parents:
diff changeset
347 chardump (c);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
348
5ba8e711a1a3 source added
boisy
parents:
diff changeset
349 /* Look for the DLE to indicate the start of a null-terminated
5ba8e711a1a3 source added
boisy
parents:
diff changeset
350 message. We ignored everything until we get the DLE. */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
351 if (!gotDLE)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
352 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
353 if (c == DLE)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
354 gotDLE = TRUE;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
355
5ba8e711a1a3 source added
boisy
parents:
diff changeset
356 continue;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
357 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
358
5ba8e711a1a3 source added
boisy
parents:
diff changeset
359 /* We got the DLE, so start assembling the string until we get a
5ba8e711a1a3 source added
boisy
parents:
diff changeset
360 NULL signaling the end. */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
361
5ba8e711a1a3 source added
boisy
parents:
diff changeset
362 /* Huh? Another DLE? Something happened here. Act like it is the
5ba8e711a1a3 source added
boisy
parents:
diff changeset
363 first one we saw. */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
364 if (c == DLE)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
365 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
366 p = string;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
367 continue;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
368 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
369
5ba8e711a1a3 source added
boisy
parents:
diff changeset
370 /* Some systems send trailing \n on Shere line. This is a definite
5ba8e711a1a3 source added
boisy
parents:
diff changeset
371 no-no and should not occur...but... This mod should be safe. */ if (c == '\x0d' || c == '\x0a')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
372 c = '\0';
5ba8e711a1a3 source added
boisy
parents:
diff changeset
373
5ba8e711a1a3 source added
boisy
parents:
diff changeset
374 *p++ = c;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
375
5ba8e711a1a3 source added
boisy
parents:
diff changeset
376 if (c == '\0')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
377 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
378 if (debuglvl > 7)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
379 putc ('\n', log);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
380
5ba8e711a1a3 source added
boisy
parents:
diff changeset
381 return (TRUE);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
382 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
383 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
384 /* we must have timed out */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
385 return (TIMEDOUT);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
386 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
387
5ba8e711a1a3 source added
boisy
parents:
diff changeset
388
5ba8e711a1a3 source added
boisy
parents:
diff changeset
389
5ba8e711a1a3 source added
boisy
parents:
diff changeset
390 /* Send a NULL terminated string. This is only used when no protocol is
5ba8e711a1a3 source added
boisy
parents:
diff changeset
391 being used. */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
392
5ba8e711a1a3 source added
boisy
parents:
diff changeset
393 int send0 (string)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
394 register char *string;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
395 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
396 int lport, result, sendlen = strlen (string) + 1;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
397
5ba8e711a1a3 source added
boisy
parents:
diff changeset
398 lport = port == 0 ? 1 : port;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
399
5ba8e711a1a3 source added
boisy
parents:
diff changeset
400 if (debuglvl > 7)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
401 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
402 fputs (">> [$10]", log);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
403 strdump (string);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
404 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
405
5ba8e711a1a3 source added
boisy
parents:
diff changeset
406 /* send DLE... */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
407 if ((result = write (lport, "\x10", 1)) != 1)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
408 if (debuglvl > 0)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
409 logerror ("send0: didn't write enough data, probably won't write the rest either.");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
410
5ba8e711a1a3 source added
boisy
parents:
diff changeset
411 /* ...and the rest of the string including its ending \0 */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
412 result = write (lport, string, sendlen);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
413 return (result == sendlen ? TRUE : FALSE);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
414 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
415
5ba8e711a1a3 source added
boisy
parents:
diff changeset
416
5ba8e711a1a3 source added
boisy
parents:
diff changeset
417
5ba8e711a1a3 source added
boisy
parents:
diff changeset
418 /* dump out string for diagnostic output */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
419
5ba8e711a1a3 source added
boisy
parents:
diff changeset
420 int strdump (string)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
421 char *string;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
422 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
423 register char *c;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
424
5ba8e711a1a3 source added
boisy
parents:
diff changeset
425 for (c = string; *c != '\0'; ++c)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
426 chardump (*c);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
427
5ba8e711a1a3 source added
boisy
parents:
diff changeset
428 putc ('\n', log);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
429 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
430
5ba8e711a1a3 source added
boisy
parents:
diff changeset
431
5ba8e711a1a3 source added
boisy
parents:
diff changeset
432
5ba8e711a1a3 source added
boisy
parents:
diff changeset
433 /* Dump out a char for diagnostic output. This is called by strdump() above
5ba8e711a1a3 source added
boisy
parents:
diff changeset
434 and recv0(). */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
435
5ba8e711a1a3 source added
boisy
parents:
diff changeset
436 int chardump (c)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
437 register char c;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
438 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
439 if (isprint (c))
5ba8e711a1a3 source added
boisy
parents:
diff changeset
440 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
441 if (c == '\x0d')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
442 fputs ("<CR>", log);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
443 else if (c == '\x0a')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
444 fputs ("<LF>", log);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
445 else
5ba8e711a1a3 source added
boisy
parents:
diff changeset
446 fprintf (log, "%c", c);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
447 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
448 else
5ba8e711a1a3 source added
boisy
parents:
diff changeset
449 fprintf (log, "[$%02x]", c & 0xff);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
450 }