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