geoff@bodleian.East.Sun.COM (Geoff Arnold @ Sun BOS - R.H. coast near the top) (03/12/91)
In the two following postings I will be submitting a "work in progress" version of PCNFSD V2 for your review and consideration. Here's how I'm doing it. In the remainder of this posting, I will include a copy of the pcnfsd.x RPCGEN input. From this you can see what new functions, options, etc. I have included. The next two postings must be combined and run through uudecode, uncompress and tar to yield full sources. The Makefile is Sun style: I haven't tried it on other systems yet. Read the README file, and save a copy of the tarfile in case anything goes wrong with the rpcgen phase of making the binaries. For testing purposes you don't need a PC (except to verify backward compatibility with V1). Geoff ----------------------------------------------------------------- #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh to create the files: # pcnfsd.x # This archive created: Mon Mar 11 17:38:38 1991 by geoff, Sun Microsystems PC-NFS Engineering # # export PATH; PATH=/bin:$PATH if test -f pcnfsd.x ; then echo shar: will not over-write existing file pcnfsd.x else echo shar: extracting pcnfsd.x, 19131 characters sed 's/^X//' > pcnfsd.x <<'SHAR_EOF' X/* The maximum number of bytes in a user name argument */ Xconst IDENTLEN = 32; X/* The maximum number of bytes in a password argument */ Xconst PASSWORDLEN = 64; X/* The maximum number of bytes in a print client name argument */ Xconst CLIENTLEN = 64; X/* The maximum number of bytes in a printer name argument */ Xconst PRINTERNAMELEN = 64; X/* The maximum number of bytes in a print user name argument */ Xconst USERNAMELEN = 64; X/* The maximum number of bytes in a print spool file name argument */ Xconst SPOOLNAMELEN = 64; X/* The maximum number of bytes in a print options argument */ Xconst OPTIONSLEN = 64; X/* The maximum number of bytes in a print spool directory path */ Xconst SPOOLDIRLEN = 255; X/* The maximum number of secondary GIDs returned by a V2 AUTH */ Xconst EXTRAGIDLEN = 16; X/* The maximum number of bytes in a home directory spec */ Xconst HOMEDIRLEN = 255; X/* The maximum number of bytes in a misc. comments string */ Xconst COMMENTLEN = 255; X/* The maximum number of bytes in a print job id */ Xconst PRINTJOBIDLEN = 255; X/* The maximum number of printers returned by a LIST operation */ Xconst PRLISTMAX = 32; X/* The maximum number of print jobs returned by a QUEUE operation */ Xconst PRQUEUEMAX = 128; X/* The maximum number of entries in the facilities list */ Xconst FACILITIESMAX = 32; X/* The maximum length of an operator message */ Xconst MESSAGELEN = 512; X X X Xtypedef string ident<IDENTLEN>; X/* X** The type ident is used for passing an encoded user name for X** authentication. The server should decode the string by replacing each X** octet with the value formed by performing an exclusive-or of the octet X** value with the value 0x5b and and'ing the result with 0x7f. X*/ X Xtypedef string message<MESSAGELEN>; X/* X** The type message is used for passing an alert message to the X** system operator on the server. The text may include newlines. X*/ X Xtypedef string password<PASSWORDLEN>; X/* X** The type password is used for passing an encode password for X** authentication. The server should decode the password as described X** above. X*/ X Xtypedef string client<CLIENTLEN>; X/* X** The type client is used for passing the hostname of a client for X** printing. The server may use this name in constructing the spool X** directory name. X*/ X Xtypedef string printername<PRINTERNAMELEN>; X/* X** The type printername is used for passing the name of a printer on which X** the client wishes to print. X*/ X Xtypedef string username<USERNAMELEN>; X/* X** The type username is used for passing the user name for a print job. X** The server may use this in any way it chooses: it may attempt to change X** the effective identity with which it is running to username or may X** simply arrange for the text to be printed on the banner page. X*/ X Xtypedef string comment<COMMENTLEN>; X/* X** The type comment is used to pass an uninterpreted text string which X** may be used by displayed to a human user or used for custom X** extensions to the PCNFSD service. If you elect to extend PCNFSD X** service in this way, please do so in a way which will avoid X** problems if your client attempts to interoperate with a server X** which does not support your extension. One way to do this is to X** use the X*/ X Xtypedef string spoolname<SPOOLNAMELEN>; X/* X** The type spoolname is used for passing the name of a print spool file X** (a simple filename not a pathname) within the spool directory. X*/ X Xtypedef string printjobid<PRINTJOBIDLEN>; X/* X** The type printjobid is used for passing the id of a print job. X*/ X Xtypedef string homedir<OPTIONSLEN>; X/* X** The type homedir is used to return the home directory for the user. X** If present, it should be in the form "hostname:path", where hostname X** and path are in a suitable form for communicating with the mount server. X*/ X Xtypedef string options<OPTIONSLEN>; X/* X** The type options is used for passing implementation-specific print X** control information. The option string is a set of printable ASCII X** characters. The first character should be ignored by the server; it is X** reserved for client use. The second character specifies the type of X** data in the print file. The following types are defined (an X** implementation may define additional values): X** X** p - PostScript data. The client will ensure that a valid X** PostScript header is included. X** d - Diablo 630 data. X** x - Generic printable ASCII text. The client will have filtered X** out all non-printable characters other than CR, LF, TAB, X** BS and VT. X** r - Raw print data. The client performs no filtering. X** u - User-defined. Reserved for custom extensions. A vanilla X** pcnfsd server will treat this as equivalent to "r" X** X** If diablo data (type 'd') is specified, a formatting specification X** string will be appended. This has the form: X** ppnnnbbb X** pp X** Pitch - 10, 12 or 15. X** nnn X** The ``normal'' font to be used - encoded as follows: X** Courier crn X** Courier-Bold crb X** Courier-Oblique con X** Courier-BoldObliqu cob X** Helvetica hrn X** Helvetica-Bold hrb X** Helvetica-Oblique hon X** Helvetica-BoldOblique hob X** Times-Roman trn X** Times-Bold trb X** Times-Italic ton X** Times-BoldItalic tob X** bbb X** The ``bold'' font to be used - encoded in the same way. For example, X** the string ``nd10hrbcob'' specifies that the print data is in Diablo X** 630 format, it should be printed at 10 pitch, ``normal'' text should be X** printed in Helvetica-Bold, and ``bold'' text should be printed in X** Courier-BoldOblique. X*/ X Xenum arstat { X AUTH_RES_OK = 0, X AUTH_RES_FAKE = 1, X AUTH_RES_FAIL = 2 X}; X/* X** The type arstat is returned by PCNFSD_AUTH. A value of AUTH_RES_OK X** indicates that the server was able to verify the ident and password X** successfully.AUTH_RES_FAIL is returned if a verification failure X** occurred. The value AUTH_RES_FAKE may be used if the server wishes to X** indicate that the verification failed, but that the server has X** synthesised acceptable values for uid and gid which the client may use X** if it wishes. X*/ X Xenum alrstat { X ALERT_RES_OK = 0, X ALERT_RES_FAIL = 1 X}; X/* X** The type alrstat is returned by PCNFSD_ALERT. A value of ALERT_RES_OK X** indicates that the server was able to notify the system operator X** successfully. ALERT_RES_FAIL is returned if a failure occurred X*/ Xenum pirstat { X PI_RES_OK = 0, X PI_RES_NO_SUCH_PRINTER = 1, X PI_RES_FAIL = 2 X}; X/* X** The type pirstat is returned by a number of print operations. PI_RES_OK X** indicates that the operation was performed successfully. PI_RES_FAIL X** indicates that the printer name was valid, but the operation could X** not be performed. PI_RES_NO_SUCH_PRINTER indicates that the printer X** name was not recognised. X*/ X Xenum pcrstat { X PC_RES_OK = 0, X PC_RES_NO_SUCH_PRINTER = 1, X PC_RES_NO_SUCH_JOB = 2, X PC_RES_NOT_OWNER = 3, X PC_RES_FAIL = 4 X}; X/* X** The type pcrstat is returned by a CANCEL, REQUEUE, HOLD, or RELEASE X** print operation. X** PC_RES_OK indicates that the operation was performed successfully. X** PC_RES_NO_SUCH_PRINTER indicates that the printer name was not recognised. X** PC_RES_NO_SUCH_JOB means that the job does not exist, or is not X** associated with the specified printer. X** PC_RES_NOT_OWNER means that the user does not have permission to X** manipulate the job. X** PC_RES_FAIL means that the job could not be manipulated for an unknown X** reason. X*/ X X Xenum psrstat { X PS_RES_OK = 0, X PS_RES_ALREADY = 1, X PS_RES_NULL = 2, X PS_RES_NO_FILE = 3, X PS_RES_FAIL = 4 X}; X/* X** The type psrstat is returned by PCNFSD_PR_START. A value of PS_RES_OK X** indicates that the server has started printing the job. It is possible X** that the reply from a PCNFSD_PR_START call may be lost, in which case X** the client will repeat the call. If the spool file is still in X** existence, the server will return PS_RES_ALREADY indicating that it has X** already started printing. If the file cannot be found, PS_RES_NO_FILE X** is returned. PS_RES_NULL indicates that the spool file was empty, X** while PS_RES_FAIL denotes a general failure. PI_RES_FAIL is returned X** if spool directory could not be created. The value X** PI_RES_NO_SUCH_PRINTER indicates that the printer name was not X** recognised. X*/ X Xenum mapreq { X MAP_REQ_UID = 0, X MAP_REQ_GID = 1, X MAP_REQ_UNAME = 2, X MAP_REQ_GNAME = 3 X}; X/* X** The type mapreq identifies the type of a mapping request. X** MAP_REQ_UID requests that the server treat the value in the X** id field as a uid and return the corresponding username in name. X** MAP_REQ_GID requests that the server treat the value in the X** id field as a gid and return the corresponding groupname in name. X** MAP_REQ_UNAME requests that the server treat the value in the X** name field as a username and return the corresponding uid in id. X** MAP_REQ_GNAME requests that the server treat the value in the X** name field as a groupname and return the corresponding gid in id. X*/ X Xenum maprstat { X MAP_RES_OK = 0, X MAP_RES_UNKNOWN = 1, X MAP_RES_DENIED = 2 X}; X/* X** The type maprstat indicates the success or failure of X** an individual mapping request. X*/ X X/* X********************************************************** X** Version 1 of the PCNFSD protocol. X********************************************************** X*/ Xstruct auth_args { X ident id; X password pw; X}; Xstruct auth_results { X arstat stat; X unsigned int uid; X unsigned int gid; X}; X Xstruct pr_init_args { X client system; X printername pn; X}; Xstruct pr_init_results { X pirstat stat; X spoolname dir; X}; X Xstruct pr_start_args { X client system; X printername pn; X username user; X spoolname file; X options opts; X}; Xstruct pr_start_results { X psrstat stat; X}; X X X/* X********************************************************** X** Version 2 of the PCNFSD protocol. X********************************************************** X*/ X Xstruct v2_info_args { X comment vers; X comment cm; X}; X Xstruct v2_info_results { X comment vers; X comment cm; X int facilities<FACILITIESMAX>; X}; X Xstruct v2_pr_init_args { X client system; X printername pn; X comment cm; X}; Xstruct v2_pr_init_results { X pirstat stat; X spoolname dir; X comment cm; X}; X Xstruct v2_pr_start_args { X client system; X printername pn; X username user; X spoolname file; X options opts; X int copies; X comment cm; X}; Xstruct v2_pr_start_results { X psrstat stat; X printjobid id; X comment cm; X}; X X X Xtypedef struct pr_list_item *pr_list; X Xstruct pr_list_item { X printername pn; X printername device; X client remhost; /* empty if local */ X comment cm; X pr_list pr_next; X}; X Xstruct v2_pr_list_results { X comment cm; X pr_list printers; X}; X Xstruct v2_pr_queue_args { X printername pn; X client system; X username user; X bool just_mine; X comment cm; X}; X Xtypedef struct pr_queue_item *pr_queue; X Xstruct pr_queue_item { X int position; X printjobid id; X comment size; X comment status; X client system; X username user; X spoolname file; X comment cm; X pr_queue pr_next; X}; X Xstruct v2_pr_queue_results { X pirstat stat; X comment cm; X bool just_yours; X int qlen; X int qshown; X pr_queue jobs; X}; X X Xstruct v2_pr_cancel_args { X printername pn; X client system; X username user; X printjobid id; X comment cm; X}; Xstruct v2_pr_cancel_results { X pcrstat stat; X comment cm; X}; X X Xstruct v2_pr_status_args { X printername pn; X comment cm; X}; Xstruct v2_pr_status_results { X pirstat stat; X bool avail; X bool printing; X int qlen; X bool needs_operator; X comment status; X comment cm; X}; X Xstruct v2_pr_admin_args { X client system; X username user; X printername pn; X comment cm; X}; Xstruct v2_pr_admin_results { X pirstat stat; X comment cm; X}; X Xstruct v2_pr_requeue_args { X printername pn; X client system; X username user; X printjobid id; X int qpos; X comment cm; X}; X Xstruct v2_pr_requeue_results { X pcrstat stat; X comment cm; X}; X Xstruct v2_pr_hold_args { X printername pn; X client system; X username user; X printjobid id; X comment cm; X}; Xstruct v2_pr_hold_results { X pcrstat stat; X comment cm; X}; X Xstruct v2_pr_release_args { X printername pn; X client system; X username user; X printjobid id; X comment cm; X}; Xstruct v2_pr_release_results { X pcrstat stat; X comment cm; X}; X X Xtypedef struct mapreq_arg_item *mapreq_arg; X Xstruct mapreq_arg_item { X mapreq req; X int id; X username name; X mapreq_arg mapreq_next; X}; X Xtypedef struct mapreq_res_item *mapreq_res; X Xstruct mapreq_res_item { X mapreq req; X maprstat stat; X int id; X username name; X mapreq_res mapreq_next; X}; X Xstruct v2_mapid_args { X comment cm; X mapreq_arg req_list; X}; X X Xstruct v2_mapid_results { X comment cm; X mapreq_res res_list; X}; X Xstruct v2_auth_args { X client system; X ident id; X password pw; X comment cm; X}; Xstruct v2_auth_results { X arstat stat; X unsigned int uid; X unsigned int gid; X unsigned int gids<EXTRAGIDLEN>; X homedir home; X int def_umask; X comment cm; X}; X Xstruct v2_alert_args { X client system; X printername pn; X username user; X message msg; X}; Xstruct v2_alert_results { X alrstat stat; X comment cm; X}; X X X/* X********************************************************** X** Protocol description for the PCNFSD program X********************************************************** X*/ X/* X** Version 1 of the PCNFSD protocol. X** X** -- PCNFSD_NULL() = 0 X** Null procedure - standard for all RPC programs. X** X** -- PCNFSD_AUTH() = 1 X** Perform user authentication - map username, password into uid, gid. X** X** -- PCNFSD_PR_INIT() = 2 X** Prepare for remote printing: identify exporting spool directory. X** X** -- PCNFSD_PR_START() = 3 X** Submit a spooled print job for printing: the print data is X** in a file created in the spool directory. X** X** Version 2 of the -- PCNFSD protocol. X** X** -- PCNFSD2_NULL() = 0 X** Null procedure - standard for all RPC programs. X** X** -- PCNFSD2_INFO() = 1 X** Determine which services are supported by this implementation X** of PCNFSD. X** X** -- PCNFSD2_PR_INIT() = 2 X** Prepare for remote printing: identify exporting spool directory. X** X** -- PCNFSD2_PR_START() = 3 X** Submit a spooled print job for printing: the print data is X** in a file created in the spool directory. X** X** -- PCNFSD2_PR_LIST() = 4 X** List all printers known on the server. X** X** -- PCNFSD2_PR_QUEUE() = 5 X** List all or part of the queued jobs for a printer. X** X** -- PCNFSD2_PR_STATUS() = 6 X** Determine the status of a printer. X** X** -- PCNFSD2_PR_CANCEL() = 7 X** Cancel a print job. X** X** -- PCNFSD2_PR_ADMIN() = 8 X** Perform an implementation-dependent printer administration X** operation. X** X** -- PCNFSD2_PR_REQUEUE() = 9 X** Change the queue position of a previously-submitted print job. X** X** -- PCNFSD2_PR_HOLD() = 10 X** Place a "hold" on a previously-submitted print job. The job X** will remain in the queue, but will not be printed. X** X** -- PCNFSD2_PR_RELEASE() = 11 X** Release the "hold" on a previously-held print job. X** X** -- PCNFSD2_MAPID() = 12 X** Perform one or more translations between user and group X** names and IDs. X** X** -- PCNFSD2_AUTH() = 13 X** Perform user authentication - map username, password into uid, gid; X** may also return secondary gids, home directory, umask. X** X** -- PCNFSD2_ALERT() = 14 X** Send a message to the system operator. X*/ Xprogram PCNFSDPROG { X version PCNFSDVERS { X void PCNFSD_NULL(void) = 0; X auth_results PCNFSD_AUTH(auth_args) = 1; X pr_init_results PCNFSD_PR_INIT(pr_init_args) = 2; X pr_start_results PCNFSD_PR_START(pr_start_args) = 3; X } = 1; X/* X** Version 2 of the PCNFSD protocol. X*/ X version PCNFSDV2 { X void PCNFSD2_NULL(void) = 0; X v2_info_results PCNFSD2_INFO(v2_info_args) = 1; X v2_pr_init_results PCNFSD2_PR_INIT(v2_pr_init_args) = 2; X v2_pr_start_results PCNFSD2_PR_START(v2_pr_start_args) = 3; X v2_pr_list_results PCNFSD2_PR_LIST(void) = 4; X v2_pr_queue_results PCNFSD2_PR_QUEUE(v2_pr_queue_args) = 5; X v2_pr_status_results PCNFSD2_PR_STATUS(v2_pr_status_args) = 6; X v2_pr_cancel_results PCNFSD2_PR_CANCEL(v2_pr_cancel_args) = 7; X v2_pr_admin_results PCNFSD2_PR_ADMIN(v2_pr_admin_args) = 8; X v2_pr_requeue_results PCNFSD2_PR_REQUEUE(v2_pr_requeue_args) = 9; X v2_pr_hold_results PCNFSD2_PR_HOLD(v2_pr_hold_args) = 10; X v2_pr_release_results PCNFSD2_PR_RELEASE(v2_pr_release_args) = 11; X v2_mapid_results PCNFSD2_MAPID(v2_mapid_args) = 12; X v2_auth_results PCNFSD2_AUTH(v2_auth_args) = 13; X v2_alert_results PCNFSD2_ALERT(v2_alert_args) = 14; X } = 2; X X} = 150001; X X/* X** The following forces a publically-visible msgout() X*/ X%#if RPC_SVC X% void msgout(msg) char *msg; {_msgout(msg);} X%#endif X%#if RPC_HDR X% extern void msgout(); X%#endif SHAR_EOF len=`wc -c < pcnfsd.x` if test $len != 19131 ; then echo shar: pcnfsd.x was $len bytes long, should have been 19131 fi fi # end of overwriting check exit 0 # End of shell archive -- Geoff Arnold, PC-NFS architect, Sun Microsystems. (geoff@East.Sun.COM) -- ------------------------------------------------------------------------------ -- Sun Microsystems PC Distributed Systems ... -- -- ... soon to be a part of SunTech (stay tuned for details) --