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 (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
27/*	  All Rights Reserved  	*/
28
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32# include	<sys/types.h>
33# include	<poll.h>
34# include	<stdarg.h>
35# include	<stropts.h>
36
37#if	!defined(_LP_MSGS_H)
38# define	_LP_MSGS_H
39
40/*
41 * THE DISPATCH TABLE DEPENDS ON EACH R_... MESSAGE FOLLOWING
42 * IMMEDIATELY AFTER ITS CORRESPONDING S_... COUNTERPART.
43 * I.E R_... MESSAGE FOR A S_... MESSAGE IS (S_... + 1)
44 */
45# define	R_BAD_MESSAGE			0
46/* # define	S_NEW_QUEUE			1	DEFUNCT */
47/* # define	R_NEW_QUEUE			2	DEFUNCT */
48# define	S_ALLOC_FILES			3
49# define	R_ALLOC_FILES			4
50# define	S_PRINT_REQUEST			5
51# define	R_PRINT_REQUEST			6
52# define	S_START_CHANGE_REQUEST		7
53# define	R_START_CHANGE_REQUEST		8
54# define	S_END_CHANGE_REQUEST		9
55# define	R_END_CHANGE_REQUEST		10
56# define	S_CANCEL_REQUEST		11
57# define	R_CANCEL_REQUEST		12
58/* # define	S_INQUIRE_REQUEST		13	DEFUNCT */
59/* # define	R_INQUIRE_REQUEST		14	DEFUNCT */
60# define	S_LOAD_PRINTER			15
61# define	R_LOAD_PRINTER			16
62# define	S_UNLOAD_PRINTER		17
63# define	R_UNLOAD_PRINTER		18
64# define	S_INQUIRE_PRINTER_STATUS	19
65# define	R_INQUIRE_PRINTER_STATUS	20
66# define	S_LOAD_CLASS			21
67# define	R_LOAD_CLASS			22
68# define	S_UNLOAD_CLASS			23
69# define	R_UNLOAD_CLASS			24
70# define	S_INQUIRE_CLASS			25
71# define	R_INQUIRE_CLASS			26
72# define	S_MOUNT				27
73# define	R_MOUNT				28
74# define	S_UNMOUNT			29
75# define	R_UNMOUNT			30
76# define	S_MOVE_REQUEST			31
77# define	R_MOVE_REQUEST			32
78# define	S_MOVE_DEST			33
79# define	R_MOVE_DEST			34
80# define	S_ACCEPT_DEST			35
81# define	R_ACCEPT_DEST			36
82# define	S_REJECT_DEST			37
83# define	R_REJECT_DEST			38
84# define	S_ENABLE_DEST			39
85# define	R_ENABLE_DEST			40
86# define	S_DISABLE_DEST			41
87# define	R_DISABLE_DEST			42
88# define	S_LOAD_FILTER_TABLE		43
89# define	R_LOAD_FILTER_TABLE		44
90# define	S_UNLOAD_FILTER_TABLE		45
91# define	R_UNLOAD_FILTER_TABLE		46
92# define	S_LOAD_PRINTWHEEL		47
93# define	R_LOAD_PRINTWHEEL		48
94# define	S_UNLOAD_PRINTWHEEL		49
95# define	R_UNLOAD_PRINTWHEEL		50
96# define	S_LOAD_USER_FILE		51
97# define	R_LOAD_USER_FILE		52
98# define	S_UNLOAD_USER_FILE		53
99# define	R_UNLOAD_USER_FILE		54
100# define	S_LOAD_FORM			55
101# define	R_LOAD_FORM			56
102# define	S_UNLOAD_FORM			57
103# define	R_UNLOAD_FORM			58
104/* # define	S_GETSTATUS			59	DEFUNCT */
105/* # define	R_GETSTATUS			60	DEFUNCT */
106# define	S_QUIET_ALERT			61
107# define	R_QUIET_ALERT			62
108# define	S_SEND_FAULT			63
109# define	R_SEND_FAULT			64
110# define	S_SHUTDOWN			65
111# define	R_SHUTDOWN			66
112# define	S_GOODBYE			67
113# define	S_CHILD_DONE			68
114
115/*
116**	These are for use by the scheduler only
117*/
118# define	I_GET_TYPE			69
119# define	I_QUEUE_CHK			70
120/* # define	R_CONNECT			71	DEFUNCT */
121
122/* # define	S_GET_STATUS			72	DEFUNCT */
123/* # define	R_GET_STATUS			73	DEFUNCT */
124# define	S_INQUIRE_REQUEST_RANK		74
125# define	R_INQUIRE_REQUEST_RANK		75
126# define	S_CANCEL			76
127# define	R_CANCEL			77
128/* # define	S_NEW_CHILD			78	DEFUNCT */
129/* # define	R_NEW_CHILD			79	DEFUNCT */
130/* # define	S_SEND_JOB			80	DEFUNCT */
131/* # define	R_SEND_JOB			81	DEFUNCT */
132/* # define	S_JOB_COMPLETED			82	DEFUNCT */
133/* # define	R_JOB_COMPLETED			83	DEFUNCT */
134/* # define	S_INQUIRE_REMOTE_PRINTER	84	DEFUNCT */
135/* # define	R_INQUIRE_REMOTE_PRINTER	20	DEFUNCT */
136/* # define	S_CHILD_SYNC			85	DEFUNCT */
137/* # define	S_LOAD_SYSTEM			86	DEFUNCT */
138/* # define	R_LOAD_SYSTEM			87	DEFUNCT */
139/* # define	S_UNLOAD_SYSTEM			88	DEFUNCT */
140/* # define	R_UNLOAD_SYSTEM			89	DEFUNCT */
141/* new messages */
142# define	S_CLEAR_FAULT			90
143# define	R_CLEAR_FAULT			91
144# define	S_MOUNT_TRAY			92
145# define	R_MOUNT_TRAY			93
146# define	S_UNMOUNT_TRAY			94
147# define	R_UNMOUNT_TRAY			95
148# define	S_MAX_TRAYS			96
149# define	R_MAX_TRAYS			97
150# define	S_PAPER_CHANGED			98
151# define	R_PAPER_CHANGED			99
152# define	S_PAPER_ALLOWED			100
153# define	R_PAPER_ALLOWED			101
154# define	S_PASS_PEER_CONNECTION		102
155# define	R_PASS_PEER_CONNECTION		103
156/*
157**	Last available message
158*/
159# define	LAST_MESSAGE			104
160
161/*
162**      These are the possible status codes returned by the scheduler
163*/
164# define	MOK		 0
165# define	MOKMORE		 1
166# define	MOKREMOTE	 2
167# define	MMORERR		 3
168# define	MNODEST		 4
169# define	MERRDEST	 5
170# define	MDENYDEST	 6
171# define	MNOMEDIA	 7
172# define	MDENYMEDIA	 8
173# define	MNOFILTER	 9
174# define	MNOINFO		10
175# define	MNOMEM		11
176# define	MNOMOUNT	12
177# define	MNOOPEN		13
178# define	MNOPERM		14
179# define	MNOSTART	15
180# define	MUNKNOWN	16
181# define	M2LATE		17
182# define	MNOSPACE	18
183# define	MBUSY		19
184# define	MTRANSMITERR	20
185# define	MNOMORE		21
186# define	MGONEREMOTE	22
187# define	MNOTRAY		23
188
189/*
190** Offsets and lengths of the various elements of the message header.
191**
192**	Macro		Data Type	Size	Comment
193**
194**	HEAD_RESYNC	2 bytes		(2)	*
195**	HEAD_AUTHCODE	short + long	(6)	*
196**
197**	HEAD_SIZE	4 bytes		(4)	\
198**	HEAD_TYPE	4 bytes		(4)	 > message propper
199**	HEAD_DATA	n bytes		(n)	/
200**
201**	TAIL_CHKSUM	4 bytes		(4)	*
202**	TAIL_ENDSYNC	2 bytes		(2)	*
203**
204**	Items marked with an asterisk are only used with the 3.2
205**	Spooler protocol.
206*/
207
208/*
209**	3.2 Protocol Header Information:
210**		2-byte message introduction
211**		6-byte client authorization data
212*/
213#define	HEAD_RESYNC		(0)
214#define HEAD_RESYNC_LEN		2
215#define HEAD_AUTHCODE		(HEAD_RESYNC + HEAD_RESYNC_LEN)
216#define HEAD_AUTHCODE_LEN		(sizeof(short) + sizeof(long))
217
218/*
219**	3.2 Protocol Message Information:
220**		4-byte message size
221**		4-byte message type
222**		n-byte message data
223*/
224#define HEAD_SIZE		(HEAD_AUTHCODE + HEAD_AUTHCODE_LEN)
225#define HEAD_SIZE_LEN			4
226#define HEAD_TYPE		(HEAD_SIZE + HEAD_SIZE_LEN)
227#define HEAD_TYPE_LEN			4
228#define HEAD_DATA		(HEAD_TYPE + HEAD_TYPE_LEN)
229
230/*
231**	3.2 Protocol Size of non-data header information
232*/
233#define HEAD_LEN		HEAD_DATA
234
235/*
236**	Equivalents for 4.0 protocol
237*/
238#define MESG_SIZE		(0)
239#define MESG_SIZE_LEN			4
240#define MESG_TYPE		(MESG_SIZE + MESG_SIZE_LEN)
241#define MESG_TYPE_LEN			4
242#define MESG_DATA		(MESG_TYPE + MESG_TYPE_LEN)
243
244#define MESG_LEN		MESG_DATA
245
246/*
247**	3.2 Protocol Trailer Information:
248**		4-byte message check sum
249**		2-byte message closing identifier
250**
251**	"N" is the decoded value of buffer[HEAD_SIZE].  This must
252**	be provided because messages are variable length.
253*/
254#define	TAIL_ENDSYNC_LEN		2
255#define	TAIL_ENDSYNC(N)		(N - TAIL_ENDSYNC_LEN)
256#define TAIL_CHKSUM_LEN			4
257#define TAIL_CHKSUM(N)		(TAIL_ENDSYNC(N) - TAIL_CHKSUM_LEN)
258
259/*
260**	3.2 Protocol Size of non-data trailer information
261*/
262#define	TAIL_LEN		(TAIL_CHKSUM_LEN + TAIL_ENDSYNC_LEN)
263
264/*
265**	3.2 Protocol Size of all non-data information
266**	(This is also the minimum size for 3.2 protocol messages)
267*/
268#define	CONTROL_LEN		(HEAD_LEN + TAIL_LEN)
269
270/*
271**	Size of excess data induced by 3.2 Protocol.
272**	(This is also the size differance between 3.2 & 4.0 protocols)
273*/
274#define	EXCESS_3_2_LEN		(HEAD_SIZE + TAIL_LEN)
275/**
276 ** Checksum:
277 **/
278#define CALC_CHKSUM(B,SZ,RC) \
279if (SZ >= CONTROL_LEN) \
280{ \
281    register unsigned char	*p = (unsigned char *)B, \
282			    *pend = p + SZ - TAIL_LEN; \
283    RC = 0; \
284    while (p < pend) \
285	RC += *p++;  /* let it overflow */ \
286} \
287else \
288    return ((errno = EINVAL, -1))
289
290/*
291**      Largest size permitted for any given message
292*/
293# define	MSGMAX		2048
294
295/*
296**      Possible values of the type field of S_QUIET_ALERT
297*/
298# define	QA_FORM		1
299# define	QA_PRINTER	2
300# define	QA_PRINTWHEEL	3
301
302typedef	struct	strbuf	strbuf_t;	/*  STREAMS buffer */
303
304typedef	struct mque
305{
306    struct mque	  *next;
307    struct strbuf *dat;
308} MQUE;
309
310/*
311**	Definition of a message descriptor
312*/
313typedef struct
314{
315    short	type;			/* type of connection */
316    int		readfd;			/* STREAM fd to read from */
317    int		writefd;		/* STREAM fd to write to */
318    int		wait;			/* number of systems waiting for */
319    char	*file;			/* pipe name if type==MD_FIFO */
320    short	state;			/* Current state of client */
321    short	admin;			/* Non zero if admin  */
322    short	event;			/* Event returned from poll */
323    MQUE *	mque;			/* backlogged message ptr */
324    uid_t	uid;			/* Clients UID */
325    gid_t	gid;			/* Clients GID */
326    char *	slabel;			/* Clients SLABEL */
327    void	(**on_discon)();	/* Clean up functions */
328} MESG;
329
330# define	MDSIZE	(sizeof(MESG))
331
332/*
333**	Possible values of MESG.state
334*/
335# define	MDS_IDLE	0
336
337# define	MDS_32PROTO	320
338# define	MDS_32CONNECT	321
339
340/*
341**	Possible values of MESG.type
342*/
343# define	MD_UNKNOWN	0	/* We don't know just yet */
344# define	MD_STREAM	1	/* 4.0 STREAMS pipe protocol */
345# define	MD_BOUND	2	/* 4.0 STREAMS fd protocol */
346# define	MD_SYS_FIFO	3	/* 3.2 named-pipe protocol */
347# define	MD_USR_FIFO	4	/* 3.2 named-pipe protocol */
348# define	MD_MASTER	5	/* MD_STREAM used by lpsched */
349# define	MD_CHILD	6	/* MD_STREAM to a child process */
350
351/*
352**	Definition for a FIFO buffer (used
353**	in read_fifo.
354*/
355typedef struct
356{
357	int	full;
358	char	save [MSGMAX],
359		*psave,
360		*psave_end;
361} fifobuffer_t;
362
363/*
364**      Definitions for the rest of the world and lint
365*/
366/*
367**	Server functions in order of usage
368*/
369MESG		* mcreate ( char * );
370int		mlisteninit ( MESG * );
371MESG		* mlisten ( void );
372int		mlistenadd ( MESG *, short );
373int		mon_discon ( MESG *, void (*)());
374MESG		* mlistenreset ( void );
375int		mdestroy ( MESG * );
376
377/*
378**	Client functions in order of typical usage
379*/
380MESG		* mconnect ( char *, int, int );
381int		mgetm ( MESG *, int, ... );
382int		mwrite ( MESG *, char * );
383int		mputm ( MESG *, int, ... );
384int		mread ( MESG *, char *, int );
385short		msize ( char * );
386short		mpeek ( MESG * );
387int		mdisconnect ( MESG * );
388
389/*
390**	This may be called to deallocate internal buffers allocated
391**	by mgetm and mputm.  Probably not useful except right before
392**	a fork().
393*/
394void		__mbfree ( void );
395
396/*
397**	Client functions for pre-4.0 compatability
398*/
399int		mclose ( void );
400int		mneeds ( void );
401int		mopen ( void );
402int		mrecv ( char *, int );
403int		msend ( char * );
404
405int		Putmsg (MESG *, strbuf_t *, strbuf_t *, int);
406int		Getmsg (MESG *, strbuf_t *, strbuf_t *, int *);
407int		read3_2 (MESG * md, char *msgbuf, int size);
408int		write3_2 (MESG *, char *, int);
409int		read_fifo (int, char *, unsigned int);
410int		write_fifo (int, char *, unsigned int);
411int		ResetFifoBuffer (int);
412fifobuffer_t	*GetFifoBuffer (int);
413
414/*
415**	General purpose message manipulating functions
416*/
417char		* htos ( char *, unsigned short );
418char		* ltos ( char *, unsigned long );
419unsigned long	stol ( char * );
420unsigned short	stoh ( char * );
421int		_getmessage ( char *, short, va_list );
422int		_putmessage ( char *, short, va_list );
423int		getmessage ( char *, short, ... );
424int		putmessage ( char *, short, ... );
425
426/*
427**	This will yield the type of a message
428*/
429# define	mtype(buffer)	(getmessage(buffer, I_GET_TYPE))
430
431/*
432**	This will yeild the size of a message
433*/
434# define	msize(buffer)	(stoh(buffer))
435
436/*
437**	Pass this for the request-id argument of S_CANCEL
438**	to obtain the effect of the 3.2 S_CANCEL_REQUEST.
439*/
440# define	CURRENT_REQ	"current"
441
442#endif	/* !defined (_LP_MSGS_H) */
443