xref: /illumos-gate/usr/src/cmd/lp/include/msgs.h (revision 3ce5372277f4657ad0e52d36c979527c4ca22de2)
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) \
279 if (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 } \
287 else \
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 
302 typedef	struct	strbuf	strbuf_t;	/*  STREAMS buffer */
303 
304 typedef	struct mque
305 {
306     struct mque	  *next;
307     struct strbuf *dat;
308 } MQUE;
309 
310 /*
311 **	Definition of a message descriptor
312 */
313 typedef 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 */
355 typedef 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 */
369 MESG		* mcreate ( char * );
370 int		mlisteninit ( MESG * );
371 MESG		* mlisten ( void );
372 int		mlistenadd ( MESG *, short );
373 int		mon_discon ( MESG *, void (*)());
374 MESG		* mlistenreset ( void );
375 int		mdestroy ( MESG * );
376 
377 /*
378 **	Client functions in order of typical usage
379 */
380 MESG		* mconnect ( char *, int, int );
381 int		mgetm ( MESG *, int, ... );
382 int		mwrite ( MESG *, char * );
383 int		mputm ( MESG *, int, ... );
384 int		mread ( MESG *, char *, int );
385 short		msize ( char * );
386 short		mpeek ( MESG * );
387 int		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 */
394 void		__mbfree ( void );
395 
396 /*
397 **	Client functions for pre-4.0 compatability
398 */
399 int		mclose ( void );
400 int		mneeds ( void );
401 int		mopen ( void );
402 int		mrecv ( char *, int );
403 int		msend ( char * );
404 
405 int		Putmsg (MESG *, strbuf_t *, strbuf_t *, int);
406 int		Getmsg (MESG *, strbuf_t *, strbuf_t *, int *);
407 int		read3_2 (MESG * md, char *msgbuf, int size);
408 int		write3_2 (MESG *, char *, int);
409 int		read_fifo (int, char *, unsigned int);
410 int		write_fifo (int, char *, unsigned int);
411 int		ResetFifoBuffer (int);
412 fifobuffer_t	*GetFifoBuffer (int);
413 
414 /*
415 **	General purpose message manipulating functions
416 */
417 char		* htos ( char *, unsigned short );
418 char		* ltos ( char *, unsigned long );
419 unsigned long	stol ( char * );
420 unsigned short	stoh ( char * );
421 int		_getmessage ( char *, short, va_list );
422 int		_putmessage ( char *, short, va_list );
423 int		getmessage ( char *, short, ... );
424 int		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