xref: /titanic_52/usr/src/cmd/bnu/gio.c (revision 84ab085a13f931bc78e7415e7ce921dbaa14fcb3)
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 1988 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 #include "pk.h"
36 
37 struct pack *Pk;
38 extern int gwrblk(), grdblk(), pkread(), pkwrite();
39 extern void pkclose();
40 
41 extern int packsize, xpacksize;
42 
43 jmp_buf Getjbuf, Gfailbuf;
44 
45 static void (*gsig)();
46 
47 /* ARGSUSED */
48 static void
49 galarm(sig)
50 int sig;
51 {
52 	signal(SIGALRM, galarm);
53 	longjmp(Getjbuf, 1);
54 }
55 
56 void
57 pkfail()
58 {
59 	longjmp(Gfailbuf, 1);
60 }
61 
62 int
63 gturnon()
64 {
65 	struct pack *pkopen();
66 	if (setjmp(Gfailbuf))
67 		return(FAIL);
68 	gsig=signal(SIGALRM, galarm);
69 	if (Debug > 4)
70 		pkdebug = 1;
71 	Pk = pkopen(Ifn, Ofn);
72 	if ((int) Pk == NULL)
73 		return(FAIL);
74 	return(0);
75 }
76 
77 int
78 gturnoff()
79 {
80 	if(setjmp(Gfailbuf))
81 		return(FAIL);
82 	pkclose();
83 	(void) signal(SIGALRM, gsig);
84 	return(0);
85 }
86 
87 /*ARGSUSED*/
88 int
89 gwrmsg(type, str, fn)
90 char type, *str;
91 {
92 	char bufr[BUFSIZ], *s;
93 	int len, i;
94 
95 	if(setjmp(Gfailbuf))
96 		return(FAIL);
97 	bufr[0] = type;
98 	s = &bufr[1];
99 	while (*str)
100 		*s++ = *str++;
101 	*s = '\0';
102 	if (*(--s) == '\n')
103 		*s = '\0';
104 	len = strlen(bufr) + 1;
105 	if ((i = len % xpacksize) != 0) {
106 		len = len + xpacksize - i;
107 		bufr[len - 1] = '\0';
108 	}
109 	gwrblk(bufr, len);
110 	return(0);
111 }
112 
113 
114 /*ARGSUSED*/
115 int
116 grdmsg(str, fn)
117 char *str;
118 {
119 	unsigned len;
120 
121 	if(setjmp(Gfailbuf))
122 		return(FAIL);
123 	for (;;) {
124 		len = pkread(str, packsize);
125 		if (len == 0)
126 			continue;
127 		str += len;
128 		if (*(str - 1) == '\0')
129 			break;
130 	}
131 	return(0);
132 }
133 
134 
135 /*ARGSUSED*/
136 int
137 gwrdata(fp1, fn)
138 FILE *fp1;
139 {
140 	char bufr[BUFSIZ];
141 	int fd1;
142 	int len;
143 	int ret;
144 	unsigned long bytes;
145 
146 	if(setjmp(Gfailbuf))
147 		return(FAIL);
148 	bytes = 0L;
149 	fd1 = fileno( fp1 );
150 	while ((len = read( fd1, bufr, BUFSIZ )) > 0) {
151 		bytes += len;
152 		putfilesize(bytes);
153 		ret = gwrblk(bufr, len);
154 		if (ret != len) {
155 			return(FAIL);
156 		}
157 		if (len != BUFSIZ)
158 			break;
159 	}
160 	ret = gwrblk(bufr, 0);
161 	return(0);
162 }
163 
164 /*ARGSUSED*/
165 int
166 grddata(fn, fp2)
167 FILE *fp2;
168 {
169 	register int ret = SUCCESS;
170 	int fd2;
171 	int len;
172 	char bufr[BUFSIZ];
173 	unsigned long bytes;
174 
175 	if(setjmp(Gfailbuf))
176 		return(FAIL);
177 	bytes = 0L;
178 	fd2 = fileno( fp2 );
179 	for (;;) {
180 		len = grdblk(bufr, BUFSIZ);
181 		if (len < 0) {
182 			return(FAIL);
183 		}
184 		bytes += len;
185 		putfilesize(bytes);
186 		if ( ret == SUCCESS && write( fd2, bufr, len ) != len) {
187 			ret = errno;
188 			DEBUG(7, "grddata: write to file failed, errno %d\n", errno);
189 		}
190 		if (len < BUFSIZ)
191 			break;
192 	}
193 	return(ret);
194 }
195 
196 
197 static
198 int
199 grdblk(blk, len)
200 char *blk;
201 {
202 	int i, ret;
203 
204 	for (i = 0; i < len; i += ret) {
205 		ret = pkread(blk, len - i);
206 		if (ret < 0)
207 			return(FAIL);
208 		blk += ret;
209 		if (ret == 0)
210 			return(i);
211 	}
212 	return(i);
213 }
214 
215 
216 static int
217 gwrblk(blk, len)
218 char *blk;
219 {
220 	return(pkwrite(blk, len));
221 }
222