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