diff options
Diffstat (limited to 'xpa.h')
-rw-r--r-- | xpa.h | 556 |
1 files changed, 556 insertions, 0 deletions
@@ -0,0 +1,556 @@ +/* + * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory + */ + +/* + * + * xpa.h - include file for the X Public Access mechanism + * + */ + +#ifndef __xpa_h +#define __xpa_h + +#include <stdio.h> +#include <sys/types.h> +#include <prsetup.h> +#if HAVE_MINGW32 +#include <winsock2.h> +#endif + +#define XPA_MAJOR_VERSION 2 +#define XPA_MINOR_VERSION 1 +#define XPA_PATCH_LEVEL 18 +#define XPA_VERSION "2.1.18" + +/* #define XPA_DEBUG 1 */ +#ifdef XPA_DEBUG +#define FPRINTF(x) fprintf x +#define PERROR(x) perror x +#else +#define FPRINTF(x) +#define PERROR(x) +#endif + +/* types of xpa request */ +#define XPA_SET 1 +#define XPA_GET 2 +#define XPA_INFO 3 +#define XPA_ACCESS 4 +/* not actually commands but ... */ +#define XPA_DATA 5 +#define XPA_ACCEPT 6 +#define XPA_NAGLE 7 + +/* this is the number of actual commands we have above */ +#define XPA_CMDS 4 + +/* comm modes */ +#define COMM_RESERVED 1 +#define COMM_CONNECT 2 + +/* the ever-present */ +#ifndef SZ_LINE +#define SZ_LINE 4096 +#endif + +/* limit the length of the name and xclass strings */ +/* at least 2 of these should fit into SZ_LINE with lots of room to spare */ +#define XPA_NAMELEN 1024 + +/* defines the types of callback procedure we use */ +typedef int (*SendCb)( +#ifdef ANSI_FUNC + void *client_data, + void *call_data, + char *paramlist, + char **buf, + size_t *len +#endif +); + +typedef int (*ReceiveCb)( +#ifdef ANSI_FUNC + void *client_data, + void *call_data, + char *paramlist, + char *buf, + size_t len +#endif +); + +typedef int (*InfoCb)( +#ifdef ANSI_FUNC + void *client_data, + void *call_data, + char *paramlist +#endif +); + +typedef void *(*SelAdd)( +#ifdef ANSI_FUNC + void *client_data, + int fd +#endif +); + +typedef void (*SelDel)( +#ifdef ANSI_FUNC + void *client_data +#endif +); + +typedef void (*SelOn)( +#ifdef ANSI_FUNC + void *client_data +#endif +); + +typedef void (*SelOff)( +#ifdef ANSI_FUNC + void *client_data +#endif +); + +typedef void (*MyFree)( +#ifdef ANSI_FUNC + void *buf +#endif +); + +typedef void Sigfunc( +#ifdef ANSI_FUNC + int +#endif +); + +/* + * + * + * xpa access control record structure + * + */ +typedef struct aclrec{ + struct aclrec *next; + char *xclass; + char *name; + unsigned int ip; + char *acl; + int flag; +} *XACL, XACLRec; + +/* + * + * + * port management record structure + * + */ +typedef struct portrec{ + struct portrec *next; + char *xclass; + char *name; + int port; +} *PORT, PORTRec; + +/* + * + * + * xpa name server management + * + */ +typedef struct nsrec{ + struct nsrec *next; + char *method; + int nxpa; + int nproxy; + char *host; + int fd; + FILE *in; + FILE *out; + /* for AF_INET */ + unsigned int ip; + int port; + /* for AF_UNIX */ + char *name; +} *NS, NSRec; + +/* + * + * + * xpa communication structure for each connection + * + */ +typedef struct xpacommrec{ + struct xpacommrec *next; + int status; + int message; + int n; + int cmd; + int mode; + int telnet; + int usebuf; + int useacl; + char *id; + char *info; + char *target; + char *paramlist; + int cmdfd; + int datafd; + char *cendian; + int ack; + /* buf and len passed to callbacks */ + char *buf; + size_t len; + /* for AF_INET */ + unsigned int cmdip; + int cmdport; + int dataport; + /* for AF_UNIX */ + char *cmdname; + char *dataname; + int acl[XPA_CMDS+1]; + /* for handling fd's in non-select event loops */ + void *selcptr; /* cmdfd struct for seldel */ + void *seldptr; /* datafd struct for seldel */ + /* pointer to associated name server */ + struct nsrec *ns; + /* myfree routine */ + MyFree myfree; + void *myfree_ptr; +} *XPAComm, XPACommRec; + +/* + * + * + * clipboard record structure + * + */ +typedef struct cliprec{ + struct cliprec *next; + unsigned int ip; + char *name; + char *value; +} *XPAClip, XPAClipRec; + +/* + * + * record struct for receiving data from stdin + * + */ +typedef struct xpainputrec{ + struct xpainputrec *next; + size_t start; + size_t end; + size_t bytes; + char *buf; +} *XPAInput, XPAInputRec; + +/* + * + * + * xpa command record structure + * + */ +typedef struct xpacmdrec{ + struct xpacmdrec *next; + struct xparec *xpa; + char *name; + char *help; + int ntokens; + /* send callback info */ + SendCb send_callback; + void *send_data; + int send_mode; + /* receive callback info */ + ReceiveCb receive_callback; + void *receive_data; + int receive_mode; +} *XPACmd, XPACmdRec; + +/* + * + * + * xpa client record structure + * + */ +typedef struct xpaclientrec{ + struct xpaclientrec *next; + int status; + char *id; + char *xtemplate; + int type; + char *xclass; + char *name; + char *method; + char *info; + char *dataname; + unsigned int ip; + int cmdfd; + int datafd; + int mode; + int nsproxy; + /* xpaget parameters */ + char **bufptr; + size_t *lenptr; + size_t bufsize; + int fd; + /* xpaset parameters */ + char *buf; + size_t len; + size_t bytes; + /* fork parameters */ + pid_t pid; + /* common parameters */ + char **nameptr; + char **errptr; +} *XPAClient, XPAClientRec; + +/* + * + * + * main xpa record structure + * + * explanation of send_mode and receive_mode flags: + * + * receive-specific callback modes: + * + * r (raw) -- don't read data into buf (callback will read) + * + * general callback modes: + * + * r (raw) -- write raw data without protocol info to client + * s (save) -- 's' save passed buf (don't free it) + * + */ +typedef struct xparec{ + /* xpa version */ + char *version; + /* status of this xpa */ + int status; + /* "g", "s", "i" are server types; "c" for client */ + char *type; + /* + * THE SERVER SIDE + */ + struct xparec *next; + char *xclass; + char *name; + char *help; + /* send callback info */ + SendCb send_callback; + void *send_data; + int send_mode; + /* receive callback info */ + ReceiveCb receive_callback; + void *receive_data; + int receive_mode; + /* info callback info */ + InfoCb info_callback; + void *info_data; + int info_mode; + /* list of sub-commands for this access point */ + XPACmd commands; + /* communication info */ + int fd; /* listening socket file descriptor */ + char *method; /* method string: host:ip or unix_filename */ + NS nshead; /* name servers associated with this access point */ + XPAComm commhead; /* linked list of communcation records */ + XPAClip cliphead; /* linked list of cliboard records */ + char *filename; /* file name (unix sockets) for listening */ + char *sendian; /* endian-ness of server */ + /* request-specific info */ + XPAComm comm; /* current comm if we are processing a request */ + /* select loop info */ + SelDel seldel; /* routine to remove xpa socket from select loop */ + SelAdd seladd; /* routine to add xpa command sockets to select loop */ + SelOn selon; /* routine to enable xpa command sockets */ + SelOff seloff; /* routine to disable xpa command sockets */ + void *selptr; /* additional info for seldelete() */ + /* + * THE CLIENT SIDE + */ + int persist; /* flag whether this is a persistent client */ + int nclient; /* number of clients -- used in processing headers */ + int client_mode; /* global client mode */ + XPAClient clienthead; /* linked list of active clients */ + int ifd; /* input fd for XPASetFd() */ + size_t inpbytes; /* total number of bytes in input lists */ + XPAInput inphead; /* linked list of input structs */ +} *XPA, XPARec; + +/* macros to access the xpa struct */ +#define xpa_name(xpa) ((xpa)->name) +#define xpa_class(xpa) ((xpa)->xclass) +#define xpa_method(xpa) ((xpa)->method) +#define xpa_sendian(xpa) ((xpa)->sendian) +#define xpa_comm(xpa) (xpa&&(xpa)->comm?(xpa)->comm:NULL) +#define xpa_cendian(xpa) (((xpa)->comm&&(xpa)->comm->cendian)?(xpa)->comm->cendian:"?") +#define xpa_cmdfd(xpa) ((xpa)->comm?(xpa)->comm->cmdfd:-1) +#define xpa_datafd(xpa) ((xpa)->comm?(xpa)->comm->datafd:-1) +#define xpa_ack(xpa) ((xpa)->comm?(xpa)->comm->ack:1) +#define xpa_status(xpa) ((xpa)->comm?(xpa)->comm->status:0) +#define xpa_id(xpa) (((xpa)->comm&&(xpa)->comm->id)?(xpa)->comm->id:"?") + +extern char *xpaMessbuf[]; + +_PRbeg + +XPA XPAListHead _PRx((void)); +void XPAListAdd _PRx((XPA *head, XPA xpa)); +void XPAListDel _PRx((XPA *head, XPA xpa)); +int XPAActive _PRx((XPA xpa, XPAComm comm, int flag)); +int XPAActiveFd _PRx((int fd)); +int XPAAddSelect _PRx((XPA xpa, fd_set *readfdsptr)); +int XPAProcessSelect _PRx((fd_set *readfdsptr, int maxreq)); +void XPACloseData _PRx((XPA xpa, XPAComm comm)); +int XPAHandler _PRx((XPA xpa, int fd)); +void XPAMode _PRx((char *mode, int *flag, char *name, int mask, int def)); +int XPAEndian _PRx((void)); +char *XPATmpdir _PRx((void)); +void XPACleanup _PRx((void)); +int XPASetBuf _PRx((XPA xpa, char *buf, size_t len, int xcopy)); +int XPASetFree _PRx((XPA xpa, MyFree myfree, void *myfree_ptr)); +int XPAShortTimeout _PRx((void)); +int XPALongTimeout _PRx((void)); +int XPASendLTimeout _PRx((void *client_data, void *call_data, + char *paramlist, char **buf, size_t *len)); +int XPAReceiveLTimeout _PRx((void *client_data, void *call_data, + char *paramlist, char *buf, size_t len)); +int XPASendSTimeout _PRx((void *client_data, void *call_data, + char *paramlist, char **buf, size_t *len)); +int XPAReceiveSTimeout _PRx((void *client_data, void *call_data, + char *paramlist, char *buf, size_t len)); +int XPADebug _PRx((void)); +int XPASigusr1 _PRx((void)); +int XPAVerbosity _PRx((void)); +void XPAInitEnv _PRx((void)); +void XPAParseName _PRx((char *xpaname, char *xclass, char *name, int len)); +int XPAParseIpPort _PRx((char *host, unsigned int *ip, unsigned short *port)); +int XPAParseUnixSocket _PRx((char *host)); +int _XPAValid _PRx((XPA head, XPA xpa, char *type)); +int XPAValid _PRx((XPA xpa)); +char *XPATimestamp _PRx((void)); +int XPAError _PRx((XPA xpa, char *s)); +int XPAOK _PRx((XPA xpa)); +int XPAMessage _PRx((XPA xpa, char *s)); +char *XPAArgvParamlist _PRx((int argc, char **argv, int start)); +int XPAMethod _PRx((char *method)); +int XPAAccess _PRx((XPA xpa, char *xtemplate, char *paramlist, char *mode, + char **names, char **messages, int n)); +int XPANSLookup _PRx((XPA xpa, char *tname, char *ttype, + char ***xclasses, char ***names, + char ***methods, char ***infs)); +int XPANSClose _PRx((XPA xpa, NS ns)); +int XPANSKeepAlive _PRx((XPA xpa, int type)); +int XPANSAdd _PRx((XPA xpa, char *host, char *mode)); +int XPANSDel _PRx((XPA xpa, char *host, char *mode)); +int XPAVersionCheck _PRx((char *serv, char *nsv)); +void XPAVersionWarn _PRx((char *myv, char *nsv)); +char *XPANSMethod _PRx((char *host, int flag)); +XPA XPANew _PRx((char *xclass, char *name, char *help, + SendCb send_callback, void *send_data, char *send_mode, + ReceiveCb rec_callback, void *rec_data, char *rec_mode)); +int XPAFree _PRx((XPA xpa)); +XPA XPAInfoNew _PRx((char *xclass, char *name, + InfoCb info_callback, void *info_data, char *info_mode)); +int XPAPoll _PRx((int msec, int maxreq)); +int XPAMainLoop _PRx((void)); +void XPASleep _PRx((int msec)); +void XPAAtExit _PRx((void)); +/* command.c */ +void XPAInitReserved _PRx((void)); +void XPAFreeReserved _PRx((void)); +XPACmd XPACmdLookupReserved _PRx((XPA xpa, char *lbuf, int *lp)); +XPACmd XPACmdLookup _PRx((XPA xpa, char *lbuf, int *lp)); +int XPAReceiveCommands _PRx((void *client_data, void *call_data, + char *paramlist, char *buf, size_t len)); +int XPASendCommands _PRx((void *client_data, void *call_data, + char *paramlist, char **buf, size_t *len)); +XPA XPACmdNew _PRx((char *xclass, char *name)); +XPACmd XPACmdAdd _PRx((XPA xpa, char *name, char *help, + SendCb send_callback, void *send_data, char *send_mode, + ReceiveCb rec_callback, void *rec_data, char *rec_mode)); +int XPACmdDel _PRx((XPA xpa, XPACmd cmd)); +int XPACmdInternalReceive _PRx((void *client_data, void *call_data, + char *paramlist, char *buf, size_t len)); +int XPACmdInternalSend _PRx((void *client_data, void *call_data, + char *paramlist, char **buf, size_t *len)); +XPA XPAGetReserved _PRx((void)); +int XPAMtype _PRx((void)); +/* client.c */ +int XPAClientAddSelect _PRx((XPA xpa, + fd_set *readfdsptr, fd_set *writefdsptr)); +int XPAClientProcessSelect _PRx((XPA xpa, + fd_set *readfdsptr, fd_set *writefdsptr, + int maxreq)); +XPA XPAOpen _PRx((char *mode)); +void XPAClose _PRx((XPA xpa)); +int XPAGet _PRx((XPA xpa, char *xtemplate, + char *paramlist, char *mode, + char **bufs, size_t *lens, char **names, char **errs, int n)); +int XPAGetFd _PRx((XPA xpa, char *xtemplate, + char *paramlist, char *mode, + int *fds, char **names, char **errs, int n)); +int XPASet _PRx((XPA xpa, char *xtemplate, + char *paramlist, char *mode, + char *buf, size_t len, char **names, char **errs, int n)); +int XPASetFd _PRx((XPA xpa, char *xtemplate, + char *paramlist, char *mode, + int fd, char **names, char **errs, int n)); +int XPAInfo _PRx((XPA xpa, char *xtemplate, + char *paramlist, char *mode, + char **names, char **errs, int n)); +int XPAClientValid _PRx((XPA xpa)); +void XPASaveJmp _PRx((void *env)); + + +/* acl.c */ +int XPAReceiveAcl _PRx((void *client_data, void *call_data, + char *paramlist, char *buf, size_t len)); +int XPASendAcl _PRx((void *client_data, void *call_data, + char *paramlist, char **buf, size_t *len)); +int XPAAclEdit _PRx((char *lbuf)); +int XPAAclAdd _PRx((char *lbuf)); +int XPAAclDel _PRx((XACL acl)); +void XPAAclFree _PRx((void)); +int XPAAclNew _PRx((char *aname, int flag)); +int XPAAclCheck _PRx((XPA xpa, unsigned int ip, char *acl)); +/* port.c */ +int XPAPortEdit _PRx((char *lbuf)); +int XPAPortAdd _PRx((char *lbuf)); +int XPAPortDel _PRx((PORT port)); +void XPAPortFree _PRx((void)); +int XPAPortNew _PRx((char *aname, int flag)); +int XPAPort _PRx((XPA xpa)); +/* remote.c */ +int XPAReceiveRemote _PRx((void *client_data, void *call_data, + char *paramlist, char *buf, size_t len)); +int XPASendRemote _PRx((void *client_data, void *call_data, + char *paramlist, char **buf, size_t *len)); +int XPARemote _PRx((XPA xpa, char *host, char *acl, char *mode)); +/* clipboard.c */ +int XPAReceiveClipboard _PRx((void *client_data, void *call_data, + char *paramlist, char *buf, size_t len)); +int XPASendClipboard _PRx((void *client_data, void *call_data, + char *paramlist, char **buf, size_t *len)); +int ClipBoardFree _PRx((XPA xpa, XPAClip clip)); +/* xt.c */ +int XPAXtAddInput _PRx((void *app, XPA xpa)); +/* tcl.c */ +int XPATclAddInput _PRx((XPA xpa)); +int Tclxpa_Init _PRx((void *vinterp)); +/* gtkloop.c */ +int XPAGtkAddInput _PRx((XPA xpa)); +/* xpaio.c */ +int XPAGets _PRx((XPA xpa, int fd, char *buf, int len, int timeout)); +int XPAPuts _PRx((XPA xpa, int fd, char *buf, int timeout)); +int XPAGetBuf _PRx((XPA xpa, int fd, char **buf, size_t *len, int timeout)); +int XPAPutBuf _PRx((XPA xpa, int fd, char *buf, size_t len, int timeout)); +int XPAIOCallsXPA _PRx((int flag)); +char *XPALevelSpaces _PRx((void)); +void XPALevelSet _PRx((int lev)); +int XPALevelGet _PRx((void)); + +_PRend + +#endif /* __xpa.h */ |