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