xref: /titanic_44/usr/src/cmd/bnu/xio.c (revision 1979231e1e29c981e5d1e6cee60f2db46d052b00)
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  
31  #pragma ident	"%Z%%M%	%I%	%E% SMI"
32  
33  #include "uucp.h"
34  
35  #ifdef X_PROTOCOL
36  
37  #define XBUFSIZ 512
38  static jmp_buf Xfailbuf;
39  extern int xrdblk();
40  extern unsigned msgtime;
41  
42  /*
43   * x.25 protocol
44   */
45  /* ARGSUSED */
46  static void
47  xalarm(sig)
48  int sig;
49  {
50  	longjmp(Xfailbuf, 1);
51  }
52  
53  static void (*xsig)();
54  
55  /*
56   * turn on protocol timer
57   */
58  int
59  xturnon()
60  {
61  	xsig=signal(SIGALRM, xalarm);
62  	return(0);
63  }
64  
65  int
66  xturnoff()
67  {
68  	(void) signal(SIGALRM, xsig);
69  	return(0);
70  }
71  
72  /*
73   * write message across x.25 link
74   *	type	-> message type
75   *	str	-> message body (ascii string)
76   *	fn	-> x.25 file descriptor
77   * return
78   *	0
79   */
80  int
81  xwrmsg(type, str, fn)
82  char *str;
83  int fn;
84  char type;
85  {
86  	char *s;
87  	char bufr[XBUFSIZ];
88  
89  	bufr[0] = type;
90  	s = &bufr[1];
91  	while (*str)
92  		*s++ = *str++;
93  	*s = '\0';
94  	if (*(--s) == '\n')
95  		*s = '\0';
96  	(void) (*Write)(fn, bufr, strlen(bufr) + 1);
97  	return(0);
98  }
99  
100  /*
101   * read message from x.25 link
102   *	str	-> message buffer
103   *	fn	-> x.25 file descriptor
104   * return
105   *	FAIL	-> send timed out
106   *	0	-> ok message in str
107   */
108  int
109  xrdmsg(str, fn)
110  char *str;
111  {
112  	int len;
113  
114  	if(setjmp(Xfailbuf))
115  		return(FAIL);
116  
117  	(void) alarm(msgtime);
118  	for (;;) {
119  		if( (len = (*Read)(fn, str, XBUFSIZ)) == 0)
120  			continue;
121  		if (len < 0) {
122  			(void) alarm(0);
123  			return(FAIL);
124  		}
125  		str += len;
126  		if (*(str - 1) == '\0')
127  			break;
128  	}
129  	(void) alarm(0);
130  	return(0);
131  }
132  
133  /*
134   * read data from file fp1 and write
135   * on x.25 link
136   *	fp1	-> file descriptor
137   *	fn	-> x.25 descriptor
138   * returns:
139   *	FAIL	->failure in x.25 link
140   *	0	-> ok
141   */
142  int
143  xwrdata(fp1, fn)
144  FILE *fp1;
145  {
146  	int fd1;
147  	int len, ret;
148  	unsigned long bytes;
149  	char bufr[XBUFSIZ];
150  
151  	bytes = 0L;
152  	fd1 = fileno( fp1 );
153  	while ((len = read( fd1, bufr, XBUFSIZ )) > 0) {
154  		bytes += len;
155  		putfilesize(bytes);
156  		ret = (*Write)(fn, bufr, len);
157  		if (ret != len) {
158  			return(FAIL);
159  		}
160  		if (len != XBUFSIZ)
161  			break;
162  	}
163  	ret = (*Write)(fn, bufr, 0);
164  	return(0);
165  }
166  
167  /*
168   * read data from x.25 link and
169   * write into file
170   *	fp2	-> file descriptor
171   *	fn	-> x.25 descriptor
172   * returns:
173   *	0	-> ok
174   *	FAIL	-> failure on x.25 link
175   */
176  int
177  xrddata(fn, fp2)
178  FILE *fp2;
179  {
180  	int fd2;
181  	int len;
182  	int ret = SUCCESS;
183  	unsigned long bytes;
184  	char bufr[XBUFSIZ];
185  
186  	bytes = 0L;
187  	fd2 = fileno( fp2 );
188  	for (;;) {
189  		len = xrdblk(bufr, XBUFSIZ, fn);
190  		if (len < 0) {
191  			return(FAIL);
192  		}
193  		bytes += len;
194  		putfilesize(bytes);
195  		if( ret == SUCCESS && write( fd2, bufr, len ) != len )
196  			ret = errno;
197  		if (len < XBUFSIZ)
198  			break;
199  	}
200  	return(ret);
201  }
202  
203  /*
204   * read blank from x.25 link
205   * reads are timed
206   *	blk	-> address of buffer
207   *	len	-> size to read
208   *	fn	-> x.25 descriptor
209   * returns:
210   *	FAIL	-> link error timeout on link
211   *	i	-> # of bytes read
212   */
213  int
214  xrdblk(blk, len,  fn)
215  char *blk;
216  {
217  	int i, ret;
218  
219  	if(setjmp(Xfailbuf))
220  		return(FAIL);
221  
222  	(void) alarm(msgtime);
223  	for (i = 0; i < len; i += ret) {
224  		if ((ret = (*Read)(fn, blk, len - i)) < 0) {
225  			(void) alarm(0);
226  			return(FAIL);
227  		}
228  		blk += ret;
229  		if (ret == 0)
230  			break;
231  	}
232  	(void) alarm(0);
233  	return(i);
234  }
235  #endif /* X_PROTOCOL */
236