xref: /illumos-gate/usr/src/cmd/bnu/xio.c (revision 7a6d80f1660abd4755c68cbd094d4a914681d26e)
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(str, fn)
107 char *str;
108 {
109 	int len;
110 
111 	if(setjmp(Xfailbuf))
112 		return(FAIL);
113 
114 	(void) alarm(msgtime);
115 	for (;;) {
116 		if( (len = (*Read)(fn, str, XBUFSIZ)) == 0)
117 			continue;
118 		if (len < 0) {
119 			(void) alarm(0);
120 			return(FAIL);
121 		}
122 		str += len;
123 		if (*(str - 1) == '\0')
124 			break;
125 	}
126 	(void) alarm(0);
127 	return(0);
128 }
129 
130 /*
131  * read data from file fp1 and write
132  * on x.25 link
133  *	fp1	-> file descriptor
134  *	fn	-> x.25 descriptor
135  * returns:
136  *	FAIL	->failure in x.25 link
137  *	0	-> ok
138  */
139 int
140 xwrdata(fp1, fn)
141 FILE *fp1;
142 {
143 	int fd1;
144 	int len, ret;
145 	unsigned long bytes;
146 	char bufr[XBUFSIZ];
147 
148 	bytes = 0L;
149 	fd1 = fileno( fp1 );
150 	while ((len = read( fd1, bufr, XBUFSIZ )) > 0) {
151 		bytes += len;
152 		putfilesize(bytes);
153 		ret = (*Write)(fn, bufr, len);
154 		if (ret != len) {
155 			return(FAIL);
156 		}
157 		if (len != XBUFSIZ)
158 			break;
159 	}
160 	ret = (*Write)(fn, bufr, 0);
161 	return(0);
162 }
163 
164 /*
165  * read data from x.25 link and
166  * write into file
167  *	fp2	-> file descriptor
168  *	fn	-> x.25 descriptor
169  * returns:
170  *	0	-> ok
171  *	FAIL	-> failure on x.25 link
172  */
173 int
174 xrddata(fn, fp2)
175 FILE *fp2;
176 {
177 	int fd2;
178 	int len;
179 	int ret = SUCCESS;
180 	unsigned long bytes;
181 	char bufr[XBUFSIZ];
182 
183 	bytes = 0L;
184 	fd2 = fileno( fp2 );
185 	for (;;) {
186 		len = xrdblk(bufr, XBUFSIZ, fn);
187 		if (len < 0) {
188 			return(FAIL);
189 		}
190 		bytes += len;
191 		putfilesize(bytes);
192 		if( ret == SUCCESS && write( fd2, bufr, len ) != len )
193 			ret = errno;
194 		if (len < XBUFSIZ)
195 			break;
196 	}
197 	return(ret);
198 }
199 
200 /*
201  * read blank from x.25 link
202  * reads are timed
203  *	blk	-> address of buffer
204  *	len	-> size to read
205  *	fn	-> x.25 descriptor
206  * returns:
207  *	FAIL	-> link error timeout on link
208  *	i	-> # of bytes read
209  */
210 int
211 xrdblk(blk, len,  fn)
212 char *blk;
213 {
214 	int i, ret;
215 
216 	if(setjmp(Xfailbuf))
217 		return(FAIL);
218 
219 	(void) alarm(msgtime);
220 	for (i = 0; i < len; i += ret) {
221 		if ((ret = (*Read)(fn, blk, len - i)) < 0) {
222 			(void) alarm(0);
223 			return(FAIL);
224 		}
225 		blk += ret;
226 		if (ret == 0)
227 			break;
228 	}
229 	(void) alarm(0);
230 	return(i);
231 }
232 #endif /* X_PROTOCOL */
233