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 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 23 /* All Rights Reserved */ 24 25 26 #ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.5 */ 27 /* LINTLIBRARY */ 28 29 # include <stropts.h> 30 # include <errno.h> 31 # include <stdlib.h> 32 33 #include "lp.h" 34 #include "msgs.h" 35 36 #if defined(__STDC__) 37 static void disconnect3_2 ( MESG * ); 38 #else 39 static void disconnect3_2(); 40 #endif 41 42 #if defined(__STDC__) 43 int mdisconnect ( MESG * md ) 44 #else 45 int mdisconnect (md) 46 MESG *md; 47 #endif 48 { 49 int retvalue = 0; 50 void (**fnp)(); 51 MQUE *p; 52 53 if (!md) 54 { 55 errno = ENXIO; 56 return(-1); 57 } 58 59 switch(md->type) 60 { 61 case MD_CHILD: 62 case MD_STREAM: 63 case MD_BOUND: 64 if (md->writefd >= 0) 65 (void) Close(md->writefd); 66 if (md->readfd >= 0) 67 (void) Close(md->readfd); 68 break; 69 70 case MD_USR_FIFO: 71 case MD_SYS_FIFO: 72 disconnect3_2(md); 73 break; 74 } 75 76 if (md->on_discon) 77 { 78 for (fnp = md->on_discon; *fnp; fnp++) 79 { 80 (*fnp)(md); 81 retvalue++; 82 } 83 Free(md->on_discon); 84 } 85 86 if (md->file) 87 Free(md->file); 88 89 if (md->mque) 90 { 91 while ((p = md->mque) != NULL) 92 { 93 md->mque = p->next; 94 Free(p->dat->buf); 95 Free(p->dat); 96 Free(p); 97 } 98 } 99 Free(md); 100 101 return(retvalue); 102 } 103 104 int discon3_2_is_running = 0; 105 106 #if defined(__STDC__) 107 static void disconnect3_2 ( MESG * md ) 108 #else 109 static void disconnect3_2 (md) 110 MESG *md; 111 #endif 112 { 113 char *msgbuf = 0; 114 int size; 115 116 discon3_2_is_running = 1; 117 118 if (md->writefd != -1) 119 { 120 size = putmessage((char *)0, S_GOODBYE); 121 if ((msgbuf = (char *)Malloc((unsigned)size))) 122 { 123 (void)putmessage (msgbuf, S_GOODBYE); 124 (void)msend (msgbuf); 125 Free (msgbuf); 126 } 127 128 (void) Close (md->writefd); 129 } 130 131 if (md->readfd != -1) 132 (void) Close (md->readfd); 133 134 if (md->file) 135 { 136 (void) Unlink (md->file); 137 Free (md->file); 138 } 139 140 discon3_2_is_running = 0; 141 } 142