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