/* $NetBSD: pcnfsd.x,v 1.6 2009/04/18 13:02:36 lukem Exp $ */ /* The maximum number of bytes in a user name argument */ const IDENTLEN = 32; /* The maximum number of bytes in a password argument */ const PASSWORDLEN = 64; /* The maximum number of bytes in a print client name argument */ const CLIENTLEN = 64; /* The maximum number of bytes in a printer name argument */ const PRINTERNAMELEN = 64; /* The maximum number of bytes in a print user name argument */ const USERNAMELEN = 64; /* The maximum number of bytes in a print spool file name argument */ const SPOOLNAMELEN = 64; /* The maximum number of bytes in a print options argument */ const OPTIONSLEN = 64; /* The maximum number of bytes in a print spool directory path */ const SPOOLDIRLEN = 255; /* The maximum number of secondary GIDs returned by a V2 AUTH */ const EXTRAGIDLEN = 16; /* The maximum number of bytes in a home directory spec */ const HOMEDIRLEN = 255; /* The maximum number of bytes in a misc. comments string */ const COMMENTLEN = 255; /* The maximum number of bytes in a print job id */ const PRINTJOBIDLEN = 255; /* The maximum number of printers returned by a LIST operation */ const PRLISTMAX = 32; /* The maximum number of print jobs returned by a QUEUE operation */ const PRQUEUEMAX = 128; /* The maximum number of entries in the facilities list */ const FACILITIESMAX = 32; /* The maximum length of an operator message */ const MESSAGELEN = 512; typedef string ident; /* ** The type ident is used for passing an encoded user name for ** authentication. The server should decode the string by replacing each ** octet with the value formed by performing an exclusive-or of the octet ** value with the value 0x5b and and'ing the result with 0x7f. */ typedef string message; /* ** The type message is used for passing an alert message to the ** system operator on the server. The text may include newlines. */ typedef string password; /* ** The type password is used for passing an encode password for ** authentication. The server should decode the password as described ** above. */ typedef string client; /* ** The type client is used for passing the hostname of a client for ** printing. The server may use this name in constructing the spool ** directory name. */ typedef string printername; /* ** The type printername is used for passing the name of a printer on which ** the client wishes to print. */ typedef string username; /* ** The type username is used for passing the user name for a print job. ** The server may use this in any way it chooses: it may attempt to change ** the effective identity with which it is running to username or may ** simply arrange for the text to be printed on the banner page. */ typedef string comment; /* ** The type comment is used to pass an uninterpreted text string which ** may be used by displayed to a human user or used for custom ** extensions to the PCNFSD service. If you elect to extend PCNFSD ** service in this way, please do so in a way which will avoid ** problems if your client attempts to interoperate with a server ** which does not support your extension. One way to do this is to ** use the */ typedef string spoolname; /* ** The type spoolname is used for passing the name of a print spool file ** (a simple filename not a pathname) within the spool directory. */ typedef string printjobid; /* ** The type printjobid is used for passing the id of a print job. */ typedef string homedir; /* ** The type homedir is used to return the home directory for the user. ** If present, it should be in the form "hostname:path", where hostname ** and path are in a suitable form for communicating with the mount server. */ typedef string options; /* ** The type options is used for passing implementation-specific print ** control information. The option string is a set of printable ASCII ** characters. The first character should be ignored by the server; it is ** reserved for client use. The second character specifies the type of ** data in the print file. The following types are defined (an ** implementation may define additional values): ** ** p - PostScript data. The client will ensure that a valid ** PostScript header is included. ** d - Diablo 630 data. ** x - Generic printable ASCII text. The client will have filtered ** out all non-printable characters other than CR, LF, TAB, ** BS and VT. ** r - Raw print data. The client performs no filtering. ** u - User-defined. Reserved for custom extensions. A vanilla ** pcnfsd server will treat this as equivalent to "r" ** ** If diablo data (type 'd') is specified, a formatting specification ** string will be appended. This has the form: ** ppnnnbbb ** pp ** Pitch - 10, 12 or 15. ** nnn ** The ``normal'' font to be used - encoded as follows: ** Courier crn ** Courier-Bold crb ** Courier-Oblique con ** Courier-BoldObliqu cob ** Helvetica hrn ** Helvetica-Bold hrb ** Helvetica-Oblique hon ** Helvetica-BoldOblique hob ** Times-Roman trn ** Times-Bold trb ** Times-Italic ton ** Times-BoldItalic tob ** bbb ** The ``bold'' font to be used - encoded in the same way. For example, ** the string ``nd10hrbcob'' specifies that the print data is in Diablo ** 630 format, it should be printed at 10 pitch, ``normal'' text should be ** printed in Helvetica-Bold, and ``bold'' text should be printed in ** Courier-BoldOblique. */ enum arstat { AUTH_RES_OK = 0, AUTH_RES_FAKE = 1, AUTH_RES_FAIL = 2 }; /* ** The type arstat is returned by PCNFSD_AUTH. A value of AUTH_RES_OK ** indicates that the server was able to verify the ident and password ** successfully.AUTH_RES_FAIL is returned if a verification failure ** occurred. The value AUTH_RES_FAKE may be used if the server wishes to ** indicate that the verification failed, but that the server has ** synthesised acceptable values for uid and gid which the client may use ** if it wishes. */ enum alrstat { ALERT_RES_OK = 0, ALERT_RES_FAIL = 1 }; /* ** The type alrstat is returned by PCNFSD_ALERT. A value of ALERT_RES_OK ** indicates that the server was able to notify the system operator ** successfully. ALERT_RES_FAIL is returned if a failure occurred */ enum pirstat { PI_RES_OK = 0, PI_RES_NO_SUCH_PRINTER = 1, PI_RES_FAIL = 2 }; /* ** The type pirstat is returned by a number of print operations. PI_RES_OK ** indicates that the operation was performed successfully. PI_RES_FAIL ** indicates that the printer name was valid, but the operation could ** not be performed. PI_RES_NO_SUCH_PRINTER indicates that the printer ** name was not recognised. */ enum pcrstat { PC_RES_OK = 0, PC_RES_NO_SUCH_PRINTER = 1, PC_RES_NO_SUCH_JOB = 2, PC_RES_NOT_OWNER = 3, PC_RES_FAIL = 4 }; /* ** The type pcrstat is returned by a CANCEL, REQUEUE, HOLD, or RELEASE ** print operation. ** PC_RES_OK indicates that the operation was performed successfully. ** PC_RES_NO_SUCH_PRINTER indicates that the printer name was not recognised. ** PC_RES_NO_SUCH_JOB means that the job does not exist, or is not ** associated with the specified printer. ** PC_RES_NOT_OWNER means that the user does not have permission to ** manipulate the job. ** PC_RES_FAIL means that the job could not be manipulated for an unknown ** reason. */ enum psrstat { PS_RES_OK = 0, PS_RES_ALREADY = 1, PS_RES_NULL = 2, PS_RES_NO_FILE = 3, PS_RES_FAIL = 4 }; /* ** The type psrstat is returned by PCNFSD_PR_START. A value of PS_RES_OK ** indicates that the server has started printing the job. It is possible ** that the reply from a PCNFSD_PR_START call may be lost, in which case ** the client will repeat the call. If the spool file is still in ** existence, the server will return PS_RES_ALREADY indicating that it has ** already started printing. If the file cannot be found, PS_RES_NO_FILE ** is returned. PS_RES_NULL indicates that the spool file was empty, ** while PS_RES_FAIL denotes a general failure. PI_RES_FAIL is returned ** if spool directory could not be created. The value ** PI_RES_NO_SUCH_PRINTER indicates that the printer name was not ** recognised. */ enum mapreq { MAP_REQ_UID = 0, MAP_REQ_GID = 1, MAP_REQ_UNAME = 2, MAP_REQ_GNAME = 3 }; /* ** The type mapreq identifies the type of a mapping request. ** MAP_REQ_UID requests that the server treat the value in the ** id field as a uid and return the corresponding username in name. ** MAP_REQ_GID requests that the server treat the value in the ** id field as a gid and return the corresponding groupname in name. ** MAP_REQ_UNAME requests that the server treat the value in the ** name field as a username and return the corresponding uid in id. ** MAP_REQ_GNAME requests that the server treat the value in the ** name field as a groupname and return the corresponding gid in id. */ enum maprstat { MAP_RES_OK = 0, MAP_RES_UNKNOWN = 1, MAP_RES_DENIED = 2 }; /* ** The type maprstat indicates the success or failure of ** an individual mapping request. */ /* ********************************************************** ** Version 1 of the PCNFSD protocol. ********************************************************** */ struct auth_args { ident id; password pw; }; struct auth_results { arstat stat; unsigned int uid; unsigned int gid; }; struct pr_init_args { client system; printername pn; }; struct pr_init_results { pirstat stat; spoolname dir; }; struct pr_start_args { client system; printername pn; username user; spoolname file; options opts; }; struct pr_start_results { psrstat stat; }; /* ********************************************************** ** Version 2 of the PCNFSD protocol. ********************************************************** */ struct v2_info_args { comment vers; comment cm; }; struct v2_info_results { comment vers; comment cm; int facilities; }; struct v2_pr_init_args { client system; printername pn; comment cm; }; struct v2_pr_init_results { pirstat stat; spoolname dir; comment cm; }; struct v2_pr_start_args { client system; printername pn; username user; spoolname file; options opts; int copies; comment cm; }; struct v2_pr_start_results { psrstat stat; printjobid id; comment cm; }; typedef struct pr_list_item *pr_list; struct pr_list_item { printername pn; printername device; client remhost; /* empty if local */ comment cm; pr_list pr_next; }; struct v2_pr_list_results { comment cm; pr_list printers; }; struct v2_pr_queue_args { printername pn; client system; username user; bool just_mine; comment cm; }; typedef struct pr_queue_item *pr_queue; struct pr_queue_item { int position; printjobid id; comment size; comment status; client system; username user; spoolname file; comment cm; pr_queue pr_next; }; struct v2_pr_queue_results { pirstat stat; comment cm; bool just_yours; int qlen; int qshown; pr_queue jobs; }; struct v2_pr_cancel_args { printername pn; client system; username user; printjobid id; comment cm; }; struct v2_pr_cancel_results { pcrstat stat; comment cm; }; struct v2_pr_status_args { printername pn; comment cm; }; struct v2_pr_status_results { pirstat stat; bool avail; bool printing; int qlen; bool needs_operator; comment status; comment cm; }; struct v2_pr_admin_args { client system; username user; printername pn; comment cm; }; struct v2_pr_admin_results { pirstat stat; comment cm; }; struct v2_pr_requeue_args { printername pn; client system; username user; printjobid id; int qpos; comment cm; }; struct v2_pr_requeue_results { pcrstat stat; comment cm; }; struct v2_pr_hold_args { printername pn; client system; username user; printjobid id; comment cm; }; struct v2_pr_hold_results { pcrstat stat; comment cm; }; struct v2_pr_release_args { printername pn; client system; username user; printjobid id; comment cm; }; struct v2_pr_release_results { pcrstat stat; comment cm; }; typedef struct mapreq_arg_item *mapreq_arg; struct mapreq_arg_item { mapreq req; int id; username name; mapreq_arg mapreq_next; }; typedef struct mapreq_res_item *mapreq_res; struct mapreq_res_item { mapreq req; maprstat stat; int id; username name; mapreq_res mapreq_next; }; struct v2_mapid_args { comment cm; mapreq_arg req_list; }; struct v2_mapid_results { comment cm; mapreq_res res_list; }; struct v2_auth_args { client system; ident id; password pw; comment cm; }; struct v2_auth_results { arstat stat; unsigned int uid; unsigned int gid; unsigned int gids; homedir home; int def_umask; comment cm; }; struct v2_alert_args { client system; printername pn; username user; message msg; }; struct v2_alert_results { alrstat stat; comment cm; }; /* ********************************************************** ** Protocol description for the PCNFSD program ********************************************************** */ /* ** Version 1 of the PCNFSD protocol. ** ** -- PCNFSD_NULL() = 0 ** Null procedure - standard for all RPC programs. ** ** -- PCNFSD_AUTH() = 1 ** Perform user authentication - map username, password into uid, gid. ** ** -- PCNFSD_PR_INIT() = 2 ** Prepare for remote printing: identify exporting spool directory. ** ** -- PCNFSD_PR_START() = 3 ** Submit a spooled print job for printing: the print data is ** in a file created in the spool directory. ** ** Version 2 of the -- PCNFSD protocol. ** ** -- PCNFSD2_NULL() = 0 ** Null procedure - standard for all RPC programs. ** ** -- PCNFSD2_INFO() = 1 ** Determine which services are supported by this implementation ** of PCNFSD. ** ** -- PCNFSD2_PR_INIT() = 2 ** Prepare for remote printing: identify exporting spool directory. ** ** -- PCNFSD2_PR_START() = 3 ** Submit a spooled print job for printing: the print data is ** in a file created in the spool directory. ** ** -- PCNFSD2_PR_LIST() = 4 ** List all printers known on the server. ** ** -- PCNFSD2_PR_QUEUE() = 5 ** List all or part of the queued jobs for a printer. ** ** -- PCNFSD2_PR_STATUS() = 6 ** Determine the status of a printer. ** ** -- PCNFSD2_PR_CANCEL() = 7 ** Cancel a print job. ** ** -- PCNFSD2_PR_ADMIN() = 8 ** Perform an implementation-dependent printer administration ** operation. ** ** -- PCNFSD2_PR_REQUEUE() = 9 ** Change the queue position of a previously-submitted print job. ** ** -- PCNFSD2_PR_HOLD() = 10 ** Place a "hold" on a previously-submitted print job. The job ** will remain in the queue, but will not be printed. ** ** -- PCNFSD2_PR_RELEASE() = 11 ** Release the "hold" on a previously-held print job. ** ** -- PCNFSD2_MAPID() = 12 ** Perform one or more translations between user and group ** names and IDs. ** ** -- PCNFSD2_AUTH() = 13 ** Perform user authentication - map username, password into uid, gid; ** may also return secondary gids, home directory, umask. ** ** -- PCNFSD2_ALERT() = 14 ** Send a message to the system operator. */ program PCNFSDPROG { version PCNFSDVERS { void PCNFSD_NULL(void) = 0; auth_results PCNFSD_AUTH(auth_args) = 1; pr_init_results PCNFSD_PR_INIT(pr_init_args) = 2; pr_start_results PCNFSD_PR_START(pr_start_args) = 3; } = 1; /* ** Version 2 of the PCNFSD protocol. */ version PCNFSDV2 { void PCNFSD2_NULL(void) = 0; v2_info_results PCNFSD2_INFO(v2_info_args) = 1; v2_pr_init_results PCNFSD2_PR_INIT(v2_pr_init_args) = 2; v2_pr_start_results PCNFSD2_PR_START(v2_pr_start_args) = 3; v2_pr_list_results PCNFSD2_PR_LIST(void) = 4; v2_pr_queue_results PCNFSD2_PR_QUEUE(v2_pr_queue_args) = 5; v2_pr_status_results PCNFSD2_PR_STATUS(v2_pr_status_args) = 6; v2_pr_cancel_results PCNFSD2_PR_CANCEL(v2_pr_cancel_args) = 7; v2_pr_admin_results PCNFSD2_PR_ADMIN(v2_pr_admin_args) = 8; v2_pr_requeue_results PCNFSD2_PR_REQUEUE(v2_pr_requeue_args) = 9; v2_pr_hold_results PCNFSD2_PR_HOLD(v2_pr_hold_args) = 10; v2_pr_release_results PCNFSD2_PR_RELEASE(v2_pr_release_args) = 11; v2_mapid_results PCNFSD2_MAPID(v2_mapid_args) = 12; v2_auth_results PCNFSD2_AUTH(v2_auth_args) = 13; v2_alert_results PCNFSD2_ALERT(v2_alert_args) = 14; } = 2; } = 150001; /* ** The following forces a publically-visible msg_out() */ %#if RPC_SVC % static void _msgout __P((const char *)); % void msg_out(msg) const char *msg; {_msgout(msg);} %#endif %#if RPC_HDR % extern void msg_out __P((const char *)); %#endif /* ** This allows initialization prior to running the service. (see PR 12758) */ %#if RPC_SVC %#define main mymain %#endif