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" /* SVr4.0 1.18 */ 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 47 # define R_NEW_QUEUE 2 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 59 # define R_INQUIRE_REQUEST 14 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 105 # define R_GETSTATUS 60 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 121 122 # define S_GET_STATUS 72 123 # define R_GET_STATUS 73 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 129 # define R_NEW_CHILD 79 130 # define S_SEND_JOB 80 131 # define R_SEND_JOB 81 132 # define S_JOB_COMPLETED 82 133 # define R_JOB_COMPLETED 83 134 # define S_INQUIRE_REMOTE_PRINTER 84 135 # define R_INQUIRE_REMOTE_PRINTER 20 136 # define S_CHILD_SYNC 85 137 # define S_LOAD_SYSTEM 86 138 # define R_LOAD_SYSTEM 87 139 # define S_UNLOAD_SYSTEM 88 140 # define R_UNLOAD_SYSTEM 89 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