17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate * CDDL HEADER START
37c478bd9Sstevel@tonic-gate *
47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the
57c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only
67c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance
77c478bd9Sstevel@tonic-gate * with the License.
87c478bd9Sstevel@tonic-gate *
97c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
117c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions
127c478bd9Sstevel@tonic-gate * and limitations under the License.
137c478bd9Sstevel@tonic-gate *
147c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
157c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
177c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
187c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
197c478bd9Sstevel@tonic-gate *
207c478bd9Sstevel@tonic-gate * CDDL HEADER END
217c478bd9Sstevel@tonic-gate */
227c478bd9Sstevel@tonic-gate /*
237c478bd9Sstevel@tonic-gate * Copyright 1994 Sun Microsystems, Inc. All rights reserved.
247c478bd9Sstevel@tonic-gate * Use is subject to license terms.
257c478bd9Sstevel@tonic-gate */
267c478bd9Sstevel@tonic-gate
277c478bd9Sstevel@tonic-gate /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
287c478bd9Sstevel@tonic-gate /* All Rights Reserved */
297c478bd9Sstevel@tonic-gate
307c478bd9Sstevel@tonic-gate # include <unistd.h>
317c478bd9Sstevel@tonic-gate # include <errno.h>
327c478bd9Sstevel@tonic-gate # include <stdlib.h>
337c478bd9Sstevel@tonic-gate
347c478bd9Sstevel@tonic-gate #if defined(__STDC__)
357c478bd9Sstevel@tonic-gate # include <stdarg.h>
367c478bd9Sstevel@tonic-gate #else
377c478bd9Sstevel@tonic-gate # include <varargs.h>
387c478bd9Sstevel@tonic-gate #endif
397c478bd9Sstevel@tonic-gate
407c478bd9Sstevel@tonic-gate # include "lp.h"
417c478bd9Sstevel@tonic-gate # include "msgs.h"
427c478bd9Sstevel@tonic-gate
437c478bd9Sstevel@tonic-gate
447c478bd9Sstevel@tonic-gate /*
457c478bd9Sstevel@tonic-gate ** Size and pointer for mgetm()
467c478bd9Sstevel@tonic-gate */
477c478bd9Sstevel@tonic-gate static int MBGSize = 0;
487c478bd9Sstevel@tonic-gate static char * MBG = NULL;
497c478bd9Sstevel@tonic-gate
507c478bd9Sstevel@tonic-gate /*
517c478bd9Sstevel@tonic-gate ** Size and pointer for mputm()
527c478bd9Sstevel@tonic-gate */
537c478bd9Sstevel@tonic-gate static int MBPSize = 0;
547c478bd9Sstevel@tonic-gate static char * MBP = NULL;
557c478bd9Sstevel@tonic-gate
567c478bd9Sstevel@tonic-gate int peek3_2();
577c478bd9Sstevel@tonic-gate
587c478bd9Sstevel@tonic-gate #if defined(__STDC__)
mgetm(MESG * md,int type,...)597c478bd9Sstevel@tonic-gate int mgetm ( MESG * md, int type, ... )
607c478bd9Sstevel@tonic-gate #else
617c478bd9Sstevel@tonic-gate int mgetm (md, type, va_alist)
627c478bd9Sstevel@tonic-gate MESG *md;
637c478bd9Sstevel@tonic-gate int type;
647c478bd9Sstevel@tonic-gate va_dcl
657c478bd9Sstevel@tonic-gate #endif
667c478bd9Sstevel@tonic-gate {
677c478bd9Sstevel@tonic-gate va_list vp;
687c478bd9Sstevel@tonic-gate int ret;
697c478bd9Sstevel@tonic-gate int needsize;
707c478bd9Sstevel@tonic-gate
717c478bd9Sstevel@tonic-gate #if defined(__STDC__)
727c478bd9Sstevel@tonic-gate va_start(vp, type);
737c478bd9Sstevel@tonic-gate #else
747c478bd9Sstevel@tonic-gate va_start(vp);
757c478bd9Sstevel@tonic-gate #endif
767c478bd9Sstevel@tonic-gate
777c478bd9Sstevel@tonic-gate needsize = mpeek(md);
787c478bd9Sstevel@tonic-gate if (needsize <=0 || needsize > MSGMAX)
797c478bd9Sstevel@tonic-gate needsize = MSGMAX;
807c478bd9Sstevel@tonic-gate if (needsize > MBGSize)
817c478bd9Sstevel@tonic-gate {
827c478bd9Sstevel@tonic-gate if (MBG)
837c478bd9Sstevel@tonic-gate Free(MBG);
847c478bd9Sstevel@tonic-gate if ((MBG = (char *)Malloc(needsize)) == NULL)
857c478bd9Sstevel@tonic-gate {
867c478bd9Sstevel@tonic-gate MBGSize = 0;
877c478bd9Sstevel@tonic-gate MBG = NULL;
887c478bd9Sstevel@tonic-gate errno = ENOMEM;
897c478bd9Sstevel@tonic-gate return(-1);
907c478bd9Sstevel@tonic-gate }
917c478bd9Sstevel@tonic-gate MBGSize = needsize;
927c478bd9Sstevel@tonic-gate }
937c478bd9Sstevel@tonic-gate if (mread(md, MBG, MBGSize) < 0)
947c478bd9Sstevel@tonic-gate return(-1);
957c478bd9Sstevel@tonic-gate
967c478bd9Sstevel@tonic-gate ret = _getmessage(MBG, type, vp);
977c478bd9Sstevel@tonic-gate
987c478bd9Sstevel@tonic-gate va_end(vp);
997c478bd9Sstevel@tonic-gate
1007c478bd9Sstevel@tonic-gate return(ret);
1017c478bd9Sstevel@tonic-gate }
1027c478bd9Sstevel@tonic-gate
1037c478bd9Sstevel@tonic-gate #if defined(__STDC__)
mputm(MESG * md,int type,...)1047c478bd9Sstevel@tonic-gate int mputm ( MESG * md, int type, ... )
1057c478bd9Sstevel@tonic-gate #else
1067c478bd9Sstevel@tonic-gate int mputm (md, type, va_alist)
1077c478bd9Sstevel@tonic-gate MESG *md;
1087c478bd9Sstevel@tonic-gate int type;
1097c478bd9Sstevel@tonic-gate va_dcl
1107c478bd9Sstevel@tonic-gate #endif
1117c478bd9Sstevel@tonic-gate {
1127c478bd9Sstevel@tonic-gate va_list vp;
1137c478bd9Sstevel@tonic-gate int needsize;
1147c478bd9Sstevel@tonic-gate
1157c478bd9Sstevel@tonic-gate #if defined(__STDC__)
1167c478bd9Sstevel@tonic-gate va_start(vp, type);
1177c478bd9Sstevel@tonic-gate #else
1187c478bd9Sstevel@tonic-gate va_start(vp);
1197c478bd9Sstevel@tonic-gate #endif
1207c478bd9Sstevel@tonic-gate needsize = _putmessage(NULL, type, vp);
1217c478bd9Sstevel@tonic-gate va_end(vp);
1227c478bd9Sstevel@tonic-gate if (needsize <= 0)
1237c478bd9Sstevel@tonic-gate return(-1);
124*2a8bcb4eSToomas Soome
1257c478bd9Sstevel@tonic-gate if (needsize > MBPSize)
1267c478bd9Sstevel@tonic-gate {
1277c478bd9Sstevel@tonic-gate if (MBP)
1287c478bd9Sstevel@tonic-gate Free(MBP);
1297c478bd9Sstevel@tonic-gate if ((MBP = (char *)Malloc(needsize)) == NULL)
1307c478bd9Sstevel@tonic-gate {
1317c478bd9Sstevel@tonic-gate MBPSize = 0;
1327c478bd9Sstevel@tonic-gate MBP = NULL;
1337c478bd9Sstevel@tonic-gate errno = ENOMEM;
1347c478bd9Sstevel@tonic-gate return(-1);
1357c478bd9Sstevel@tonic-gate }
1367c478bd9Sstevel@tonic-gate MBPSize = needsize;
1377c478bd9Sstevel@tonic-gate }
1387c478bd9Sstevel@tonic-gate
1397c478bd9Sstevel@tonic-gate #if defined(__STDC__)
1407c478bd9Sstevel@tonic-gate va_start(vp, type);
1417c478bd9Sstevel@tonic-gate #else
1427c478bd9Sstevel@tonic-gate va_start(vp);
1437c478bd9Sstevel@tonic-gate #endif
1447c478bd9Sstevel@tonic-gate needsize = _putmessage(MBP, type, vp);
1457c478bd9Sstevel@tonic-gate va_end(vp);
1467c478bd9Sstevel@tonic-gate if (needsize <= 0)
1477c478bd9Sstevel@tonic-gate return(-1);
148*2a8bcb4eSToomas Soome
1497c478bd9Sstevel@tonic-gate
1507c478bd9Sstevel@tonic-gate return(mwrite(md, MBP));
1517c478bd9Sstevel@tonic-gate }
1527c478bd9Sstevel@tonic-gate
1537c478bd9Sstevel@tonic-gate #if defined(__STDC__)
__mbfree(void)1547c478bd9Sstevel@tonic-gate void __mbfree ( void )
1557c478bd9Sstevel@tonic-gate #else
1567c478bd9Sstevel@tonic-gate void __mbfree ()
1577c478bd9Sstevel@tonic-gate #endif
1587c478bd9Sstevel@tonic-gate {
1597c478bd9Sstevel@tonic-gate MBGSize = MBPSize = 0;
1607c478bd9Sstevel@tonic-gate if (MBG)
1617c478bd9Sstevel@tonic-gate Free (MBG);
1627c478bd9Sstevel@tonic-gate if (MBP)
1637c478bd9Sstevel@tonic-gate Free (MBP);
1647c478bd9Sstevel@tonic-gate MBG = MBP = NULL;
1657c478bd9Sstevel@tonic-gate }
1667c478bd9Sstevel@tonic-gate
1677c478bd9Sstevel@tonic-gate #if defined(__STDC__)
mpeek(MESG * md)1687c478bd9Sstevel@tonic-gate short mpeek ( MESG * md )
1697c478bd9Sstevel@tonic-gate #else
1707c478bd9Sstevel@tonic-gate short mpeek (md)
1717c478bd9Sstevel@tonic-gate MESG *md;
1727c478bd9Sstevel@tonic-gate #endif
1737c478bd9Sstevel@tonic-gate {
1747c478bd9Sstevel@tonic-gate int size;
1757c478bd9Sstevel@tonic-gate
1767c478bd9Sstevel@tonic-gate if (md->type == MD_USR_FIFO || md->type == MD_SYS_FIFO)
1777c478bd9Sstevel@tonic-gate return(peek3_2(md->readfd) - EXCESS_3_2_LEN);
1787c478bd9Sstevel@tonic-gate
1797c478bd9Sstevel@tonic-gate if (ioctl(md->readfd, I_NREAD, &size))
1807c478bd9Sstevel@tonic-gate return((short)size);
1817c478bd9Sstevel@tonic-gate
1827c478bd9Sstevel@tonic-gate return(-1);
1837c478bd9Sstevel@tonic-gate }
184