summaryrefslogtreecommitdiff
path: root/include/tet_api.h
blob: 1f70e287a71ed62edb595bf5d1d0060159432124 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
/*
 *	SCCS: @(#)tet_api.h	1.28 (98/08/28)
 *
 *	UniSoft Ltd., London, England
 *
 * (C) Copyright 1996 X/Open Company Limited
 *
 * All rights reserved.  No part of this source code may be reproduced,
 * stored in a retrieval system, or transmitted, in any form or by any
 * means, electronic, mechanical, photocopying, recording or otherwise,
 * except as stated in the end-user licence agreement, without the prior
 * permission of the copyright owners.
 * A copy of the end-user licence agreement is contained in the file
 * Licence which accompanies this distribution.
 * 
 * X/Open and the 'X' symbol are trademarks of X/Open Company Limited in
 * the UK and other countries.
 */

/*
 * Copyright 1990 Open Software Foundation (OSF)
 * Copyright 1990 Unix International (UI)
 * Copyright 1990 X/Open Company Limited (X/Open)
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose and without fee is hereby granted, provided
 * that the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of OSF, UI or X/Open not be used in 
 * advertising or publicity pertaining to distribution of the software 
 * without specific, written prior permission.  OSF, UI and X/Open make 
 * no representations about the suitability of this software for any purpose.  
 * It is provided "as is" without express or implied warranty.
 *
 * OSF, UI and X/Open DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 
 * EVENT SHALL OSF, UI or X/Open BE LIABLE FOR ANY SPECIAL, INDIRECT OR 
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 
 * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 
 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 
 * PERFORMANCE OF THIS SOFTWARE.
 */

/************************************************************************

SCCS:   	@(#)tet_api.h	1.28 98/08/28 TETware release 3.3
NAME:		'C' API header
PRODUCT:	TETware
AUTHOR:		Geoff Clare, UniSoft Ltd.
DATE CREATED:	23 July 1990
CONTENTS:

	struct tet_testlist definition
	result code values for use with tet_result()
	TET_NULLFP null function pointer for use with tet_fork()
	declarations/prototypes for all API interfaces

MODIFICATIONS:

	Geoff Clare, UniSoft Ltd., 10 Oct 1990
		Remove const keywords.

	Geoff Clare, UniSoft Ltd., 18 Oct 1990
		Add tet_pname.

	Geoff Clare, UniSoft Ltd., 28 Nov 1990
		Add tet_nosigreset.

	Geoff Clare, UniSoft Ltd., 21 June 1991
		Make tet_fork() prototype consistent with definition.

	DTET development - this file is derived from TET Release 1.10
	David G. Sawyer
	John-Paul Leyland
	UniSoft Ltd, June 1992

	Andrew Dingwall, UniSoft Ltd., October 1992
	Added DTET API function declarations.

	Denis McConalogue, UniSoft Limited, September 1993
	changed prototype for tet_sync()

	Andrew Dingwall, UniSoft Ltd., February 1994
	removed comment from #include line (for strict ANSI compliance?)

	Andrew Dingwall, UniSoft Ltd., October 1994
	added support for tet_msync() API function

	Geoff Clare, UniSoft Ltd., July 1996
	Changes for TETWare.

	Geoff Clare, UniSoft Ltd., Sept 1996
	Changes for TETWare-Lite and POSIX threads.

	Andrew Dingwall, UniSoft Ltd., June 1997
	changes to support the defined test case interface

	Geoff Clare, UniSoft Ltd., June 1997
	Changes for NT threads.

	Andrew Dingwall, UniSoft Ltd., December 1997
	protect against multiple inclusion

	Andrew Dingwall, UniSoft Ltd., August 1998
	Added support for shared libraries.

************************************************************************/

#ifndef TET_API_H_INCLUDED
#define TET_API_H_INCLUDED

