241 lines
5.5 KiB
C
241 lines
5.5 KiB
C
/****************************************************************************
|
|
* *
|
|
* GNAT COMPILER COMPONENTS *
|
|
* *
|
|
* E X P E C T *
|
|
* *
|
|
* C Implementation File *
|
|
* *
|
|
* $Revision: 1.1 $
|
|
* *
|
|
* Copyright (C) 2001 Ada Core Technologies, Inc. *
|
|
* *
|
|
* GNAT is free software; you can redistribute it and/or modify it under *
|
|
* terms of the GNU General Public License as published by the Free Soft- *
|
|
* ware Foundation; either version 2, or (at your option) any later ver- *
|
|
* sion. GNAT is distributed in the hope that it will be useful, but WITH- *
|
|
* OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
|
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
|
|
* for more details. You should have received a copy of the GNU General *
|
|
* Public License distributed with GNAT; see file COPYING. If not, write *
|
|
* to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, *
|
|
* MA 02111-1307, USA. *
|
|
* *
|
|
* As a special exception, if you link this file with other files to *
|
|
* produce an executable, this file does not by itself cause the resulting *
|
|
* executable to be covered by the GNU General Public License. This except- *
|
|
* ion does not however invalidate any other reasons why the executable *
|
|
* file might be covered by the GNU Public License. *
|
|
* *
|
|
* GNAT was originally developed by the GNAT team at New York University. *
|
|
* It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). *
|
|
* *
|
|
****************************************************************************/
|
|
|
|
#ifdef __alpha_vxworks
|
|
#include "vxWorks.h"
|
|
#endif
|
|
|
|
#ifdef IN_RTS
|
|
#define POSIX
|
|
#include "tconfig.h"
|
|
#include "tsystem.h"
|
|
#else
|
|
#include "config.h"
|
|
#include "system.h"
|
|
#endif
|
|
|
|
/* This file provides the low level functionalities needed to implement Expect
|
|
capabilities in GNAT.Expect.
|
|
Implementations for unix and windows systems is provided.
|
|
Dummy stubs are also provided for other systems. */
|
|
|
|
#ifdef _AIX
|
|
/* Work around the fact that gcc/cpp does not define "unix" under AiX. */
|
|
#define unix
|
|
#endif
|
|
|
|
#ifdef _WIN32
|
|
|
|
#include <windows.h>
|
|
#include <process.h>
|
|
|
|
/* ??? Provide a no-op for now */
|
|
|
|
void
|
|
kill ()
|
|
{
|
|
}
|
|
|
|
int
|
|
__gnat_expect_fork ()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
__gnat_expect_portable_execvp (cmd, argv)
|
|
char *cmd;
|
|
char *argv[];
|
|
{
|
|
(void) spawnve (_P_NOWAIT, cmd, argv, NULL);
|
|
}
|
|
|
|
int
|
|
__gnat_pipe (fd)
|
|
int *fd;
|
|
{
|
|
HANDLE read, write;
|
|
|
|
CreatePipe (&read, &write, NULL, 0);
|
|
fd[0]=_open_osfhandle (read, 0);
|
|
fd[1]=_open_osfhandle (write, 0);
|
|
return 0; /* always success */
|
|
}
|
|
|
|
int
|
|
__gnat_expect_poll (fd, num_fd, timeout, is_set)
|
|
int *fd;
|
|
int num_fd;
|
|
int timeout;
|
|
int *is_set;
|
|
{
|
|
int i, num;
|
|
DWORD avail;
|
|
HANDLE handles[num_fd];
|
|
|
|
for (i = 0; i < num_fd; i++)
|
|
is_set[i] = 0;
|
|
|
|
for (i = 0; i < num_fd; i++)
|
|
handles[i] = (HANDLE) _get_osfhandle (fd [i]);
|
|
|
|
num = timeout / 10;
|
|
|
|
while (1)
|
|
{
|
|
for (i = 0; i < num_fd; i++)
|
|
{
|
|
if (!PeekNamedPipe (handles [i], NULL, 0, NULL, &avail, NULL))
|
|
return -1;
|
|
|
|
if (avail > 0)
|
|
{
|
|
is_set[i] = 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
if (timeout >= 0 && num == 0)
|
|
return 0;
|
|
|
|
Sleep (10);
|
|
num--;
|
|
}
|
|
}
|
|
|
|
#elif defined (unix)
|
|
|
|
#include <sys/time.h>
|
|
|
|
#ifndef NO_FD_SET
|
|
#define SELECT_MASK fd_set
|
|
#else /* !NO_FD_SET */
|
|
#ifndef _AIX
|
|
typedef long fd_mask;
|
|
#endif /* _AIX */
|
|
#ifdef _IBMR2
|
|
#define SELECT_MASK void
|
|
#else /* !_IBMR2 */
|
|
#define SELECT_MASK int
|
|
#endif /* !_IBMR2 */
|
|
#endif /* !NO_FD_SET */
|
|
|
|
int
|
|
__gnat_pipe (fd)
|
|
int *fd;
|
|
{
|
|
return pipe (fd);
|
|
}
|
|
|
|
int
|
|
__gnat_expect_fork ()
|
|
{
|
|
return fork ();
|
|
}
|
|
|
|
void
|
|
__gnat_expect_portable_execvp (cmd, argv)
|
|
char *cmd;
|
|
char *argv[];
|
|
{
|
|
execvp (cmd, argv);
|
|
}
|
|
|
|
int
|
|
__gnat_expect_poll (fd, num_fd, timeout, is_set)
|
|
int *fd;
|
|
int num_fd;
|
|
int timeout;
|
|
int *is_set;
|
|
{
|
|
struct timeval tv;
|
|
SELECT_MASK rset;
|
|
int max_fd = 0;
|
|
int ready;
|
|
int i;
|
|
|
|
FD_ZERO (&rset);
|
|
|
|
for (i = 0; i < num_fd; i++)
|
|
{
|
|
FD_SET (fd [i], &rset);
|
|
if (fd [i] > max_fd)
|
|
max_fd = fd [i];
|
|
}
|
|
|
|
tv.tv_sec = timeout / 1000;
|
|
tv.tv_usec = (timeout % 1000) * 1000;
|
|
|
|
ready = select (max_fd + 1, &rset, NULL, NULL, timeout == -1 ? NULL : &tv);
|
|
|
|
if (ready > 0)
|
|
for (i = 0; i < num_fd; i++)
|
|
is_set [i] = (FD_ISSET (fd [i], &rset) ? 1 : 0);
|
|
|
|
return ready;
|
|
}
|
|
|
|
#else
|
|
|
|
int
|
|
__gnat_pipe (fd)
|
|
int *fd;
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
int
|
|
__gnat_expect_fork ()
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
void
|
|
__gnat_expect_portable_execvp (cmd, argv)
|
|
char *cmd;
|
|
char *argv[];
|
|
{
|
|
}
|
|
|
|
int
|
|
__gnat_expect_poll (fd, num_fd, timeout, is_set)
|
|
int *fd;
|
|
int num_fd;
|
|
int timeout;
|
|
int *is_set;
|
|
{
|
|
return -1;
|
|
}
|
|
#endif
|