Ok - so one of the steps in building CDE is an early phase called the includes phase (make includes). At this point, all of the public header files are exported to exports/include/Dt, DtI, ... Then, the software is built using that include dir. This of course does not work in autotools. Much of the software does things like #include <Dt/something.h>, so in order for the build to succeed, this behavior must be represented/replicated in some way. It seems the usual way of dealing with this is to place all public headers (and in some projects, ALL headers) into a toplevel include directory. We now do this for all public headers - they have been moved from wherever they were and placed in the appropriate spot in includes/ This will break the Imake 'make includes' phase unless the Imakefiles are fixed (remove the HEADERS = stuff, and the incdir defines). This has not been done at this point since in reality, once autotools works properly, there will be no need for the Imake stuff anymore, and I intend to get rid of it. This is just a warning for now - Imake builds in this tree will now fail at the 'includes' stage. This commit is only the migration. In upcoming commits, libtt will be fixed so that the hack being used before to get around this problem is removed as there will no longer be any need. And then the autotools work continues...
298 lines
12 KiB
C
298 lines
12 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these libraries and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/*
|
|
* File: spc-proto.h $XConsortium: spc-proto.h /main/3 1995/10/26 15:43:39 rswiston $
|
|
* Language: C
|
|
*
|
|
* (c) Copyright 1988, Hewlett-Packard Company, all rights reserved.
|
|
*
|
|
* (c) Copyright 1993, 1994 Hewlett-Packard Company *
|
|
* (c) Copyright 1993, 1994 International Business Machines Corp. *
|
|
* (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
|
|
* (c) Copyright 1993, 1994 Novell, Inc. *
|
|
*/
|
|
|
|
#ifndef _spc_proto_h
|
|
#define _spc_proto_h
|
|
|
|
/*
|
|
* Commands which are known to spcd and clients
|
|
*/
|
|
|
|
/* The internet service */
|
|
|
|
#define SPC_SERVICE (XeString)"dtspc" /* The name of the registered service */
|
|
#define SPC_PROTOCOL (XeString)"tcp" /* The name of the registered protocol */
|
|
|
|
/* MUST be a DECIMAL number as "%d" */
|
|
#define SPC_PROTOCOL_VERSION_CDE_BASE 1000
|
|
#define SPC_PROTOCOL_VERSION SPC_PROTOCOL_VERSION_CDE_BASE
|
|
/* is used to read the string version */
|
|
#define SPC_PROTOCOL_VERSION_CDE_BASE_STR "1000"
|
|
#define SPC_PROTOCOL_VERSION_STR SPC_PROTOCOL_VERSION_CDE_BASE_STR
|
|
|
|
/* We could make this user config for old domain systems? */
|
|
#define SPC_UNKNOWN_HOSTINFO_STR "HP-UX:7.0:*"
|
|
/*
|
|
**
|
|
** Pseudo-filenames used for validating user
|
|
**
|
|
*/
|
|
|
|
#define PASSED_FILE_NAME (XeString)"<!passed>!"
|
|
#define FAILED_FILE_NAME (XeString)"<!failed>!"
|
|
|
|
/*
|
|
*** Protocol command numbers. These MUST remain in the same order
|
|
*** to work with previous version of the spcd
|
|
*/
|
|
|
|
/* Connections to the server */
|
|
|
|
#define APPLICATION_DATA 0 /* send data to subprocess */
|
|
#define APPLICATION_STDOUT 1 /* data from subprocess */
|
|
#define APPLICATION_STDERR 2 /* error messages from subprocess */
|
|
|
|
#define ABORT 3 /* Client aborted */
|
|
#define REGISTER 4 /* Register client */
|
|
#define UNREGISTER 5 /* Unregister client */
|
|
|
|
/* Channel requests */
|
|
|
|
#define CHANNEL_OPEN 6 /* enable this channel for read/write */
|
|
#define CHANNEL_CLOSE 7 /* no more i/o to this channel (send EOF) */
|
|
#define CHANNEL_RESET 8 /* reset this channel */
|
|
#define CHANNEL_ATTACH 9 /* attach PTY device to this channel */
|
|
|
|
/* Application messages, client -> server */
|
|
|
|
#define APPLICATION_SPAWN 10 /* start up subprocess */
|
|
#define APPLICATION_SIGNAL 11 /* send signal to subprocess */
|
|
|
|
/* application messages, server -> client */
|
|
|
|
#define APPLICATION_DIED 12 /* sent when subprocess dies */
|
|
|
|
#define SERVER_ERROR 13 /* server has detected an error */
|
|
#define REPLY 14
|
|
#define SERVER_DEBUG 15
|
|
#define ENVIRON_RESET 16
|
|
|
|
/* Query / reply protocols, client -> server -> client */
|
|
|
|
#define QUERY_DEVICES 17
|
|
#define DEVICE_REPLY 18
|
|
|
|
#define QUERY_LOGFILE 19
|
|
#define LOGFILE_REPLY 20
|
|
|
|
/* Application messages, client -> server */
|
|
|
|
#define DELETE_LOGFILE 21
|
|
|
|
#define RESET_TERMIO 22 /* This is obsolete, (hpux binary version) */
|
|
#define RESET_TERMIOS 23
|
|
|
|
/* New B.00 protocol requests */
|
|
|
|
#define CHANNEL_SEND_EOF 24 /* Send EOF to standard input of sub process */
|
|
#define CHANNEL_TERMIOS 25 /* Send termios info for a particular pty */
|
|
#define APP_B00_SPAWN 26 /* Enhanced spawn */
|
|
|
|
#define NREQS 27 /* total number of requests. If
|
|
any are added, this should constant
|
|
should reflect the new total */
|
|
|
|
#define PROT_TO_CONNECTOR(a) a
|
|
#define CONNECTOR_TO_PROT(a) a
|
|
|
|
#define PDRP(_pdata) _pdata->data+REQUEST_HEADER_LENGTH
|
|
|
|
#define WRITE_INT(pdata, val)\
|
|
sprintf_len(PDRP(pdata), (XeString)"%x", val)
|
|
#define READ_INT(pdata, val) sscanf(PDRP(pdata), (XeString)"%x", &val)
|
|
|
|
#define WRITE_STRING(pdata, name)\
|
|
sprintf_len(PDRP(pdata), (XeString)"%s", name)
|
|
#define READ_STRING(pdata, name) sscanf(PDRP(pdata), (XeString)"%s", name)
|
|
#define READ_STRING_NO_COPY(pdata, name) (name = PDRP(pdata))
|
|
|
|
#define WRITE_ABORT WRITE_INT
|
|
#define READ_ABORT READ_INT
|
|
|
|
#define WRITE_OPEN WRITE_INT
|
|
#define READ_OPEN READ_INT
|
|
|
|
#define WRITE_ATTACH WRITE_INT
|
|
#define READ_ATTACH READ_INT
|
|
|
|
#define WRITE_APPLICATION_DIED WRITE_INT
|
|
#define READ_APPLICATION_DIED READ_INT
|
|
|
|
#define WRITE_DEBUG WRITE_STRING
|
|
#define READ_DEBUG READ_STRING
|
|
|
|
#define WRITE_ERROR WRITE_INT
|
|
#define READ_ERROR READ_INT
|
|
|
|
#define WRITE_REGISTER(pdata, name, passwd, proto_ver, hostinfo)\
|
|
sprint_register_data(PDRP(pdata), name, passwd, proto_ver, hostinfo)
|
|
|
|
#define READ_REGISTER(pdata, name, passwd, proto_rev, hostinfo)\
|
|
sscan_register_data(PDRP(pdata), &name, &passwd, &proto_rev, &hostinfo)
|
|
|
|
#define WRITE_REPLY(pdata, val, err)\
|
|
sprintf_len(PDRP(pdata), (XeString)"%x %x", val, err)
|
|
#define READ_REPLY(pdata, val, err)\
|
|
sscanf(PDRP(pdata), (XeString)"%x %x", &val, &err)
|
|
|
|
#define WRITE_DEVICE_REPLY(pdata, m0, s0, m1, s1, m2, s2) \
|
|
sprint_device_data(PDRP(pdata), m0, s0, m1, s1, m2, s2)
|
|
#define READ_DEVICE_REPLY(pdata, m0, s0, m1, s1, m2, s2) \
|
|
sscan_device_data(PDRP(pdata), m0, s0, m1, s1, m2, s2)
|
|
|
|
#define WRITE_LOGFILE_REPLY(pdata, logfile, proto_ver, hostinfo) \
|
|
sprint_logfile_data(PDRP(pdata), logfile, proto_ver, hostinfo)
|
|
#define READ_LOGFILE_REPLY(pdata, logfile, proto_ver, hostinfo) \
|
|
sscan_logfile_data(PDRP(pdata), logfile, proto_ver, hostinfo)
|
|
|
|
#define WRITE_APPLICATION_SPAWN(pdata, path, dir, argv, envp) \
|
|
sprint_application_data(PDRP(pdata), (XeString)"%s %d %d ", \
|
|
path, dir, argv, envp, REQUEST_HEADER_LENGTH)
|
|
#define READ_APPLICATION_SPAWN(pdata, path, dir, argv, envp) \
|
|
sscan_application_data(PDRP(pdata), (XeString)"%s %d %d ", \
|
|
&path, &dir, &argv, &envp, REQUEST_HEADER_LENGTH)
|
|
|
|
#define WRITE_ENVIRON_RESET(pdata, numenv) \
|
|
sprintf_len(PDRP(pdata), (XeString)"%d ", numenv)
|
|
#define READ_ENVIRON_RESET(pdata, numenv) \
|
|
sscanf(PDRP(pdata), (XeString)"%d ", &numenv)
|
|
|
|
#define WRITE_APP_DATA(pdata, buffer, len) \
|
|
(memcpy(PDRP(pdata), buffer, len), len)
|
|
|
|
/* New B.00 protocol requests */
|
|
#define WRITE_TERMIOS(pdata, connector, side, buffer) \
|
|
sprintf_len(PDRP(pdata), (XeString)"%d %d %s", connector, side, buffer)
|
|
#define READ_TERMIOS(pdata, connector, side, buffer) \
|
|
sscanf(PDRP(pdata), (XeString)"%d %d %s", &connector, &side, buffer)
|
|
|
|
/* Writing a header is special, as we don't want to be offset by
|
|
REQUEST_HEADER_LENGTH */
|
|
|
|
#define WRITE_HEADER(pdata, cid, type, len, seq) \
|
|
sprintf_len(pdata->data, (XeString)"%08x%02x%04x%04x", cid, type, len, seq)
|
|
#define READ_HEADER(pdata, cid, type, len, seq) \
|
|
sscanf(pdata->data, (XeString)"%8x%2x%4x%4x", cid, type, len, seq)
|
|
|
|
#define min(a, b) (((a) < (b)) ? (a) : (b))
|
|
|
|
/*
|
|
**
|
|
** The test here is reversed, that is, we check only for those
|
|
** requests where there is no reply expected, and assume the other
|
|
** ones do expect replies.
|
|
**
|
|
*/
|
|
|
|
#define NO_REPLY_VAL (-1)
|
|
|
|
#define REPLY_EXPECTED(a, retval) \
|
|
(((a==REPLY) || \
|
|
(a==APPLICATION_DATA) || \
|
|
(a==APPLICATION_STDOUT) || \
|
|
(a==APPLICATION_STDERR) || \
|
|
(a==REGISTER) || \
|
|
(a==QUERY_LOGFILE) || \
|
|
(a==QUERY_DEVICES) || \
|
|
(a==ABORT) || \
|
|
(a==SERVER_ERROR) \
|
|
) ? NO_REPLY_VAL : retval)
|
|
|
|
typedef struct _prot_request {
|
|
buffered_data_ptr dataptr;
|
|
int seqno;
|
|
int request_type;
|
|
SPC_Channel_Ptr channel;
|
|
struct _prot_request *next;
|
|
} protocol_request, *protocol_request_ptr;
|
|
|
|
typedef int (*protocol_request_handler)(protocol_request_ptr);
|
|
|
|
/* spc-proto.c */
|
|
buffered_data_ptr SPC_New_Buffered_Data_Ptr (void);
|
|
void SPC_Reset_Protocol_Ptr (protocol_request_ptr prot, SPC_Channel_Ptr channel, XeChar req, int len);
|
|
protocol_request_ptr SPC_New_Protocol_Ptr (SPC_Channel_Ptr channel, XeChar req, int len);
|
|
void SPC_Free_Protocol_Ptr (protocol_request_ptr prot);
|
|
SPC_Channel_Ptr SPC_Lookup_Channel (int cid, SPC_Connection_Ptr connection);
|
|
SPC_Connection_Ptr SPC_Alloc_Connection (void);
|
|
SPC_Connection_Ptr SPC_Lookup_Connection (XeString hostname);
|
|
SPC_Connection_Ptr SPC_Lookup_Connection_Fd (int fd);
|
|
SPC_Connection_Ptr SPC_Make_Connection (XeString hostname);
|
|
void SPC_Add_Connection (SPC_Connection_Ptr connection);
|
|
void SPC_Close_Connection (SPC_Connection_Ptr connection);
|
|
int SPC_Read_Chars (SPC_Connection_Ptr connection, int request_len, XeString charptr);
|
|
int SPC_Write_Chars (int fd, XeString charptr, int request_len);
|
|
protocol_request_ptr SPC_Read_Protocol (SPC_Connection_Ptr connection);
|
|
protocol_request_ptr SPC_Filter_Connection (SPC_Connection_Ptr connection, SPC_Channel_Ptr channel, int reqtype, int deletep);
|
|
void SPC_Flush_Queued_Data (SPC_Channel_Ptr channel);
|
|
int SPC_Read_Remote_Data (SPC_Channel_Ptr channel, int connector, XeString client_buffer, int nbytes);
|
|
int print_protocol_request (XeString name, protocol_request_ptr proto);
|
|
int SPC_Write_Protocol_Request (SPC_Connection_Ptr connection, SPC_Channel_Ptr channel, int request, ...);
|
|
int SPC_Write_Single_Prot_Request (SPC_Connection_Ptr connection, XeString name, protocol_request_ptr prot);
|
|
int SPC_Waitfor_Reply (SPC_Connection_Ptr connection, SPC_Channel_Ptr channel, int seqno);
|
|
int SPC_Dispatch_Protocol (protocol_request_ptr proto, protocol_request_handler *);
|
|
int SPC_Write_Reply (SPC_Connection_Ptr conn, protocol_request_ptr proto, int retval, int errval);
|
|
int SPC_Send_Environ (SPC_Connection_Ptr connection, protocol_request_ptr prot);
|
|
int sprint_counted_string (XeString buf, int count, XeString *vect, int limit);
|
|
XeString *sscan_counted_string (XeString buf, XeString *newbuf);
|
|
int sprint_application_data (XeString buf, XeString fmt, XeString path, XeString dir, XeString *argv, XeString *envp, int chars_used);
|
|
int sscan_application_data (XeString buf, XeString fmt, XeString *path, XeString *dir, XeString **argv, XeString **envp, int offset);
|
|
int sprint_device_data (XeString buf, XeString m0, XeString s0, XeString m1, XeString s1, XeString m2, XeString s2);
|
|
int sscan_device_data (XeString buf, XeString *m0, XeString *s0, XeString *m1, XeString *s1, XeString *m2, XeString *s2);
|
|
int sprint_logfile_data (XeString buf, XeString logfile, XeString proto_ver, XeString hostinfo);
|
|
int sscan_logfile_data (XeString buf, XeString *logfile, XeString *proto_ver, XeString *hostinfo);
|
|
int sprint_register_data (XeString buf, XeString username, XeString passwd, XeString proto_ver, XeString hostinfo);
|
|
int sscan_register_data (XeString buf, XeString *username, XeString *passwd, XeString *proto_ver, XeString *hostinfo);
|
|
int SPC_Query_Devices (SPC_Channel_Ptr channel);
|
|
int SPC_Query_Logfile (SPC_Channel_Ptr channel);
|
|
int SPC_Validate_User (XeString hostname, SPC_Connection_Ptr connection);
|
|
int SPC_Get_Termio (protocol_request_ptr prot_request);
|
|
int SPC_Get_Termios (protocol_request_ptr prot_request);
|
|
XeString SPC_LocalHostinfo(void);
|
|
int SPC_Send_Multi_Packet(SPC_Connection_Ptr connection,
|
|
protocol_request_ptr prot,
|
|
char **str_vect,
|
|
int num_str,
|
|
int req,
|
|
XeString name,
|
|
int errid);
|
|
char **SPC_Get_Multi_Packet(SPC_Connection_Ptr connection,
|
|
protocol_request_ptr prot,
|
|
char **out,
|
|
int *outlen,
|
|
int request,
|
|
XeString name);
|
|
|
|
#endif /* _spc_proto_h */
|