summaryrefslogtreecommitdiff
path: root/src/tet3/apilib/remwait.c
blob: c4e77e4e668a506865b628a7f79b4835dbe9c57a (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
/*
 *      SCCS:  @(#)remwait.c	1.11 (97/07/23) 
 *
 *	UniSoft Ltd., London, England
 *
 * (C) Copyright 1992 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.
 *
 * X/Open and the 'X' symbol are trademarks of X/Open Company Limited in
 * the UK and other countries.
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

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

SCCS:   	@(#)remwait.c	1.11 97/07/23 TETware release 3.3
NAME:		remwait.c
PRODUCT:	TETware
AUTHOR:		Andrew Dingwall, UniSoft Ltd.
DATE CREATED:	April 1992

SYNOPSIS:
	#include "tet_api.h"
	int tet_remwait(int remoteid, int waittime, int *statloc);

DESCRIPTION:
	DTET API function

	wait for process started by tet_remexec()
	return 0 if successful or -1 on error
	if successful, the exit status of the remote process is returned
	indirectly through *statloc

MODIFICATIONS:
	Andrew Dingwall, UniSoft Ltd., December 1993
	changed dapi.h to dtet2/tet_api.h

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

	Geoff Clare, UniSoft Ltd., Sept 1996
	Make rtab updates signal safe.
	Changes for TETWare-Lite.

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

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

#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include "dtmac.h"
#include "tet_api.h"
#include "dtmsg.h"
#include "ptab.h"
#include "rtab.h"
#include "valmsg.h"
#include "servlib.h"
#include "dtetlib.h"
#include "sigsafe.h"

int tet_remwait(remoteid, waittime, statloc)
int remoteid, waittime, *statloc;
{
	register struct rtab *rp;
	register int rc;
	TET_SIGSAFE_DEF

	/* see if the process was started by tet_remexec() */
	if ((rp = tet_rtfind(remoteid)) == (struct rtab *) 0) {
		errno = EINVAL;
		tet_errno = TET_ER_INVAL;
		return(-1);
	}

	/* see if the process has already been waited for */
	if (rp->rt_pid < 0L) {
		errno = ECHILD;
		tet_errno = TET_ER_PID;
		return(-1);
	}

	/* do the remote wait operation and handle the reply code */

	TET_SIGSAFE_START;

	if (tet_tcwait(rp->rt_sysid, rp->rt_pid, waittime, statloc) < 0)
	{
		rc = -1;
		tet_errno = -tet_tcerrno;
		switch (tet_tcerrno) {
		case ER_WAIT:
		case ER_TIMEDOUT:
			errno = EAGAIN;
			break;
		case ER_EINTR:
			errno = EINTR;
			break;
		case ER_PID:
			errno = ECHILD;
			/* show the process as no longer running */
			rp->rt_pid = -1L;
			break;
		default:
			errno = EIO;
			/* show the process as no longer running */
			rp->rt_pid = -1L;
			break;
		}
	}
	else
	{
		rc = 0;
		/* show the process as no longer running */
		rp->rt_pid = -1L;
	}

	TET_SIGSAFE_END;

	return(rc);
}

#else /* -END-LITE-CUT- */

/* avoid "empty" file */
int tet_remwait_not_supported;

#endif /* -LITE-CUT-LINE- */