#ifdef __cplusplus
extern "C" {
#endif


/*
** support for shared API libraries on Win32 systems
*/


   /* not using a shared API library on a Win32 system */
#  ifndef TET_IMPORT
#    define TET_IMPORT
#  endif


#ifndef TET_EXPORT
#  define TET_EXPORT
#endif

/*
** TET_EXPORT_DATA is used to declare a data item that is exported from
** a program to a shared library.
** TET_IMPORT_DATA, TET_IMPORT_ARRAY, TET_IMPORT_FUNC and TET_IMPORT_FUNC_PTR
** are used to declare a data item, array, function or function pointer that
** is imported by a program from a shared library.
** Definitions used when compiling TETware source files appear in dtmac.h.
** These definitions are sufficient for user-level code.
*/
#ifndef TET_EXPORT_DATA
#  define TET_EXPORT_DATA(TYPE, NAME) \
	TET_EXPORT extern TYPE NAME
#endif
#ifndef TET_IMPORT_DATA
#  define TET_IMPORT_DATA(TYPE, NAME) \
	TET_IMPORT extern TYPE NAME
#endif
#ifndef TET_IMPORT_ARRAY
#  define TET_IMPORT_ARRAY(TYPE, NAME, DIM) \
	TET_IMPORT extern TYPE NAME DIM
#endif
#ifndef TET_IMPORT_FUNC
#  define TET_IMPORT_FUNC(TYPE, NAME, ARGS) \
	TET_IMPORT extern TYPE NAME ARGS
#endif
#ifndef TET_IMPORT_FUNC_PTR
#  define TET_IMPORT_FUNC_PTR(TYPE, NAME, ARGS) \
	TET_IMPORT extern TYPE (*NAME) ARGS
#endif

/* the following are needed for types used in declarations */
#include <sys/types.h>
#define TET_PID_T_DEFINED
#if defined(__STDC__) || defined(__cplusplus) || defined(_WIN32)
#  include <time.h>
#  include <stdarg.h>
#endif
#ifdef TET_POSIX_THREADS
#  include <pthread.h>
#else /* !TET_POSIX_THREADS */
#  ifdef TET_THREADS
#    ifndef _WIN32
#      include <thread.h>
#    endif
#  endif /* TET_THREADS */
#endif /* !TET_POSIX_THREADS */


/* values of the standard result codes - may be passed to tet_result() */
#define TET_PASS	0
#define TET_FAIL	1
#define TET_UNRESOLVED	2
#define TET_NOTINUSE	3
#define TET_UNSUPPORTED	4
#define TET_UNTESTED	5
#define TET_UNINITIATED	6
#define TET_NORESULT	7


/* values of the standard exit codes */
#define TET_EXIT_SUCCESS    0
#define TET_EXIT_FAILURE	1
#define TET_EXIT_SKIP	    77  /* automake defined skip code */


/* tet_errno values, may be used to index into tet_errlist[] */
#define TET_ER_OK		0	/* ok  success */
#define TET_ER_ERR		1	/* general error code */
#define TET_ER_MAGIC		2	/* bad magic number */
#define TET_ER_LOGON		3	/* not logged on */
#define TET_ER_RCVERR		4	/* receive message error */
#define TET_ER_REQ		5	/* unknown request code */
#define TET_ER_TIMEDOUT		6	/* request timed out */
#define TET_ER_DUPS		7	/* request contained duplicate IDs */
#define TET_ER_SYNCERR		8	/* sync completed unsuccessfully */
#define TET_ER_INVAL		9	/* invalid request parameter */
#define TET_ER_TRACE		10	/* tracing not configured */
#define TET_ER_WAIT		11	/* process not terminated */
#define TET_ER_XRID		12	/* bad xrid in xresd request */
#define TET_ER_SNID		13	/* bad snid in syncd request */
#define TET_ER_SYSID		14	/* sysid not in system name list */
#define TET_ER_INPROGRESS	15	/* event in progress */
#define TET_ER_DONE		16	/* event finished or already happened */
#define TET_ER_CONTEXT		17	/* request out of context */
#define TET_ER_PERM		18	/* priv request/kill error */
#define TET_ER_FORK		19	/* can't fork */
#define TET_ER_NOENT		20	/* no such file or directory */
#define TET_ER_PID		21	/* no such process */
#define TET_ER_SIGNUM		22	/* bad signal number */
#define TET_ER_FID		23	/* bad file id */
#define TET_ER_INTERN		24	/* server internal error */
#define TET_ER_ABORT		25	/* abort TCM on TP end */
#define TET_ER_2BIG		26	/* argument list too long */


/*
**	function prototype macros
*/

#if defined(__STDC__) || defined(__cplusplus) || defined(_WIN32)
#  ifndef TET_PROTOTYPES
#    define TET_PROTOTYPES
#  endif
#endif

#ifdef TET_PROTOTYPES
#  define TET_PROTOLIST(list)	list
#else
#  define TET_PROTOLIST(list)	()
#endif

#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 205)
# define TET_NORETURN __attribute__((noreturn))
#else
# define TET_NORETURN
#endif /* GNUC */


/* NULL function pointer - may be used as an argument to tet_fork() */
#define TET_NULLFP	((void (*) ()) 0)


#ifndef TET_LITE /* -START-LITE-CUT- */

   /*
   ** sync requests and sync error reporting
   */

   /* structure used in tet_msync() and tet_remsync() calls */
   struct tet_synmsg {
   	char *tsm_data;	/* ptr to sync message data buffer */
   	int tsm_dlen;	/* no of bytes in sm_data */
   	int tsm_sysid;	/* id of system sending sync message data */
   	int tsm_flags;	/* flags - see below */
   };

   /* values for tsm_flags (a bit field) */
#  define TET_SMSNDMSG	001	/* system is sending message data */
#  define TET_SMRCVMSG	002	/* system is receiving message data */
#  define TET_SMDUP	004	/* more than one system attempted to send */
#  define TET_SMTRUNC	010	/* message data was truncated */

#  define TET_SMMSGMAX	1024	/* maximum size of a tet_msync message -
   				   size must be expressable in 12 bits
   				   (see ST_COUNTMASK in ldst.h) */

   /* sync votes */
#  define TET_SV_YES		1
#  define TET_SV_NO		2

   /* structure of an element in the array describing sync status
      that is passed by the API to the sync error reporting function */
   struct tet_syncstat {
   	int tsy_sysid;	/* system ID */
   	int tsy_state;	/* sync state */
   };

   /* values for tsy_state */
#  define TET_SS_NOTSYNCED	1	/* sync request not received */
#  define TET_SS_SYNCYES	2	/* system voted YES */
#  define TET_SS_SYNCNO		3	/* system voted NO */
#  define TET_SS_TIMEDOUT	4	/* system timed out */
#  define TET_SS_DEAD		5	/* process exited */


   /* structure of the data item that is filled in by tet_getsysbyid() */
#  define TET_SNAMELEN	32		/* maximum system name length */
   struct tet_sysent {
   	int ts_sysid;			/* system ID */
   	char ts_name[TET_SNAMELEN];	/* system name */
   };

#endif /* -END-LITE-CUT- */


/*
**	declarations of public functions provided by the API
*/

/* functions in TETware-Lite and in Distrubuted TETware */
TET_IMPORT_FUNC(void, tet_delete, TET_PROTOLIST((int, char *)));
TET_NORETURN TET_IMPORT_FUNC(void, tet_exit, TET_PROTOLIST((int)));
TET_IMPORT_FUNC(char *, tet_getvar, TET_PROTOLIST((char *)));
TET_IMPORT_FUNC(void, tet_infoline,  TET_PROTOLIST((char *)));
TET_IMPORT_FUNC(int, tet_kill, TET_PROTOLIST((pid_t, int)));
TET_IMPORT_FUNC(void, tet_logoff, TET_PROTOLIST((void)));
TET_IMPORT_FUNC(int, tet_minfoline, TET_PROTOLIST((char **, int)));
TET_IMPORT_FUNC(int, tet_printf, TET_PROTOLIST((char *, ...)));
TET_IMPORT_FUNC(char *, tet_reason, TET_PROTOLIST((int)));
TET_IMPORT_FUNC(int, tet_remgetlist, TET_PROTOLIST((int **)));
TET_IMPORT_FUNC(int, tet_remgetsys, TET_PROTOLIST((void)));
TET_IMPORT_FUNC(void, tet_result, TET_PROTOLIST((int)));
TET_IMPORT_FUNC(void, tet_setblock, TET_PROTOLIST((void)));
TET_IMPORT_FUNC(void, tet_setcontext, TET_PROTOLIST((void)));
TET_IMPORT_FUNC(pid_t, tet_spawn, TET_PROTOLIST((char *, char **, char **)));
TET_IMPORT_FUNC(int, tet_vprintf, TET_PROTOLIST((char *, va_list)));
TET_IMPORT_FUNC(int, tet_wait, TET_PROTOLIST((pid_t, int *)));
#ifndef _WIN32
   TET_IMPORT_FUNC(int, tet_exec, TET_PROTOLIST((char *, char *[], char *[])));
   TET_IMPORT_FUNC(int, tet_fork,
	TET_PROTOLIST((void (*) TET_PROTOLIST((void)),
	void (*) TET_PROTOLIST((void)), int, int)));
#endif /* !_WIN32 */

/* functions only in Distributed TETware */
#ifndef TET_LITE /* -START-LITE-CUT- */
   TET_IMPORT_FUNC(int, tet_getsysbyid,
	TET_PROTOLIST((int, struct tet_sysent *)));
   TET_IMPORT_FUNC(int, tet_msync,
	TET_PROTOLIST((long, int *, int, struct tet_synmsg *)));
   TET_IMPORT_FUNC(int, tet_remsync,
	TET_PROTOLIST((long, int *, int, int, int, struct tet_synmsg *)));
   TET_IMPORT_FUNC(int, tet_remtime, TET_PROTOLIST((int, time_t *)));
   TET_IMPORT_FUNC(int, tet_sync, TET_PROTOLIST((long, int *, int)));
   TET_IMPORT_FUNC(void, tet_syncreport,
	TET_PROTOLIST((long, struct tet_syncstat *, int)));
#  if !defined(TET_THREADS) && !defined(TET_POSIX_THREADS)
     TET_IMPORT_FUNC(int, tet_remexec, TET_PROTOLIST((int, char *, char **)));
     TET_IMPORT_FUNC(int, tet_remkill, TET_PROTOLIST((int)));
     TET_IMPORT_FUNC(int, tet_remwait, TET_PROTOLIST((int, int, int *)));
#  endif /* !THREADS */
#endif /* -END-LITE-CUT- */


/* functions only in the Thread-safe API */
#if defined(TET_THREADS) || defined(TET_POSIX_THREADS)
#  ifdef TET_POSIX_THREADS
     TET_IMPORT_FUNC(int, tet_pthread_create,
	TET_PROTOLIST((pthread_t *, pthread_attr_t *,
	void *(*) TET_PROTOLIST((void *)), void *, int)));
     TET_IMPORT_FUNC(int, tet_pthread_join, TET_PROTOLIST((pthread_t, void **)));
     TET_IMPORT_FUNC(int, tet_pthread_detach, TET_PROTOLIST((pthread_t)));
#  else /* !TET_POSIX_THREADS */
#    ifndef _WIN32	/* -WIN32-CUT-LINE- */
       TET_IMPORT_FUNC(int, tet_thr_create,
	TET_PROTOLIST((void *, size_t, void *(*) TET_PROTOLIST((void *)),
	void *, long, thread_t *, int)));
       TET_IMPORT_FUNC(int, tet_thr_join, TET_PROTOLIST((thread_t, void **)));
#    else		/* -START-WIN32-CUT- */
       TET_IMPORT_FUNC(unsigned long, tet_beginthreadex,
	(void *, unsigned int, unsigned int (__stdcall *) (void *), void *,
	unsigned int, unsigned int *, int));
#    endif		/* -END-WIN32-CUT- */
#  endif /* !TET_POSIX_THREADS */
#  ifndef _WIN32
     TET_IMPORT_FUNC(int, tet_fork1,
	TET_PROTOLIST((void (*) TET_PROTOLIST((void)),
	void (*) TET_PROTOLIST((void)), int, int)));
#  endif /* !_WIN32 */
#endif /* THREADS */

/*
**	declarations of public data items provided by the API
*/

/* the following are imported from the API library */
#if defined(TET_THREADS) || defined(TET_POSIX_THREADS)
#  ifndef _WIN32
#    define tet_child (*tet_thr_child())
     TET_IMPORT_FUNC(pid_t *, tet_thr_child, TET_PROTOLIST((void)));
#  endif /* !_WIN32 */
#  define tet_errno (*tet_thr_errno())
   TET_IMPORT_FUNC(int *, tet_thr_errno, TET_PROTOLIST((void)));
#else /* !THREADS */
#  ifndef _WIN32
     TET_IMPORT_DATA(pid_t, tet_child);
#  endif /* !_WIN32 */
   TET_IMPORT_DATA(int, tet_errno);
#endif /* !THREADS */

TET_IMPORT_ARRAY(char *, tet_errlist, []);
TET_IMPORT_DATA(int, tet_nerr);
#ifndef TET_LITE /* -START-LITE-CUT- */
  TET_IMPORT_FUNC_PTR(void, tet_syncerr,
	TET_PROTOLIST((long, struct tet_syncstat *, int)));
#endif /* -END-LITE-CUT- */

/* the following are in the TCM */
extern int tet_nosigreset;

/* the following are in the TCM and must be "exported" to the API library */
TET_EXPORT_DATA(char *, tet_pname);
TET_EXPORT_DATA(int, tet_thistest);


/*
**	definitions used by the interface between the TCM and the test case
**
**	these items must be provided by the user
*/

/* the test case startup and cleanup functions */
extern void (*tet_startup)();
extern void (*tet_cleanup)();

/* and EITHER this data structure */
struct tet_testlist {
	void (*testfunc)();
	int icref;
};
extern struct tet_testlist tet_testlist[];

/* OR all of these test case interface functions */
extern int tet_getmaxic TET_PROTOLIST((void));
extern int tet_getminic TET_PROTOLIST((void));
extern int tet_gettestnum TET_PROTOLIST((int, int));
extern int tet_gettpcount TET_PROTOLIST((int));
extern int tet_invoketp TET_PROTOLIST((int, int));
extern int tet_isdefic TET_PROTOLIST((int));


/*
**	definition of the interface between an executed program and the
**	child process controller
**
**	this item must be provided by the user
*/

extern int tet_main TET_PROTOLIST((int, char *[]));


#ifdef __cplusplus
}
#endif

#endif /* TET_API_H_INCLUDED */