blob: 591401cf1dc594e7afa118847bd40025e18c1033 [file] [log] [blame]
/****************************************************************************
* *
* 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