/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ /* All Rights Reserved */ # include # include # include # include #if !defined(_LP_MSGS_H) # define _LP_MSGS_H /* * THE DISPATCH TABLE DEPENDS ON EACH R_... MESSAGE FOLLOWING * IMMEDIATELY AFTER ITS CORRESPONDING S_... COUNTERPART. * I.E R_... MESSAGE FOR A S_... MESSAGE IS (S_... + 1) */ # define R_BAD_MESSAGE 0 /* # define S_NEW_QUEUE 1 DEFUNCT */ /* # define R_NEW_QUEUE 2 DEFUNCT */ # define S_ALLOC_FILES 3 # define R_ALLOC_FILES 4 # define S_PRINT_REQUEST 5 # define R_PRINT_REQUEST 6 # define S_START_CHANGE_REQUEST 7 # define R_START_CHANGE_REQUEST 8 # define S_END_CHANGE_REQUEST 9 # define R_END_CHANGE_REQUEST 10 # define S_CANCEL_REQUEST 11 # define R_CANCEL_REQUEST 12 /* # define S_INQUIRE_REQUEST 13 DEFUNCT */ /* # define R_INQUIRE_REQUEST 14 DEFUNCT */ # define S_LOAD_PRINTER 15 # define R_LOAD_PRINTER 16 # define S_UNLOAD_PRINTER 17 # define R_UNLOAD_PRINTER 18 # define S_INQUIRE_PRINTER_STATUS 19 # define R_INQUIRE_PRINTER_STATUS 20 # define S_LOAD_CLASS 21 # define R_LOAD_CLASS 22 # define S_UNLOAD_CLASS 23 # define R_UNLOAD_CLASS 24 # define S_INQUIRE_CLASS 25 # define R_INQUIRE_CLASS 26 # define S_MOUNT 27 # define R_MOUNT 28 # define S_UNMOUNT 29 # define R_UNMOUNT 30 # define S_MOVE_REQUEST 31 # define R_MOVE_REQUEST 32 # define S_MOVE_DEST 33 # define R_MOVE_DEST 34 # define S_ACCEPT_DEST 35 # define R_ACCEPT_DEST 36 # define S_REJECT_DEST 37 # define R_REJECT_DEST 38 # define S_ENABLE_DEST 39 # define R_ENABLE_DEST 40 # define S_DISABLE_DEST 41 # define R_DISABLE_DEST 42 # define S_LOAD_FILTER_TABLE 43 # define R_LOAD_FILTER_TABLE 44 # define S_UNLOAD_FILTER_TABLE 45 # define R_UNLOAD_FILTER_TABLE 46 # define S_LOAD_PRINTWHEEL 47 # define R_LOAD_PRINTWHEEL 48 # define S_UNLOAD_PRINTWHEEL 49 # define R_UNLOAD_PRINTWHEEL 50 # define S_LOAD_USER_FILE 51 # define R_LOAD_USER_FILE 52 # define S_UNLOAD_USER_FILE 53 # define R_UNLOAD_USER_FILE 54 # define S_LOAD_FORM 55 # define R_LOAD_FORM 56 # define S_UNLOAD_FORM 57 # define R_UNLOAD_FORM 58 /* # define S_GETSTATUS 59 DEFUNCT */ /* # define R_GETSTATUS 60 DEFUNCT */ # define S_QUIET_ALERT 61 # define R_QUIET_ALERT 62 # define S_SEND_FAULT 63 # define R_SEND_FAULT 64 # define S_SHUTDOWN 65 # define R_SHUTDOWN 66 # define S_GOODBYE 67 # define S_CHILD_DONE 68 /* ** These are for use by the scheduler only */ # define I_GET_TYPE 69 # define I_QUEUE_CHK 70 /* # define R_CONNECT 71 DEFUNCT */ /* # define S_GET_STATUS 72 DEFUNCT */ /* # define R_GET_STATUS 73 DEFUNCT */ # define S_INQUIRE_REQUEST_RANK 74 # define R_INQUIRE_REQUEST_RANK 75 # define S_CANCEL 76 # define R_CANCEL 77 /* # define S_NEW_CHILD 78 DEFUNCT */ /* # define R_NEW_CHILD 79 DEFUNCT */ /* # define S_SEND_JOB 80 DEFUNCT */ /* # define R_SEND_JOB 81 DEFUNCT */ /* # define S_JOB_COMPLETED 82 DEFUNCT */ /* # define R_JOB_COMPLETED 83 DEFUNCT */ /* # define S_INQUIRE_REMOTE_PRINTER 84 DEFUNCT */ /* # define R_INQUIRE_REMOTE_PRINTER 20 DEFUNCT */ /* # define S_CHILD_SYNC 85 DEFUNCT */ /* # define S_LOAD_SYSTEM 86 DEFUNCT */ /* # define R_LOAD_SYSTEM 87 DEFUNCT */ /* # define S_UNLOAD_SYSTEM 88 DEFUNCT */ /* # define R_UNLOAD_SYSTEM 89 DEFUNCT */ /* new messages */ # define S_CLEAR_FAULT 90 # define R_CLEAR_FAULT 91 # define S_MOUNT_TRAY 92 # define R_MOUNT_TRAY 93 # define S_UNMOUNT_TRAY 94 # define R_UNMOUNT_TRAY 95 # define S_MAX_TRAYS 96 # define R_MAX_TRAYS 97 # define S_PAPER_CHANGED 98 # define R_PAPER_CHANGED 99 # define S_PAPER_ALLOWED 100 # define R_PAPER_ALLOWED 101 # define S_PASS_PEER_CONNECTION 102 # define R_PASS_PEER_CONNECTION 103 /* ** Last available message */ # define LAST_MESSAGE 104 /* ** These are the possible status codes returned by the scheduler */ # define MOK 0 # define MOKMORE 1 # define MOKREMOTE 2 # define MMORERR 3 # define MNODEST 4 # define MERRDEST 5 # define MDENYDEST 6 # define MNOMEDIA 7 # define MDENYMEDIA 8 # define MNOFILTER 9 # define MNOINFO 10 # define MNOMEM 11 # define MNOMOUNT 12 # define MNOOPEN 13 # define MNOPERM 14 # define MNOSTART 15 # define MUNKNOWN 16 # define M2LATE 17 # define MNOSPACE 18 # define MBUSY 19 # define MTRANSMITERR 20 # define MNOMORE 21 # define MGONEREMOTE 22 # define MNOTRAY 23 /* ** Offsets and lengths of the various elements of the message header. ** ** Macro Data Type Size Comment ** ** HEAD_RESYNC 2 bytes (2) * ** HEAD_AUTHCODE short + long (6) * ** ** HEAD_SIZE 4 bytes (4) \ ** HEAD_TYPE 4 bytes (4) > message propper ** HEAD_DATA n bytes (n) / ** ** TAIL_CHKSUM 4 bytes (4) * ** TAIL_ENDSYNC 2 bytes (2) * ** ** Items marked with an asterisk are only used with the 3.2 ** Spooler protocol. */ /* ** 3.2 Protocol Header Information: ** 2-byte message introduction ** 6-byte client authorization data */ #define HEAD_RESYNC (0) #define HEAD_RESYNC_LEN 2 #define HEAD_AUTHCODE (HEAD_RESYNC + HEAD_RESYNC_LEN) #define HEAD_AUTHCODE_LEN (sizeof(short) + sizeof(long)) /* ** 3.2 Protocol Message Information: ** 4-byte message size ** 4-byte message type ** n-byte message data */ #define HEAD_SIZE (HEAD_AUTHCODE + HEAD_AUTHCODE_LEN) #define HEAD_SIZE_LEN 4 #define HEAD_TYPE (HEAD_SIZE + HEAD_SIZE_LEN) #define HEAD_TYPE_LEN 4 #define HEAD_DATA (HEAD_TYPE + HEAD_TYPE_LEN) /* ** 3.2 Protocol Size of non-data header information */ #define HEAD_LEN HEAD_DATA /* ** Equivalents for 4.0 protocol */ #define MESG_SIZE (0) #define MESG_SIZE_LEN 4 #define MESG_TYPE (MESG_SIZE + MESG_SIZE_LEN) #define MESG_TYPE_LEN 4 #define MESG_DATA (MESG_TYPE + MESG_TYPE_LEN) #define MESG_LEN MESG_DATA /* ** 3.2 Protocol Trailer Information: ** 4-byte message check sum ** 2-byte message closing identifier ** ** "N" is the decoded value of buffer[HEAD_SIZE]. This must ** be provided because messages are variable length. */ #define TAIL_ENDSYNC_LEN 2 #define TAIL_ENDSYNC(N) (N - TAIL_ENDSYNC_LEN) #define TAIL_CHKSUM_LEN 4 #define TAIL_CHKSUM(N) (TAIL_ENDSYNC(N) - TAIL_CHKSUM_LEN) /* ** 3.2 Protocol Size of non-data trailer information */ #define TAIL_LEN (TAIL_CHKSUM_LEN + TAIL_ENDSYNC_LEN) /* ** 3.2 Protocol Size of all non-data information ** (This is also the minimum size for 3.2 protocol messages) */ #define CONTROL_LEN (HEAD_LEN + TAIL_LEN) /* ** Size of excess data induced by 3.2 Protocol. ** (This is also the size differance between 3.2 & 4.0 protocols) */ #define EXCESS_3_2_LEN (HEAD_SIZE + TAIL_LEN) /** ** Checksum: **/ #define CALC_CHKSUM(B,SZ,RC) \ if (SZ >= CONTROL_LEN) \ { \ register unsigned char *p = (unsigned char *)B, \ *pend = p + SZ - TAIL_LEN; \ RC = 0; \ while (p < pend) \ RC += *p++; /* let it overflow */ \ } \ else \ return ((errno = EINVAL, -1)) /* ** Largest size permitted for any given message */ # define MSGMAX 2048 /* ** Possible values of the type field of S_QUIET_ALERT */ # define QA_FORM 1 # define QA_PRINTER 2 # define QA_PRINTWHEEL 3 typedef struct strbuf strbuf_t; /* STREAMS buffer */ typedef struct mque { struct mque *next; struct strbuf *dat; } MQUE; /* ** Definition of a message descriptor */ typedef struct { short type; /* type of connection */ int readfd; /* STREAM fd to read from */ int writefd; /* STREAM fd to write to */ int wait; /* number of systems waiting for */ char *file; /* pipe name if type==MD_FIFO */ short state; /* Current state of client */ short admin; /* Non zero if admin */ short event; /* Event returned from poll */ MQUE * mque; /* backlogged message ptr */ uid_t uid; /* Clients UID */ gid_t gid; /* Clients GID */ char * slabel; /* Clients SLABEL */ void (**on_discon)(); /* Clean up functions */ } MESG; # define MDSIZE (sizeof(MESG)) /* ** Possible values of MESG.state */ # define MDS_IDLE 0 # define MDS_32PROTO 320 # define MDS_32CONNECT 321 /* ** Possible values of MESG.type */ # define MD_UNKNOWN 0 /* We don't know just yet */ # define MD_STREAM 1 /* 4.0 STREAMS pipe protocol */ # define MD_BOUND 2 /* 4.0 STREAMS fd protocol */ # define MD_SYS_FIFO 3 /* 3.2 named-pipe protocol */ # define MD_USR_FIFO 4 /* 3.2 named-pipe protocol */ # define MD_MASTER 5 /* MD_STREAM used by lpsched */ # define MD_CHILD 6 /* MD_STREAM to a child process */ /* ** Definition for a FIFO buffer (used ** in read_fifo. */ typedef struct { int full; char save [MSGMAX], *psave, *psave_end; } fifobuffer_t; /* ** Definitions for the rest of the world and lint */ /* ** Server functions in order of usage */ MESG * mcreate ( char * ); int mlisteninit ( MESG * ); MESG * mlisten ( void ); int mlistenadd ( MESG *, short ); int mon_discon ( MESG *, void (*)()); MESG * mlistenreset ( void ); int mdestroy ( MESG * ); /* ** Client functions in order of typical usage */ MESG * mconnect ( char *, int, int ); int mgetm ( MESG *, int, ... ); int mwrite ( MESG *, char * ); int mputm ( MESG *, int, ... ); int mread ( MESG *, char *, int ); short msize ( char * ); short mpeek ( MESG * ); int mdisconnect ( MESG * ); /* ** This may be called to deallocate internal buffers allocated ** by mgetm and mputm. Probably not useful except right before ** a fork(). */ void __mbfree ( void ); /* ** Client functions for pre-4.0 compatability */ int mclose ( void ); int mneeds ( void ); int mopen ( void ); int mrecv ( char *, int ); int msend ( char * ); int Putmsg (MESG *, strbuf_t *, strbuf_t *, int); int Getmsg (MESG *, strbuf_t *, strbuf_t *, int *); int read3_2 (MESG * md, char *msgbuf, int size); int write3_2 (MESG *, char *, int); int read_fifo (int, char *, unsigned int); int write_fifo (int, char *, unsigned int); int ResetFifoBuffer (int); fifobuffer_t *GetFifoBuffer (int); /* ** General purpose message manipulating functions */ char * htos ( char *, unsigned short ); char * ltos ( char *, unsigned long ); unsigned long stol ( char * ); unsigned short stoh ( char * ); int _getmessage ( char *, short, va_list ); int _putmessage ( char *, short, va_list ); int getmessage ( char *, short, ... ); int putmessage ( char *, short, ... ); /* ** This will yield the type of a message */ # define mtype(buffer) (getmessage(buffer, I_GET_TYPE)) /* ** This will yeild the size of a message */ # define msize(buffer) (stoh(buffer)) /* ** Pass this for the request-id argument of S_CANCEL ** to obtain the effect of the 3.2 S_CANCEL_REQUEST. */ # define CURRENT_REQ "current" #endif /* !defined (_LP_MSGS_H) */