xref: /illumos-gate/usr/src/cmd/bnu/xio.c (revision 34bbc83afbf22a6f8e504cb99d76c97c017cb5f4)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
28 /*	  All Rights Reserved  	*/
29 
30 #include "uucp.h"
31 
32 #ifdef X_PROTOCOL
33 
34 #define XBUFSIZ 512
35 static jmp_buf Xfailbuf;
36 extern int xrdblk();
37 extern unsigned msgtime;
38 
39 /*
40  * x.25 protocol
41  */
42 /* ARGSUSED */
43 static void
44 xalarm(sig)
45 int sig;
46 {
47 	longjmp(Xfailbuf, 1);
48 }
49 
50 static void (*xsig)();
51 
52 /*
53  * turn on protocol timer
54  */
55 int
56 xturnon()
57 {
58 	xsig=signal(SIGALRM, xalarm);
59 	return(0);
60 }
61 
62 int
63 xturnoff()
64 {
65 	(void) signal(SIGALRM, xsig);
66 	return(0);
67 }
68 
69 /*
70  * write message across x.25 link
71  *	type	-> message type
72  *	str	-> message body (ascii string)
73  *	fn	-> x.25 file descriptor
74  * return
75  *	0
76  */
77 int
78 xwrmsg(type, str, fn)
79 char *str;
80 int fn;
81 char type;
82 {
83 	char *s;
84 	char bufr[XBUFSIZ];
85 
86 	bufr[0] = type;
87 	s = &bufr[1];
88 	while (*str)
89 		*s++ = *str++;
90 	*s = '\0';
91 	if (*(--s) == '\n')
92 		*s = '\0';
93 	(void) (*Write)(fn, bufr, strlen(bufr) + 1);
94 	return(0);
95 }
96 
97 /*
98  * read message from x.25 link
99  *	str	-> message buffer
100  *	fn	-> x.25 file descriptor
101  * return
102  *	FAIL	-> send timed out
103  *	0	-> ok message in str
104  */
105 int
106 xrdmsg(char *str, int fn)
107 {
108 	int len;
109 
110 	if(setjmp(Xfailbuf))
111 		return(FAIL);
112 
113 	(void) alarm(msgtime);
114 	for (;;) {
115 		if( (len = (*Read)(fn, str, XBUFSIZ)) == 0)
116 			continue;
117 		if (len < 0) {
118 			(void) alarm(0);
119 			return(FAIL);
120 		}
121 		str += len;
122 		if (*(str - 1) == '\0')
123 			break;
124 	}
125 	(void) alarm(0);
126 	return(0);
127 }
128 
129 /*
130  * read data from file fp1 and write
131  * on x.25 link
132  *	fp1	-> file descriptor
133  *	fn	-> x.25 descriptor
134  * returns:
135  *	FAIL	->failure in x.25 link
136  *	0	-> ok
137  */
138 int
139 xwrdata(FILE *fp1, int fn)
140 {
141 	int fd1;
142 	int len, ret;
143 	unsigned long bytes;
144 	char bufr[XBUFSIZ];
145 
146 	bytes = 0L;
147 	fd1 = fileno( fp1 );
148 	while ((len = read( fd1, bufr, XBUFSIZ )) > 0) {
149 		bytes += len;
150 		putfilesize(bytes);
151 		ret = (*Write)(fn, bufr, len);
152 		if (ret != len) {
153 			return(FAIL);
154 		}
155 		if (len != XBUFSIZ)
156 			break;
157 	}
158 	ret = (*Write)(fn, bufr, 0);
159 	return(0);
160 }
161 
162 /*
163  * read data from x.25 link and
164  * write into file
165  *	fp2	-> file descriptor
166  *	fn	-> x.25 descriptor
167  * returns:
168  *	0	-> ok
169  *	FAIL	-> failure on x.25 link
170  */
171 int
172 xrddata(int fn, FILE *fp2)
173 {
174 	int fd2;
175 	int len;
176 	int ret = SUCCESS;
177 	unsigned long bytes;
178 	char bufr[XBUFSIZ];
179 
180 	bytes = 0L;
181 	fd2 = fileno( fp2 );
182 	for (;;) {
183 		len = xrdblk(bufr, XBUFSIZ, fn);
184 		if (len < 0) {
185 			return(FAIL);
186 		}
187 		bytes += len;
188 		putfilesize(bytes);
189 		if( ret == SUCCESS && write( fd2, bufr, len ) != len )
190 			ret = errno;
191 		if (len < XBUFSIZ)
192 			break;
193 	}
194 	return(ret);
195 }
196 
197 /*
198  * read blank from x.25 link
199  * reads are timed
200  *	blk	-> address of buffer
201  *	len	-> size to read
202  *	fn	-> x.25 descriptor
203  * returns:
204  *	FAIL	-> link error timeout on link
205  *	i	-> # of bytes read
206  */
207 int
208 xrdblk(char *blk, int len, int fn)
209 {
210 	int i, ret;
211 
212 	if(setjmp(Xfailbuf))
213 		return(FAIL);
214 
215 	(void) alarm(msgtime);
216 	for (i = 0; i < len; i += ret) {
217 		if ((ret = (*Read)(fn, blk, len - i)) < 0) {
218 			(void) alarm(0);
219 			return(FAIL);
220 		}
221 		blk += ret;
222 		if (ret == 0)
223 			break;
224 	}
225 	(void) alarm(0);
226 	return(i);
227 }
228 #endif /* X_PROTOCOL */
229